更新

http://www.bootcdn.cn/jquery.pjax/

简介

pjax是一个jQuery插件,使用ajax和pushState技术提供快速的浏览体验与真正的永久链接、网页标题、以及浏览器的后退前进按钮操作。

pjax通过抓取HTML从您的服务器通过Ajax和更换容器页面上的HTML内容会与Ajax。然后更新无需重新加载你的网页的布局或任何资源使用pushstate浏览器的当前URL(JS,CSS),提供了一个快速的外观,全页面加载。但它确实就是Ajax和pushstate。

点击这里查看pushState的浏览器支持情况。

概述

pjax不是全自动的。您需要设置和指定一个包含在您的页面上的元素,当您浏览您的网站时将被替换。

// ------------------------------------------------------------------------------------------------

在ajax请求中,不能更新地址栏,地址栏上的“前进”和“后退”按钮就失效了,带来了另外一种糟糕的用户体验。

解决方案如下:

方案一:使用window. Onhashchange 事件

如下面Html片段,点击不同的连接,在mainPanel中加载不同的页面:

解决方案如下:

<ul class="menu"><li><a href="/home/index#page=1">page1</a></li><li><a href="/home/index#page=2">page2</a></li><li><a href="/home/index#page=3">page3</a></li>
</ul><div id="mainPanel">
</div>

首先写一个方法来获取当前url中指定key的hash值,如下:

<script type="text/javascript">//获取指定key的hash值function getHash(key, url) {var hash;if (!!url) {hash = url.replace(/^.*?[#](.+?)(?:\?.+)?$/, "$1");hash = (hash == url) ? "" : hash;} else {hash = self.location.hash;}hash = "" + hash;hash = hash.replace(/^[?#]/, '');hash = "&" + hash;var val = hash.match(new RegExp("[\&]" + key + "=([^\&]+)", "i"));if (val == null || val.length < 1) {return null;} else {return decodeURIComponent(val[1]);}}</script>

使用onhashchange事件触发ajax请求:
<script type="text/javascript">

到这里工作已经完成了80%,为什么是80%呢,这里面还有一个问题:

当你直接在浏览器(新开的标签页)的地址栏里输入这样的地址:http://localhost:3859/home/index#page=3 或者通过QQ发给你的好友,看到的并不是如你所想的应该是page=3的内容,而是http://localhost:3859/home/index 的内容。原因很简单——页面加载的时候不会触发onhashchange事件。

所以我们要在上面的代码追加一行:

       function loadPanel() {var page = getHash("page");if (page == 1) {$("#mainPanel").load("/home/page1");}if (page == 2) {$("#mainPanel").load("/home/page2");}if (page == 3) {$("#mainPanel").load("/home/page3");}}$(window).bind("hashchange", loadPanel);</script>
$(loadPanel);
//或者
$(function(){ $(window).trigger("hashchange"); });

onhashchange 事件location.hash发生改变的时候触发,可以很好解决AJAX刷新后退/前进键失效的问题,是一个新的事件,

目前chrome ,firefox,Opera,  Safari,IE8及以上版本浏览器都兼容。

其实对于那些死抱着IE6,IE7 不放的用户,咱也没必要给他们提供这样的用户体验。

方案二:使用jQuery.History.js

