Ajax页面状态如何保持?

本文探讨了在使用AJAX技术时如何保持页面状态,包括利用URL hash和监听hash变化的方法,以及不同浏览器的支持情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文和大家分享的主要是ajax页面状态保持相关内容,一起开看看吧,希望对大家 学习ajax 有所帮助。
  传统的页面,浏览器通过url访问页面,页面的内容由后台服务生成页面所有内容再发回给浏览器渲染展示。到AJAX流行的时候,很多信息为AJAX异步请求,比如:点击、翻页等。通常这种情况你一刷新浏览器,当前页面就会重置到初始状态。更不用说把看到的信息url发给好友了。
  传统的状态保存在地址栏,如:  www.abc.com/search?s=abc&id=23&page=3
  如果通过这种方式的话,浏览器会刷新页面,如果使用锚点的话则不会刷新浏览器。具体是点击页面去请求数据的同时会改变地址栏“#”后面的值。我们翻页到第四页
  如: 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实现这种功能,比如 RSH 、 History 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这个方法,但是不会触发这个事件。可以通过 检测IE的document.documentMode 这种方法来检测。
  if( ('onhashchange' in window) && ((typeof document.documentMode==='undefined') || document.documentMode==8)) {     // 浏览器支持onhashchange事件     window.onhashchange = hashChangeFire;  // TODO,对应新的hash执行的操作函数
  } else {     // 不支持则用定时器检测的办法     setInterval(function() {         var ischanged = isHashChanged();  // TODO,检测hash值或其中某一段是否更改的函数         if(ischanged) {             hashChangeFire();  // TODO,对应新的hash执行的操作函数         }     }, 150);
  }
  还是存在ie6/7以及ie8兼容模式下的兼容性问题:不能使用浏览器的前进后退按钮保持追踪,因为这些浏览器并不为锚点的改变创建历史。

来源:IT技术博客大学习
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值