我的网站的查询字符串网址如下:
?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1
当用户转到下一页(从第1页到第2页)时:
我们明确地增加pn
(页码加1)并将其设置在查询字符串URL中。
更改了查询字符串:
?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=2
我还存储旧的查询字符串,它看起来像:
?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1
然后我将两者都推送到窗口历史记录以更改URL并保存以前的浏览器:
window.history.pushState(oldQS, null, newQS);
执行此操作后,当我在第2页时,我会检查window.history.state
。它存储了我以前的状态:
?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1
我从第2页按回浏览器返回第1页。我把断点放在:
$(window).on('popstate', function(e) {
console.log(e.originalEvent.state)
});
e.originalEvent.state
是null
。
window.history.state
不是null
,并且当我在第2页时存储正确的值。null
值。 (尚未奏效。)
在hashchange
事件中设置断点,但没有帮助,因为网址中没有#。
在我的Javascript代码上的每个window.history
函数上添加断点,例如pushState()
,replaceState()
,但当我按下浏览器时,它们都没有被点击。
我不知道所有其他地方/功能可能会将window.history.state
更改为null
。
如何通过单击浏览器来确定它变为null的方式和位置?
答案 0 :(得分:0)
你问:
我不知道所有其他地方/函数可以将window.history.state更改为null。
如何通过单击浏览器来确定它变为null的方式和位置?
让我们阅读W3C HTML5规范:
...
History接口的state属性必须返回用户代理设置的最后一个值。最初,它的值必须为null。
结论:加载文档时,history.state
最初为null
。
当需要用户代理将历史记录遍历到指定条目[...]时,用户代理必须按以下方式执行操作。
...
- 如果条目是状态对象条目,则让state成为该状态对象的结构化克隆。否则,让state为null。
醇>...
- 如果指定条目的Document具有最新条目,并且该条目不是指定条目,则将状态更改为true;否则就是假的。
醇>...
- 醇>
- 如果状态更改为true,则使用PopStateEvent接口在Document的Window对象上触发名为popstate的受信任事件,并将state属性初始化为state的值。 [...]
结论:当导航回文档加载时的状态时,popstate
事件触发的状态为null
。