对于要兼容IE6、IE7的情况,笔者一直使用jquery.history.js 这个插件(http://plugins.jquery.com/history/)。

这个插件它会去判断浏览器是否支持onhashchange事件,如果不支持,就定时(每个100毫秒)循环判断hash有没有变化,从而执行相应处理。

如:

<script src="/Scripts/jquery.history.js" type="text/javascript"></script>
<script type="text/javascript">$(function () {$.history.init(function (hash) {var page = getHash("page");if (page == 1) {$("#mainPanel").load("/home/page1");}if (page == 2) {$("#mainPanel").load("/home/page2");}if (page == 3) {$("#mainPanel").load("/home/page3");}});});
</script>

另外,这个插件已经不再继续更新维护了。

方案三:jquery.ba-hashchange.js

jquery.ba-hashchange.js(http://benalman.com/projects/jquery-hashchange-plugin/)

这个插件的实现原理和jquery.history.js 完全一样。循环间隔为50毫秒。

它overwrite 了window.hashchange事件,使其能够兼容全部浏览器。

使用如下:

<script src="/Scripts/jquery.ba-hashchange.js" type="text/javascript"></script>
<script type="text/javascript">$(window).hashchange(function () {var page = getHash("page");if (page == 1) {$("#mainPanel").load("/home/page1");}if (page == 2) {$("#mainPanel").load("/home/page2");}if (page == 3) {$("#mainPanel").load("/home/page3");}});$(window).hashchange();
</script>

Ajax保留浏览器历史的解决方案

转载于:https://www.cnblogs.com/cssfirefly/p/5175329.html

pjax 历史管理 jQuery.History.js相关推荐

  1. javascript:jquery.history.js使用方法

    javascript:jquery.history.js使用方法 step1:download jquery.history.js step2:create a test page as follow ...

  2. pjax php demo,jQuery pjax 应用简单示例

    pjax 是一个jQuery插件,它使用 ajax 和 pushState 来实现快速的浏览体验,包括真正的固定链接,页面标题和工作返回按钮. ajax缺点是破坏了浏览器的前进后退,因为ajax的请求 ...

  3. html5历史纪录管理,HTML 5 新增方法以及历史管理

    @(HTML5)[HTML5 新增方法] [TOC] 十四. HTML 5 新增方法以及历史管理 新增的获取元素的方法 静态获取的方法: document.querySelector() 选择单个元素 ...

  4. php pjax案例,基于jquery.pjax实现Pjax效果详解

    pjax是对ajax + pushState的封装,ajax大家应该都明白,就是使用xmlhttprequest对象与服务端进行交换数据,pushState是一个可以操作history的api.说白了 ...

  5. jquery.validate.js的使用小结

    2019独角兽企业重金招聘Python工程师标准>>> jquery很好的网站:http://www.runoob.com/jquery/jquery-plugin-validate ...

  6. 商城后台管理系统(EasyUI、jQuery、js、Ajax、Servlet、jsp、mysql、EL,导出订单等)

    文章目录 前言 用到的技术 实现的功能 包文件 后台 前端 页面效果 登录 设计思路 主页面 管理员管理的界面 界面 添加 修改 删除 查询 订单管理 导出 技术展望 尾语 前言 只剩十几天就英语四六 ...

  7. Vuex 数据流管理及Vue.js 服务端渲染(SSR)

    Vuex 数据流管理及Vue.js 服务端渲染(SSR)项目见:https://github.com/smallSix6/fed-e-task-liuhuijun/tree/master/fed-e- ...

  8. matlab 历史命令,Shell history详解:查看历史命令

    Bash 有完善的历史命令,这对于简化管理操作.排查系统错误都有重要的作用,而且使用简单方便,建议大家多使用历史命令.系统保存的历史命令可以使用 history 命令查询,命令格式如下: [root@ ...

  9. 三款改进 Chrome 浏览历史管理的扩展程序

    Google Chrome 提供了非常简便的查看过去访问网站历史的功能,默认情况下这些历史记录按照打开顺序倒序排列.但是如果要在历史记录中搜索先前访问过的网站,就比较困难了.Chrome的历史功能还缺 ...

最新文章

  1. mysql图形化及命令行操作用户权限
  2. LeetCode之All Possible Full Binary Trees(Kotlin)
  3. 第一次用写一个3d轮播
  4. XML解析的三种方式(dom,sax,dom4j)
  5. Unity罗技方向盘接入
  6. mysql注册slave_创建slave库?spm=a2c4e.11155472的搜索结果-阿里云开发者社区
  7. CVPR2021 Oral|只用静态图,实时渲染出丝滑3D效果
  8. video 全屏显示
  9. java读取图片成rgb二维数组
  10. 十年 IT 老兵告诉你如何快速构建可直接落地、基于开源的低成本架构!
  11. mpeg4的解码演示程序
  12. JAVA退房计算价格怎么写,JAVA宾馆客房管理系统报告.doc
  13. 优化三维空间定位法及C语言快捷实现
  14. vue 前端导出xlsx文件
  15. 2019年华为JAVA面试题系列
  16. Git GUI中文乱码解决问题
  17. AJAX框架眼镜穿搭夏天,30度的夏天,男生应该如何穿搭?看这9种时尚组合!
  18. 线性规划(一):基本概念
  19. Android群英传笔记——摘要,概述,新的出发点,温故而知新,可以为师矣!
  20. win10的mysql密码忘记了怎么办_win10忘记mysql密码怎么办

热门文章

  1. switchhosts(本地域名解析)小工具使用
  2. WinForm资源文件使用
  3. .net软件工程师笔试题目
  4. 实验8-SPSS交叉表分析
  5. spring aop代码的增强
  6. bootsrap的font awesome的各种图标,包括动画图标
  7. 一个关于native sql的程序
  8. 路由重分布与分布列表
  9. 翻译:Single Sign-On for Everyone
  10. 【咸鱼教程】基于系统时间的计时器DateTimer(不受FPS影响)