欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

AJAX页面状态保持思路详解

程序员文章站 2022-03-14 10:50:29
传统的页面,浏览器通过url访问页面,页面的内容由后台服务生成页面所有内容再发回给浏览器渲染展示。到ajax流行的时候,很多信息为ajax异步请求,比如:点击、翻页等。通常...

传统的页面,浏览器通过url访问页面,页面的内容由后台服务生成页面所有内容再发回给浏览器渲染展示。到ajax流行的时候,很多信息为ajax异步请求,比如:点击、翻页等。通常这种情况你一刷新浏览器,当前页面就会重置到初始状态。更不用说把看到的信息url发给好友了。

传统的状态保存在地址栏,如:

如果通过这种方式的话,浏览器会刷新页面,如果使用锚点的话则不会刷新浏览器。具体是点击页面去请求数据的同时会改变地址栏“#”后面的值。我们翻页到第四页

如: abc.com/search#s=abc&id=23&page=4

这样还远远不够,如果用户点击“前进”“后退”,页面内容不会随之改变。之前参照网上别人的做法,用一个定时器来解决的。

/**
 * url watcher(require jquery)
 * 监测url的变化
 * useage:
 * urlwatcher.init(50);
 * urlwatcher.addlistener(function(url,isfirstload){
 *    frontengine.generatefront();
 * });
 *
 */
var urlwatcher = {
  "init": function (waittime) {
    this.urlarray = [window.location.href];//set current url as default
    this.listenerarray = [];
    this.resetwaittime(waittime);
  },
  "addlistener": function (listener) {//add a process function
    this.listenerarray.push(listener || function () {});
  },
  "deletelistener": function () {
    this.listenerarray = [];
  },
  "resetwaittime": function (time) {//start timer
    if (this.intervalhandle) {window.clearinterval(this.intervalhandle); }
    this.waittime = time || 1000;
    this.intervalhandle = window.setinterval(this.listenercall.setthis(this), this.waittime);
  },
  "listenercall": function () {
    var self = 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实现这种功能,比如 rshhistory framework

之前我通过这种定时器的方法,解决了一些问题。但是,通过这种定时的方法不是实时触发的,总会有一个延时,因为是定时去不停的检测url中hash的变化。

说到hash,hash的变化在新的浏览器中是支持监测的。就是haschange 这个事件,在html5中有定义。目前,各浏览器对haschange的支持情况如下:

gecko 1.9.2 (firefox 3.6/thunderbird 3.1/fennec 1.0)

ie 8

webkit 528+ (safari/google chrome)

opera 10.70

只要浏览器版本比以前大的,都是支持的。此外,ie8以ie7模式运行时,window下存在onhashchange这个方法,但是不会触发这个事件。可以通过 检测iedocument.documentmode 这种方法来检测。

if( ('onhashchange' in window) && ((typeof document.documentmode==='undefined') || document.documentmode==8))
{   // 浏览器支持onhashchange事件   
indow.onhashchange = hashchangefire; // todo,对应新的hash执行的操作函数
} 
else 
{   // 不支持则用定时器检测的办法   
setinterval(function() {     
var ischanged = ishashchanged(); // todo,检测hash值或其中某一段是否更改的函数    
if(ischanged)
{       
hashchangefire(); // todo,对应新的hash执行的操作函数    
}  
},
150);
}

还是存在ie6/7以及ie8兼容模式下的兼容性问题:不能使用浏览器的前进后退按钮保持追踪,因为这些浏览器并不为锚点的改变创建历史。

要解决这个问题,可以创建一个隐藏的iframe,通过改变iframe的hash控制ie的历史记录,如 《jquery hashchange event》 。

以上所述是小编给大家介绍的ajax页面状态保持思路详解,希望对大家有所帮助