使用浏览器后退按钮时如何强制重新加载页面?

IT技术 javascript jquery browser browser-cache page-refresh
2021-02-06 17:41:36

我需要以某种方式检测用户是否按下了浏览器的后退按钮并使用 jquery 刷新页面(重新加载内容和 CSS)。

如何通过 jquery 检测此类操作?

因为现在如果我在浏览器中使用后退按钮,则不会重新加载某些元素。但是,如果我使用网站中的链接,一切都会刷新并正确显示。

重要的!

有些人可能误解了我想要什么。我不想刷新当前页面。我想刷新按后退按钮后加载的页面。这是我更详细的意思:

  1. 用户正在访问第 1 页。
  2. 在第 1 页时 - 他单击了指向第 2 页的链接。
  3. 他被重定向到 page2
  4. 现在(重要的部分!)他点击浏览器中的后退按钮,因为他想回到第 1 页
  5. 他回到了第 1 页 - 现在正在重新加载第 1 页,并且出现诸如“您回来了!”之类的警报。
6个回答

pageshow当浏览器通过历史遍历导航到您的页面时,您可以使用事件来处理情况:

window.addEventListener( "pageshow", function ( event ) {
  var historyTraversal = event.persisted || 
                         ( typeof window.performance != "undefined" && 
                              window.performance.navigation.type === 2 );
  if ( historyTraversal ) {
    // Handle page restore.
    window.location.reload();
  }
});

请注意,也可能涉及 HTTP 缓存。您需要在服务器上设置适当的缓存相关 HTTP 标头以仅缓存那些需要缓存的资源。您还可以强制重新加载以指示浏览器忽略 HTTP 缓存:window.location.reload( true )但我不认为这是最好的解决方案。

有关更多信息,请检查:

