AJAX页面状态保持思路详解
传统的页面,浏览器通过url访问页面,页面的内容由后台服务生成页面所有内容再发回给浏览器渲染展示。到AJAX流行的时候,很多信息为AJAX异步请求,比如:点击、翻页等。通常这种情况你一刷新浏览器,当前页面就会重置到初始状态。更不用说把看到的信息url发给好友了。
传统的状态保存在地址栏,如:www.abc.com/search?s=abc&id=23&page=3
如果通过这种方式的话,浏览器会刷新页面,如果使用锚点的话则不会刷新浏览器。具体是点击页面去请求数据的同时会改变地址栏“#”后面的值。我们翻页到第四页
如:abc.com/search#s=abc&id=23&page=4
这样还远远不够,如果用户点击“前进”“后退”,页面内容不会随之改变。之前参照网上别人的做法,用一个定时器来解决的。
/**
*URLWatcher(requirejQuery)
*监测url的变化
*useage:
*UrlWatcher.init(50);
*UrlWatcher.AddListener(function(url,isFirstLoad){
*FrontEngine.generateFront();
*});
*
*/
varUrlWatcher={
"init":function(waittime){
this.UrlArray=[window.location.href];//setcurrenturlasdefault
this.ListenerArray=[];
this.ResetWaitTime(waittime);
},
"AddListener":function(listener){//addaprocessfunction
this.ListenerArray.push(listener||function(){});
},
"DeleteListener":function(){
this.ListenerArray=[];
},
"ResetWaitTime":function(time){//starttimer
if(this.IntervalHandle){window.clearInterval(this.IntervalHandle);}
this.WaitTime=time||1000;
this.IntervalHandle=window.setInterval(this.ListenerCall.setThis(this),this.WaitTime);
},
"ListenerCall":function(){
varself=this,url=window.location.href;
if(self.UrlArray[self.UrlArray.length-1]===url){return;}
window.clearInterval(this.IntervalHandle);
$.each(this.ListenerArray,function(c,listener){
listener(url,self.UrlArray.length===0);
});
this.UrlArray.push(url);
this.ResetWaitTime(this.WaitTime);
}
};
Gmail中也用了状态保持的东西,但是url是不会改变的。目前也有专门的Framework实现这种功能,比如RSH、HistoryFramework。
之前我通过这种定时器的方法,解决了一些问题。但是,通过这种定时的方法不是实时触发的,总会有一个延时,因为是定时去不停的检测url中hash的变化。
说到hash,hash的变化在新的浏览器中是支持监测的。就是haschange这个事件,在html5中有定义。目前,各浏览器对haschange的支持情况如下:
Gecko1.9.2(Firefox3.6/Thunderbird3.1/Fennec1.0)
IE8
WebKit528+(Safari/GoogleChrome)
Opera10.70
只要浏览器版本比以前大的,都是支持的。此外,ie8以ie7模式运行时,window下存在onhashchange这个方法,但是不会触发这个事件。可以通过检测IE的document.documentMode这种方法来检测。
if(('onhashchange'inwindow)&&((typeofdocument.documentMode==='undefined')||document.documentMode==8))
{//浏览器支持onhashchange事件
indow.onhashchange=hashChangeFire;//TODO,对应新的hash执行的操作函数
}
else
{//不支持则用定时器检测的办法
setInterval(function(){
varischanged=isHashChanged();//TODO,检测hash值或其中某一段是否更改的函数
if(ischanged)
{
hashChangeFire();//TODO,对应新的hash执行的操作函数
}
},
150);
}
还是存在ie6/7以及ie8兼容模式下的兼容性问题:不能使用浏览器的前进后退按钮保持追踪,因为这些浏览器并不为锚点的改变创建历史。
要解决这个问题,可以创建一个隐藏的iframe,通过改变iframe的hash控制ie的历史记录,如《jQueryhashchangeevent》。
以上所述是小编给大家介绍的AJAX页面状态保持思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!