博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ajax与HTML5 history pushState/replaceState实例
阅读量:6215 次
发布时间:2019-06-21

本文共 1762 字,大约阅读时间需要 5 分钟。

  前言:最近在做项目的过程中,做到与搜索引擎相关的问题, 当搜索一个关键词时, 我们通过ajax请求获取到数据,然后填充到当前页面,这样做的好处是可以实现页面的无刷新操作,但是ajax请求存在一个问题 --- 在浏览器中无法前进和后退!!

  导致的问题: 这样,如果用户希望下次可以返回到之前的浏览记录就是不可能的了,这样用户体验会大大下降。

  最终目的: 我们希望做到的就是: 每次的ajax请求可以存到历史中去,这样,用户就可以在浏览器中通过前进和后退按钮来查看浏览过的历史了。

   解决思路: 曾经,google的做法是使用iframe来解决这样的问题,即模仿页面没有被刷新的状态,这样就可以使用前进和后退按钮了。但是HTML5出来之后,解决问题就会轻松很多了 --- ajax无前进和后退的本质是历史记录不会保存,所以我们可以利用html5的方法 pushState 强行给浏览器添加一个历史记录, 然后再点击前进和后退的时候通过给url传参的形式就可以返回到之前pushState的历史记录中了。 这个方法妙啊!

  

  争议: 有人说了: 我可以每次在查询的时候不使用ajax请求,而是导航到一个新页面,这样不就成功的规避了ajax请求没有自行保存历史记录的问题了吗?  

  回答: 这个思路是没有问题的,但是试想,每次再我们搜索的时候,我们只是希望改变内容部分, 而不需要重新刷新整个页面(包括header和footer)。如果使用导航到新页面,就不可避免的导致刷新整个页面造成资源浪费。

 

  解决方法:

    1.  在搜索栏中输入关键词并点击搜索按钮后, 就将ajax查询的内容附在url的?之后作为查询字符串, 然后再使用history.pushState即可将当前的“独一无二”的url保存在历史记录中。

    2.  当我们点击浏览器的返回按钮时,或者执行相应的返回操作时,就会触发 window.onpopstate 事件, 通过绑定popstate事件,我们就可以再将历史中的查询字符串中的之前ajax查询的内容使用js提取出来然后再执行ajax载入,这个载入是不需要使用window.pushState的,否则就会进入死循环,通过这种方式我们就可以模仿实现返回的效果。对于前进也是一样的思路。

    3.  当页面首次载入的时候,如果没有查询地址或者查询地址不匹配,则使用第一个菜单的Ajax地址的查询内容,并使用history.replaceState更改当前的浏览器历史,然后触发Ajax操作。 注: 这个方法可能在某些内容必须有的情况下是这样的,但是对于我目前的项目而言, 这个histoty.replaceState似乎并没有太大的必要,准确的说是不需要。

    

 

  使用方法:

  1.history.pushState

  history.pushState({}, "页面标题", "xxx.html");

var state = {    title: title,    url: options.url,    otherkey: othervalue};window.history.pushState(state, document.title, url);

 

 

  2.history.replaceState

  history.replaceState(null, "页面标题", "xxx.html");

  

   3.window.onpopstate

  window.addEventListener("popstate", function() {

    var currentState = history.state;

    /*

* 干点啥    */	   });  4. history.state         当前URL下对应的状态信息。如果当前URL不是通过pushState或者replaceState产生的,那么history.state是null。 我们直接打开console控制台, 然后输入history.state得到的就是null,因为我们还没有利用pushState和replaceState。

   

 

 

参考文章:

转载地址:http://ngsja.baihongyu.com/

你可能感兴趣的文章
关于AWS的Firecracker,技术人应该知道的十件事
查看>>
密歇根大学最新成果:教会无人车预测行人运动趋势
查看>>
改变的六条规则
查看>>
Uber系统从Postgres迁移到MySQL
查看>>
阿里程序员工作小技巧:理解CPU分支预测,提高代码效率
查看>>
Linux基金会宣布将为GraphQL成立基金会
查看>>
VS2017 15.8第二个预览版本提升了对CPU Profiling和F#的支持
查看>>
性能是.NET Core的一个关键特性
查看>>
使用Visual Studio Code进行Swift开发
查看>>
《探索ES6》书评与作者采访
查看>>
Racket 6.5改善了Typed Racket,提供更快迭代并添加更多新功能
查看>>
区块链安全:2019年我们走了多远?
查看>>
Java永久代去哪儿了
查看>>
百度发布智能电视伴侣,并公布短视频计划
查看>>
Qt 5.5增加了新的GL模块,并改进了跨平台支持
查看>>
JavaScript引擎V8 5.1遵循了更多的ECMAScript规范并支持WASM
查看>>
Leetcode 4 Median of Two Sorted Arrays 两排序数组的中位数
查看>>
PayPal Agility with Stability On OpenStack
查看>>
包含Tomcat 9的JBoss Web Server 5已发布
查看>>
浪潮成立Inspur DevOps Lab:以应用开发和平台服务打造开发者生态
查看>>