【问题标题】:HTML5: Refresh page when popstate is firedHTML5:触发 popstate 时刷新页面
【发布时间】:2015-04-20 12:46:31
【问题描述】:

我有一个 ajax 搜索表单,例如:

网址:/搜索/

=> 用户输入搜索词并点击按钮

=> 搜索完成并通过 ajax 在页面上的 div 中显示结果

但是:我还希望用户能够将 URL 复制并粘贴给朋友并浏览以前的搜索。因此,在触发搜索时,我将浏览器地址栏中的 url 从

/搜索/

/search/?q=你的关键字

使用:

window.history.pushState("", "Search for "+keyword, "/search/?q="+keyword);

这会将浏览器地址栏中的 url 更改为 /search/?q=yourkeywords 并且工作正常。

现在,点击后退按钮,浏览器地址栏再次显示 /search/,这很好。但是页面内容没有重新加载,它仍然显示来自 /search/?q=yourkeyword 的结果。

所以我补充说:

window.addEventListener("popstate", function(e) 
{   location.reload();
});

这是正确的方法吗?它在 FF 和 Chrome 等桌面浏览器中运行良好,但例如在 iOS 中,popstate 事件在 /search/ 上第一次加载搜索表单时触发,导致该页面无休止地重新加载。

正确的做法是什么?

【问题讨论】:

    标签: javascript ajax html


    【解决方案1】:

    2022 年新闻

    当所有主要浏览器开始在页面加载时不发出 popstate 事件时,此问题已解决。所以现在简单地做应该是相对安全的:

    window.addEventListener("popstate", function(e){
      location.reload();
    });
    

    现在所有主流浏览器

    • 总是在用户导航(例如通过后退和前进按钮)到通过pushState() 添加的历史条目时触发popstate 事件
    • 从不在网页加载时触发popstate(例如通过刷新按钮)

    引用https://developer.mozilla.org/en-US/docs/Web/API/PopStateEvent

    注意:浏览器过去在页面加载时处理 popstate 事件的方式不同,但现在它们的行为相同。 Firefox 从未在页面加载时发出 popstate 事件。 Chrome 一直到 34 版,而 Safari 一直到 10.0 版。

    【讨论】:

      【解决方案2】:

      最简单的解决方案是在使用pushState 时设置一个全局变量。然后,在您的 onpopstate 处理程序中检查是否已设置。例如:

      window.historyInitiated = true;
      window.history.pushState("", "Search for "+keyword, "/search/?q="+keyword);
      ...
      window.addEventListener("popstate", function(e) {
        if (window.historyInitiated) {
          window.location.reload();
        }
      });
      

      【讨论】:

      • 我认为这应该是公认的答案。非常适合我们的(相同)用例。
      【解决方案3】:

      我的建议:

      window.location.href = window.location.href;
      

      我没有测试过,但我认为它会做你想要的。

      【讨论】:

      • 感谢您的回复。我认为 location.reload() 和您的解决方案是相同的。但问题是即使在加载页面时 iOS 也会触发 popstate 事件,因此只需浏览到 /search/(之前没有执行任何 pushState)就会触发 popstate 事件。
      • 我猜你必须测试不同的场景。我想我接下来要做的就是创建一个在页面加载完成后设置的变量。并且仅在设置了该变量时才重新加载。
      猜你喜欢
      • 1970-01-01
      • 2011-07-04
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      相关资源
      最近更新 更多