根据url中的信息进行异步请求

时间:2022-04-26 07:39:33

https://developer.mozilla.org/zh-CN/docs/Web/Events/hashchange

事件类型一栏表:https://developer.mozilla.org/zh-CN/docs/Web/Events

Hash

改削hash以及检测hash变革的两种方法:

<a href="#two">click to change hash two</a> <button onclick="location.hash=‘a‘+Math.random()">随机hash</button> <script> window.onhashchange = function(){ console.log(location.hash) } window.addEventListener("hashchange",function(){ console.log(location.hash) }) </script>

hash值会附在浏览器url地点的尾部,如?a=123#one。hash被改削之后,可以点击撤退退却前进,回到改削前后的页面,hashchange事件会被触发,页面不会刷新

History Api

使用pushState,可以实现改削浏览器的url,却不发送页面请求,页面没有刷新,点击撤退退却按钮可以回到改削前的url,前进或者撤退退却,页面都不会刷新(因为页面始终是同一个document,前进撤退退却的过程会触发onpopstate事件),也不会有新的网络请求,给人的觉得就像是仅仅切换了url的显示一样。

而replaceState,仅仅是替换当前的url,除此之外没任何变革。

对付以下代码,页面第一次打开的时候,无输出,浏览器地点变为了index.html,此时点击撤退退却,会打印pushState前的地点,点击前进,会打印index地点

<script> history.pushState(null,"",":8888/index.html") window.onpopstate = function(){ console.log(location.href) } </script>

也就是说,仅当使用了pushState,然后点击前进或撤退退却,这个事件才会被触发。

应用场景

  我但愿把一个页面发给别人看,就把地点发了过去,但发明别人看的页面的状态和我此刻的页面状态不一致。这种不一致的原因是,页面中使用了异步请求,而进行了几多次异步请求以及请求了什么,,这些页面的状态并不能反应到url上面,所以把url发给别人,我页面的状态固然也就不能再别人那里重现了。

  解决的步伐是把页面中的异步请求信息添加到url上,或者说异步请求的信息要与url进行同步,法式如下:当第一次打开页面的时候,获取url,按照url中的信息进行异步请求,到达url与页面状态进行同步。当用户在页面长进行交互,触发了异步请求,完成后也要改削url,到达页面状态与url的同步。

  以上关键的处所就是改削url,但不能从头刷新,因为一刷新的话页面的状态又回到原点了,不是我们想要的。改削url就需要用到以上的hash 和 history api了,也可以添加query 参数(replaceState替换为本来的地点,只不过后面加上参数)

比拟hash和history api。

  不异点:改削hash对应pushState,hashchange事件对应popstate事件,两者的行为表示一致:切换的时候页面不刷新,转变的时候会留下历史记录,可供用户前进或撤退退却。

  差别点:history api 比 hash 多出来一个replaceState要领,以及改削后的url格局差别而已