ajax前后退功能原理其实比较简单,改变hash值促使浏览器激活前后退按钮。
在IE8以下的浏览器不支持js修改hash,遂增加额外的隐藏iframe,通过修改其src来达到同样的目的。
知道原理后,我们可以很快把它实现。下面介绍一个Jquery插件和一个库RSH
(function($) {
var locationWrapper = {
put: function(hash, win) {
(win || window).location.hash = encodeURIComponent(hash);
},
get: function(win) {
var hash = ((win || window).location.hash).replace(/^#/, '');
return $.browser.mozilla ? hash : decodeURIComponent(hash);
}
};
var iframeWrapper = {
id: "__jQuery_history",
init: function() {
var html = '<iframe id="'+ this.id +'" style="display:none" src="javascript:false;" />';
$("body").prepend(html);
return this;
},
_document: function() {
return $("#"+ this.id)[0].contentWindow.document;
},
put: function(hash) {
var doc = this._document();
doc.open();
doc.close();
locationWrapper.put(hash, doc);
},
get: function() {
return locationWrapper.get(this._document());
}
};
// public base interface
var _ = {
appState: undefined,
callback: undefined,
init: function(callback) {},
check: function() {},
load: function(hash) {}
};
$.history = _;
var SimpleImpl = {
init: function(callback) {
_.callback = callback;
var current_hash = locationWrapper.get();
_.appState = current_hash;
_.callback(current_hash);
setInterval(_.check, 100);
},
check: function() {
var current_hash = locationWrapper.get();
if(current_hash != _.appState) {
_.appState = current_hash;
_.callback(current_hash);
}
},
load: function(hash) {
if(hash != _.appState) {
locationWrapper.put(hash);
_.appState = hash;
_.callback(hash);
}
}
};
var IframeImpl = {
init: function(callback) {
_.callback = callback;
var current_hash = locationWrapper.get();
_.appState = current_hash;
iframeWrapper.init().put(current_hash);
_.callback(current_hash);
setInterval(_.check, 100);
},
check: function() {
var current_hash = iframeWrapper.get();
if(current_hash != _.appState) {
locationWrapper.put(current_hash);
_.appState = current_hash;
_.callback(current_hash);
}
},
load: function(hash) {
if(hash != _.appState) {
locationWrapper.put(hash);
iframeWrapper.put(hash);
_.appState = hash;
_.callback(hash);
}
}
};
if($.browser.msie && ($.browser.version < 8 || document.documentMode < 8)) {
$.extend(_, IframeImpl);
} else {
$.extend(_, SimpleImpl);
}
})(jQuery);
关于RSH,由于他的代码比较多,就不贴出来了,想看源码的可以点击这里下载。RSH对各种浏览器都做了相应的处理,如safari,opara。而且它用隐藏的表单存储hash对应的数据,很方便的缓存数据,在实际运用中前进后退,就不用重新发送ajax去请求数据了。PS:搜狐白社会ajax后退功能好像就用的这个库,掐指算的:)
回复 (0)