为什么80%的码农都做不了架构师?>>>   

HTML5 新增的历史记录 API 可以实现无刷新更改地址栏链接,配合 AJAX 可以做到无刷新跳转。

简单来说:假设当前页面为renfei.org/,那么执行下面的 JavaScript 语句:

window.history.pushState(null, null, "/profile/");

之后,地址栏的地址就会变成renfei.org/profile/,但同时浏览器不会刷新页面,甚至不会检测目标页面是否存在。

pushState 方法

上面的语句实际上用到了 HTML5 的历史记录 API。这套 API 提供一种「人为操纵」浏览器历史记录的方法。

浏览器历史记录可以看作一个「栈」。栈是一种后进先出的结构,可以把它想象成一摞盘子,用户每点开一个新网页,都会在上面加一个新盘子,叫「入栈」。用户每次点击「后退」按钮都会取走最上面的那个盘子,叫做「出栈」。而每次浏览器显示的自然是最顶端的盘子的内容。

执行pushState函数之后,会往浏览器的历史记录中添加一条新记录,同时改变地址栏的地址内容。它可以接收三个参数,按顺序分别为:

  1. 一个对象或者字符串,用于描述新记录的一些特性。这个参数会被一并添加到历史记录中,以供以后使用。这个参数是开发者根据自己的需要自由给出的。

  2. 一个字符串,代表新页面的标题。当前基本上所有浏览器都会忽略这个参数。

  3. 一个字符串,代表新页面的相对地址。

例如,我们可以这样写:

var state = {id: 2,name: "profile"
};
window.history.pushState(state, "My Profile", "/profile/");

popstate 事件

当用户点击浏览器的「前进」、「后退」按钮时,就会触发popstate事件。你可以监听这一事件,从而作出反应。

window.addEventListener("popstate", function(e) {var state = e.state;     // do something...
});

这里e.state就是当初pushState时传入的第一个参数。例如,在我们的例子中,有:

e.state.id == 2;
e.state.name == "profile";

replaceState 方法

有时,你希望不添加一个新记录,而是替换当前的记录(比如对网站的 landing page),则可以使用replaceState方法。这个方法和pushState的参数完全一样。

应用:全站 AJAX,并使浏览器能够抓取 AJAX 页面

这个可以干啥用?一个比较常用的场景就是,配合 AJAX。

假设一个页面左侧是若干导航链接,右侧是内容,同时导航时只有右侧的内容需要更新,那么刷新整个页面无疑是浪费的。这时我们可以使用 AJAX 来拉取右面的数据。但是如果仅仅这样,地址栏是不会改变的,用户无法前进、后退,也无法收藏当前页面或者把当前页面分享给他人;搜索引擎抓取也有困难。这时,就可以使用 HTML5 的 History API 来解决这个问题。

思路:首先绑定click事件。当用户点击一个链接时,通过preventDefault函数防止默认的行为(页面跳转),同时读取链接的地址(如果有 jQuery,可以写成$(this).attr('href')),把这个地址通过pushState塞入浏览器历史记录中,再利用 AJAX 技术拉取(如果有 jQuery,可以使用$.get方法)这个地址中真正的内容,同时替换当前网页的内容。

为了处理用户前进、后退,我们监听popstate事件。当用户点击前进或后退按钮时,浏览器地址自动被转换成相应的地址,同时popstate事件发生。在事件处理函数中,我们根据当前的地址抓取相应的内容,然后利用 AJAX 拉取这个地址的真正内容,呈现,即可。

最后,整个过程是不会改变页面标题的,可以通过直接对document.title赋值来更改页面标题。

其他说明

URL 的限制

为了安全考虑,新 URL 必须和当前 URL 在同一个域名下。例如,你不能把地址改成 Google 的首页。否则不怀好心的人就可以把地址改成网银等关键网站的地址,来迷惑用户了。

但是,URL 允许使用 query string 的形式。例如:

window.history.pushState(null, null, "?id=1");

在某些情况下可能比较方便。

浏览器兼容性

根据 MDN 提供的信息,IE 10, Chrome 5, Firefox 4, Safari 5 开始支持这个特性。Fallback 可以采用替换 hash 的方法。另外,History.js 库也提供了对老版本浏览器的 history API 支持(同样是利用替换 hash)。为了搜索引擎收录,可能需要使用#!表示法。

转载于:https://my.oschina.net/hicms/blog/548488

