我发现当用户按下后退或前进按钮时会触发 popstate。但这是否意味着这是浏览器的默认行为。假设网站不使用 SPA,单击链接将从服务器加载整个网页。因此,URL 会发生更改并加载页面,pushstate 或 Replacestate 是仅由用户执行的函数。所以这次点击不会执行任何操作。现在,如果我们单击窗口的后退按钮,这不会触发 popstate。我是正确的还是两者都不同?我的意思是我们不使用推送状态/替换状态,但按下后退或前进按钮时会被解雇吗?
我一直在浏览此链接,但我无法理解此网站中提到的这些解释:
示例1:
假设我们在 example.com/home,然后从这里导航到 example.com/home#s1。 ->当我们导航到 example.com/home#s1 时,该网页不会重新加载。这个新条目的文档与属于 example.com/home 的文档相同。
由于这两个位置的文档相同,并且我们进行了导航,因此 popstate 被触发。答案是明确的,是的。
另外,示例 2: 假设我们位于 example.com/home#s1,然后从这里导航到 example.com/home。 ->当我们导航到 example.com/home 时,浏览器重新加载完成。这意味着新条目 example.com/home 的文档与初始条目 example.com/home#s1 的文档不同;同样 popstate 也不会触发。
答案是明确的否定。
示例3: 假设您在 example.com 上执行以下代码,然后导航到 example.com/#about。之后,您可以使用浏览器上的“后退”按钮返回到初始条目。
var o = {x: 1}
history.replaceState(o, '');
window.onpopstate = function(e) {
console.log(e.state === o);
}
控制台会打印什么?
你能解释一下这 3 个例子吗?这可能会消除我的困惑。
跨不同网页遍历会话历史记录,其中不包括添加哈希并且不是由pushstate或replacestate创建的,不会触发popstate。
示例 1:Popstate 由于浏览器的默认行为而触发。转到当前文档的某个部分(哈希 URL)会触发 popstate。
示例2:Popstate现在仍然会触发。这次是因为遍历历史堆栈而不重新加载页面。
示例 3:调用替换状态将当前浏览器历史记录替换为现有链接,但状态不同(在本例中为 o)。 现在,导航到同一文档中的散列链接会触发 popstate。由于此导航不是由推送状态或替换状态触发的,因此其状态为 null,因此控制台打印 false。现在,如果我们按后退按钮,popstate 将再次触发。由于 JS 序列化状态,尽管对象内部的值相同,但由于 JS 使用单独的内存来存储两个值,因此显示 false。