ajax 사용시 뒤로가기 버튼을 사용하게 되면 기존에 값을 유지하지 못하는 문제가 발생하는데
그 문제를 해결할만한 코드를 발견하여 남겨 놓는다.
- PDF 화면
- 원문 URL
Ajax.History = {
initialize: function(options) {
this.options = Object.extend({
interval: 200
},options||{});
this.callback = this.options.callback || Prototype.emtpyfunction;
if(navigator.userAgent.toLowerCase().indexOf('msie') > 0)
this.locator = new Ajax.History.Iframe('ajaxHistoryHandler', this.options.iframeSrc);
else
this.locator = new Ajax.History.Hash();
this.currentHash = '';
this.locked = false;
},
add: function(hash) {
this.locked = true;
clearTimeout(this.timer);
this.currentHash = hash;
this.locator.setHash(hash);
this.timer = setTimeout(this.checkHash.bind(this), this.options.interval);
this.locked = false;
},
checkHash: function(){
if(!this.locked){
var check = this.locator.getHash();
if(check != this.currentHash){
this.callback(check);
this.currentHash = check;
}
}
this.timer = setTimeout(this.checkHash.bind(this), this.options.interval);
},
getBookmark: function(){
return this.locator.getBookmark();
}
};
// Hash Handler for IE (Tested with IE6)
Ajax.History.Iframe = Class.create();
Ajax.History.Iframe.prototype = {
initialize: function(id, src) {
this.url = '';
this.id = id || 'ajaxHistoryHandler';
this.src = src || '';
document.write('<iframe src="'+this.src+'" id="'+this.id+'"name="'+this.id+'" style="display: none;" ></iframe>');
},
setHash: function(hash){
try {
$(this.id).setAttribute('src', this.src + '?' + hash);
}catch(e) {}
window.location.href = this.url + '#' + hash;
},
getHash: function(){
try {
return (document.frames[this.id].location.href||'?').split('?')[1];
}catch(e){ return ''; }
},
getBookmark: function(){
try{
return window.location.href.split('#')[1]||'';
}catch(e){ return ''; }
}
};
// Hash Handler for a modern browser (tested with firefox 1.5)
Ajax.History.Hash = Class.create();
Ajax.History.Hash.prototype = {
initialize: function(){
},
setHash: function(hash){
window.location.hash = hash;
},
getHash: function(){
return window.location.hash.substring(1)||'';
},
getBookmark: function(){
try{
return window.location.hash.substring(1)||'';
}catch(e){ return ''; }
}
[사용방법]
위와 같은 코드를 로드한 후 아래처럼 콜백 메서드를 히스토리 핸들러에 Ajax 요청을 보낼 수 있습니다.
var historyUpdate = function(hash) {
new Ajax.Request(
....
}
Prototype의 Ajax.Request 또는 Ajax.Updater를 사용할 때 onSuccess 및 onComplete 메서드에 히스토리를 아래와 같이 추가할 수 있습니다.
var handleSuccess = function(request){
//... update DOM or smth like that
Ajax.History.add(request.options.parameters)
...
}
그리고 페이지 푸터에 아래의 코드를 실행하도록 합니다.
var historyHandler = Ajax.History.initialize({
callback: historyUpdate,
iframeSrc: '_blank.html' // 비어있는 임시 html 페이지 경로
});