HTML5无刷新修改URL:利用 History API 无刷新更改地址栏相关推荐

  1. 快速修改HTML5,HTML5无刷新修改URL(示例代码)

    HTML5新添加了两个api分别是pushState和replaceState,DOM中的window对象通过window.history方法提供了对浏览器历史记录的读取,可以在用户的访问记录中前进和 ...

  2. Php无刷新修改url,history 实现无刷新更改url和页面内容

    在访问google plus 和网易m站时,细心的用户也许会发现页面之间的点击是通过ajax异步请求的,同时页面的URL发生了了改变.并且能够很好的支持浏览器的前进和后退.不禁让人想问,是什么有这么强 ...

  3. JS无刷新修改URL类似博客园翻页效果

    <script type="text/javascript">function changeURL(){var url = document.getElementByI ...

  4. 无刷新跳转—关于history中pushState和replaceState方法详解

    〝 古人学问遗无力,少壮功夫老始成 〞 **关于history中pushState和replaceState方法详解,**常码字不易,出精品更难,没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫 ...

  5. 「前端」History API与浏览器历史堆栈管理

    本文由尚妆前端开发工程师欲休撰写 本文发表于尚妆博客,欢迎订阅! 移动端开发在某些场景中有着特殊需求,如为了提高用户体验和加快响应速度,常常在部分工程采用SPA架构.传统的单页应用基于url的hash ...

  6. popstate_详解HTML5之pushstate、popstate操作history,无刷新改变当前url

    一.认识window.history window.history表示window对象的历史记录,是由用户主动产生,并且接受javascript脚本控制的全局对象.window对象通过history对 ...

  7. 使用ajax和history.pushState无刷新改变页面URL

    HTML5里引用了新的API,history.pushState和history.replaceState,就是通过这个接口做到无刷新改变页面URL的. 与传统的AJAX的区别 传统的ajax有如下的 ...

  8. java局部刷新session过期_Ajax局部页面刷新和History API结合的陷阱

    ajax在现代网站已经得到非常普遍地应用,主要的好处大家都知道(异步加载数据,不用刷新整个浏览器,更小的数据传输尺寸).对于那些老网站或者老项目来说全盘改造成ajax并不现实,于是就有了"局 ...

  9. 大熊君学习html5系列之------History API(SPA单页应用的必备------重构完结版)

    一,开篇分析 Hi,大家好!大熊君又和大家见面了,(*^__^*) 嘻嘻--,这系列文章主要是学习Html5相关的知识点,以学习API知识点为入口,由浅入深的引入实例, 让大家一步一步的体会" ...

最新文章

  1. 0011_练习题d1
  2. iOS 导航栏遮挡问题 --- iOS开发系列 ---项目中成长的知识七
  3. 嵌入式开发之信号采集同步---VSYNC和HSYNC的作用以及它们两者之间的关系
  4. EMR、EHR和PHR的定义与对比
  5. 双11/618,除了能拉升业绩外,还有什么好处?
  6. 七十九、深度和广度优先搜索算法
  7. boost::phoenix::for_each相关的测试程序
  8. ffmpeg推流时与服务器断开后的自动重连功能的实现
  9. excel有的单元文字可以超出单元格_excel单元格斜线
  10. 应用宝认领应用签名_腾讯应用宝认领应用步骤
  11. leetcode python3 简单题160. Intersection of Two Linked Lists
  12. 开课吧python小课学了有用吗-这个神仙技能,让你为所欲为!速来 !
  13. 胡明浩 160809313 (我就会三个)
  14. scala implicit隐式转化与隐式参数
  15. MATLAB基本语法速成
  16. FreeMarker模板引擎实现页面静态化
  17. 华为前端社招OD面试(已拿offer)
  18. 台湾Google云计算计划负责人叶平讲解云计算
  19. c语言加加运算符是什么意思,c语言*p++是什么意思?
  20. 数据库三级填空题(应用题)常考总结

热门文章

  1. 动态规划——入门(1)
  2. mysql怎么实现事务序列化_MySQL 架构 - 事务处理
  3. word doc怎么显示base64图片_win10系统word文档打印不出图片怎么办
  4. linux gcc编译c文件头文件,使用GCC编译器编译C语言
  5. Linux下Mysql的查询用法
  6. mysql 密码加密windows_Windows下mysql数据库的安装及8.0以上版本设置密码的命令(简易教学)...
  7. 线性代数第五版吉尔伯特课后答_线性代数同济第五版第四章课后习题答案!
  8. 【MVC】Controller的使用
  9. Deepin中设置文件或文件夹权限
  10. javaScript设计模式---(单例模式学习)