5

AJAX页面状态保持

 2 years ago
source link: https://blogread.cn/it/article/8008?f=hot1
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

AJAX页面状态保持

浏览:974次  出处信息

   传统的页面,浏览器通过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实现这种功能,比如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这个方法,但是不会触发这个事件。可以通过检测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兼容模式下的兼容性问题:不能使用浏览器的前进后退按钮保持追踪,因为这些浏览器并不为锚点的改变创建历史。

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

   参考资料:

   1、http://www.impng.com/web-dev/hashchange-event-and-onhashchange.html

   2、http://beamnote.com/2010/ajax-hash-fragment.html

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习

Recommend

  • 158
    • 掘金 juejin.im 6 years ago
    • Cache

    一篇关于ajax的故事

    前言 我为什么要写这个呢,以前面试的时候问过这些,还有就是我个人来看,学习前端其实闭包啊,原型啊,等等的问题,被写烂了,但是关于数据交互这一块的很少,我们在业务中,数据交互用的并不占少数,整理一篇给大家,也给我自己,希望喜欢的点一个关注GitHub aja...

  • 48
    • www.cocoachina.com 6 years ago
    • Cache

    iOS 保持页面流畅技巧

    产生卡顿的原因: 系统中 CPU、GPU、显示器是以上面这种方式协同工作的。CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传...

  • 9

    StatusCodePagesMiddleware中间件与ExceptionHandlerMiddleware中间件类似,它们都是在后续请求处理过程中“出错”的情况下利用一个错误处理器来接收针对当前请求的处理。它们之间的差异在于对“错误”的认定上:ExceptionHandlerMiddleware中间件所谓的错误就是抛...

  • 7

    WEB应用解决网站404页面返回200状态码问题Jager · 9月8日 · 2018年nginx ·

  • 6
    • www.80shihua.com 3 years ago
    • Cache

    ajax返回的页面中绑定事件

    ajax返回的页面中绑定事件 作者: dreamfly 分类: jquery插件 发布时间: 2016-03-02 12:49 当我们通过ajax返回的值,构造页面或者生成新的元素的时候,默...

  • 8

    前端 Vue路由返回恢复页面状态时间: 2021-07-13阅读: 38标签: 路由分享扫一扫分享

  • 6
    • www.cnblogs.com 2 years ago
    • Cache

    k8s~service负载到pod的状态保持

    nginx或者其它负载均衡软件都有一个能力,就是当客户请求一个网页时,第一次访问的是A服务器,第二次也就会让你访问A服务器,而在k8s里,也有这种机制和能力。 k8s的Session affinity Service同样也支持Session affinity(粘性会话)...

  • 4

    python+selenium+phantomjs抓取ajax动态页面 2014-11-05编程技术 一般情况下,python爬虫遇到aja...

  • 5
    • developer.51cto.com 2 years ago
    • Cache

    Iframe在Vue中的状态保持技术

    Iframe在Vue中的状态保持技术-51CTO.COM Iframe在Vue中的状态保持技术 作者:技数中心陈震 2022-07-05 09:27:35 Iframe可以廉价实现跨应用级的页面共享,并且具有使用简单、高兼容性...

  • 5

    点击查看目录 1. 问题背景 会话保持是七层负载均衡的核心功能之一。对于同一会话的请求或者连接,通过会话保持机制,负载均衡软件会将其路由到同一个后端,以利用局部性原理来提高服务整体的效率。 在传统的 L...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK