【问题标题】:window.onpopstate is not working; nothing happens when I navigate back to pagewindow.onpopstate 不工作;当我导航回页面时没有任何反应
【发布时间】:2015-06-12 13:47:56
【问题描述】:

我正在尝试在我网站上的一个页面上添加window.onpopstate,但没有任何反应。我把这个脚本放在页面上:

<script type="text/javascript">
  window.addEventListener('popstate', function(event) {
    if (event.state) {
      alert(event.state);
    }
  }, false);
</script>

我也试过了:

<script type="text/javascript">
  window.onpopstate = function() {
    alert("popped!");
  }
</script>

但是,当我导航回该页面时,我没有收到任何警报。

【问题讨论】:

    标签: javascript history popstate


    【解决方案1】:
    window.onpopstate = function(event) {
      alert(`location: ${document.location}, state: ${JSON.stringify(event.state)}`)
    }
    
    history.pushState({page: 1}, "title 1", "?page=1")
    history.pushState({page: 2}, "title 2", "?page=2")
    history.replaceState({page: 3}, "title 3", "?page=3")
    history.back() // alerts "location: http://example.com/example.html?page=1, state: {"page":1}"
    history.back() // alerts "location: http://example.com/example.html, state: null"
    history.go(2)  // alerts "location: http://example.com/example.html?page=3, state: {"page":3}"
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    【解决方案2】:

    仅当您添加一个或多个历史记录条目并且之后用户单击浏览器中的返回按钮时,您才会收到popstate 事件。

    向浏览器历史记录添加条目可以让您更改 URL(就像用户导航到另一个页面一样),但不会实际加载新页面。

    您使用pushState 方法添加历史条目:

    history.pushState({}, '', '/newpage');
    

    当您添加一个条目并且用户单击返回时,URL 会切换回上一个条目,但该地址的页面并未加载。而是触发了 popstate 事件。

    https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history


    例外情况:

    旧版浏览器不支持 popstate 事件和浏览器历史记录的操作。

    某些浏览器(例如 Safari)在实际加载页面时也会触发 popstate 事件。

    【讨论】:

    • 假设我在 chrome devtools 控制台中写了window.addEventListener('popstate', (e) =&gt; console.log(e)),单击后退按钮后如何查看控制台日志?
    • @AkinHwan popstate 仅在您从 pushState 移动到先前状态(或类似的状态)时触发。如果您从单独的页面导航回第一页,则不会触发。
    • 你是说如果我加载了“localhost/page.html#1234”然后我手动输入“localhost/page.html#5678”来加载基本相同的页面,然后单击后退按钮,onpopstate 不会被调用 即使它是同一个相同的页面?
    • 这对我来说是缺失的部分。我试图用浏览器的后退按钮关闭移动导航,但从未触发 popstate。我所做的是,每当导航打开时,设置一个本地变量_navIsOpened = true 并推送一个新的历史状态history.pushState(null, null, window.location.pathname); 让我保持在同一页面上并使用后退按钮,如果_navIsOpened 保持在同一页面上对历史状态的新推动,否则返回 history.back() ✌️✌️✌️
    • 你也可以看看这个简单的过程:stackoverflow.com/questions/69512244/…
    猜你喜欢
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    相关资源
    最近更新 更多