如何卸载BFCache?你能用更具体的信息更新你的代码吗?这行window.addEventListener( "unload", function() {} );不行。是完整的吗?
2021-03-13 17:41:36
我仍然看到双重加载;(一旦默认的 Firefox(显示旧页面;可能来自浏览器缓存?)然后脚本再次触发。脚本会将其重新加载到实际的阶段,但我仍然看到旧状态一秒钟左右;(我有代码在里面 $(document).ready( function() { /* code here */ });
2021-03-23 17:41:36
Chrome 历史遍历有点令人困惑。请尝试pageshow解决方案。
2021-03-26 17:41:36
你能帮助用户 Dhiraj 他在正确的轨道上,但它正在重新加载两次。顺便说一下,我试过了,window.addEventListener( "unload", function() {} );但它什么也没做,后退按钮和以前一样工作,没有任何变化;(
2021-04-01 17:41:36
window.performance.navigation已弃用。检查我使用的导航类型window.performance.getEntriesByType("navigation")[0].type === "back_forward"
2021-04-08 17:41:36

自发布以来已经有一段时间了,但如果您不需要支持旧浏览器,我找到了一个更优雅的解决方案。

你可以做一个检查

performance.navigation.type

包括浏览器支持在内的文档在这里:https : //developer.mozilla.org/en-US/docs/Web/API/Performance/navigation

因此,要查看页面是否是使用 back 从历史记录中加载的,您可以执行以下操作

if(performance.navigation.type == 2){
   location.reload(true);
}

2指示页面被导航到历史访问。其他可能性是——

0:通过点击链接、书签、表单提交或脚本,或通过在地址栏中键入 URL 来访问该页面。

1:该页面是通过单击重新加载按钮或通过 Location.reload() 方法访问的。

255: 任何其他方式

这些在此处详细说明:https : //developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigation


注意Performance.navigation.type现在已被弃用,取而代之的是PerformanceNavigationTiming.type,它返回“navigate”/“reload”/“back_forward”/“prerender”:https : //developer.mozilla.org/en-US/docs/Web /API/PerformanceNavigationTiming/类型

这就像一个魅力。很棒的发现......它非常快速和可靠,不像其他答案那样慢。
2021-03-15 17:41:36
这个适用于 chrome 浏览器,不适用于 Firefox
2021-03-18 17:41:36
这已被弃用(请参阅w3c.github.io/navigation-timing/#obsolete)。
2021-03-19 17:41:36
这张支票对我有用。2具体是什么意思?
2021-03-23 17:41:36
这就像一个魅力..我把它放在最顶部的区域..页面正在重新加载而没有加载任何其他脚本。
2021-04-04 17:41:36

只需使用 jquery :

jQuery( document ).ready(function( $ ) {

   //Use this inside your document ready jQuery 
   $(window).on('popstate', function() {
      location.reload(true);
   });

});

当使用 ajax 单击后退或前进按钮时,以上将 100% 工作。

如果没有,则脚本的不同部分中一定存在错误配置。

例如,如果使用上一篇文章中的示例之一,它可能不会重新加载 window.history.pushState('', null, './');

所以当你使用时,请history.pushState(); 确保正确使用它。

在大多数情况下,您只需要以下建议:

history.pushState(url, '', url); 

没有 window.history... 并确保定义了url

希望有帮助..

只是不喜欢“只使用 jQuery”答案,抱歉
2021-03-22 17:41:36
2021-04-03 17:41:36
@RitchieD - 截至今天,这在 Windows 10 上的 IE11 中运行良好。注意:我没有使用 EDGE。
2021-04-04 17:41:36
我会从重新加载中删除“true”以使用 HTTP 缓存。大多数情况下没有必要重新加载资产。
2021-04-11 17:41:36

由于performance.navigation现在已弃用,您可以尝试以下操作:

var perfEntries = performance.getEntriesByType("navigation");

if (perfEntries[0].type === "back_forward") {
    location.reload(true);
}
这是最新的答案
2021-03-25 17:41:36
developer.mozilla.org/en-US/docs/Web/API/...表示它还不能在 Safari 或 iOS 上运行...
2021-03-26 17:41:36
此代码需要与上面列昂尼德回答中的代码结合使用。
2021-04-01 17:41:36
这对我来说很好用。我在最新的 Chrome、Firefox、IE 和 Edge 中进行了测试。没有在 Mac 上检查 Safari。
2021-04-02 17:41:36
有没有人用iOS测试过这个?我用 performance.getEntriesByType("navigation") 方法替换了旧的 performance.navigation.type 方法,并且我页面上的所有 JS 在 iOS 上都停止工作。
2021-04-10 17:41:36

您应该使用隐藏输入作为刷新指示器,值为“no”:

<input type="hidden" id="refresh" value="no">

现在使用 jQuery,你可以检查它的值:

$(document).ready(function(e) {
    var $input = $('#refresh');

    $input.val() == 'yes' ? location.reload(true) : $input.val('yes');
});

当您单击后退按钮时,隐藏字段中的值保留与您最初离开页面时相同的值。

所以第一次加载页面时,输入的值为“no”。当您返回该页面时,它会是“是”并且您的 JavaScript 代码将触发刷新。

现在它起作用了。然而,它重新加载了 2 次,看起来有点奇怪。第一次重装。没什么 - 这可能是默认的浏览器行为。第二次重新加载 - 通过您的脚本 - 值会按照应有的方式刷新,但看起来很糟糕,因为它重新加载了两次。知道如何稍微改进它,以便重新加载看起来更好或只重新加载一次吗?它在 Chrome 中看起来比 Firefox 更好,重新加载速度更快,但我仍然看到原始状态(一秒或半秒)并且脚本重新加载仅在此之后。
2021-03-13 17:41:36
请检查我更新的问题,也许您和其他人误解了我。现在更清楚了,我想要完成什么。谢谢你。
2021-03-15 17:41:36
是的,我确实误解了,感谢您详细更新问题。
2021-03-25 17:41:36
它不起作用。我已经尝试过 Firefox 和 Chrome,但它不起作用。
2021-04-05 17:41:36
如何解决“双重负载”的任何新想法?
2021-04-12 17:41:36