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


84

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

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

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

重要!

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

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

为什么不尝试破解正常的用户行为,为什么不尝试理解为什么代码无法在页面加载中工作并且需要重新加载页面?
Lelio Faieta'3

2
@LelioFaieta我更改类以显示更改。如果用户单击某些内容,则值将通过ajax在数据库中更改。完成ajax时,例如CSS类cahnge从onto off。没关系,它已保存在db中,用户可以正确看到所有内容。现在,他单击其他链接。例如关于我们页面,对吗?现在,他在“关于我们”页面上。Be决定返回上一页,然后在浏览器中单击“后退”按钮。当他回来时,他看到页面上的变化,因为浏览器在触发ajax(打开/关闭类)之前显示页面(可能是某些浏览器提示)
John Doeherskij

1
您正在使用get或post进行Ajax呼叫吗?
Lelio Faieta

1
@LelioFaieta part2 ..我也使用data属性,它没有任何作用。如果重新加载页面,一切都会很好。如果我在该页面上按F5,将显示他通过ajax更改的值。当css / html部分未完全重新加载时,我认为这是一些与浏览器缓存相关的问题。它只是重新加载按F5后
约翰Doeherskij

@LelioFaieta$.ajax({ url: url, method: 'post', processData: false, contentType: false, cache: false, dataType: 'json', data: formData, })您认为这可能是ajax造成的吗?如果是这样,那就太好了。
John Doeherskij

Answers:


86

您可以使用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 )。但是我认为这不是最好的解决方案。

有关更多信息,请检查:


您能否帮助用户Dhiraj步入正轨,但正在重新加载两次。顺便说一句,我已经尝试过了,window.addEventListener( "unload", function() {} );但是它什么也没做,后退按钮仍然像以前一样工作,没有任何改变;(
John Doeherskij

如何卸载BFCache?您可以使用更具体的信息来更新代码吗?这条线window.addEventListener( "unload", function() {} );不起作用。完成了吗?
John Doeherskij

Chrome历史记录遍历有些令人困惑。请尝试pageshow解决。
Leonid Vasilev

1
我仍然看到双重加载;(一旦默认的Firefox(显示旧页面;也许是从浏览器缓存中显示?),然后再次触发该脚本。该脚本会将其重新加载到实际阶段,但是我仍然看到旧状态一秒钟左右;(我里面有代码$(document).ready( function() { /* code here */ });
John Doeherskij

3
window.performance.navigation不推荐使用。要检查我使用的导航类型window.performance.getEntriesByType("navigation")[0].type === "back_forward"
zero01alpha,

49

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

你可以用

performance.navigation.type

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

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

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返回“导航” /“重装” /“back_forward” /“预渲染”:https://developer.mozilla.org/en-US/docs/Web / API / PerformanceNavigationTiming /类型


2
这张支票对我有用。2到底是什么意思?
RitchieD

这就像一种魅力..我将其放在最上方的区域..并且页面正在重新加载而未加载任何其他脚本。
NMathur '18

这就像一个魅力。很棒的发现...这是非常快速和可靠的,与其他与此相比缓慢的答案不同。TY
weBBer '18

这个使用chrome浏览器工作,而不使用Firefox
praaveen VR


22

只需使用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

希望有帮助。



@RitchieD-到目前为止,这在Windows 10的IE11中运行良好。注意:我没有使用EDGE。
Dan G

只是不喜欢“只使用jQuery”的答案,对不起
史蒂文

我将从重新加载中删除“ true”以使用HTTP缓存。在大多数情况下,没有必要重新加载资产。
konyak

14

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

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

if (perfEntries[0].type === "back_forward") {
    location.reload(true);
}

这是最新的答案
Java_Man

该代码需要与Leonid上面的答案中的代码组合。
gornvix

这对我来说很好。我在最新的Chrome,Firefox,IE和Edge中进行了测试。未在Mac上检查Safari。
Tasawar Hussain

6

您应该使用隐藏的输入作为刷新指示器,其值为“ 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代码将触发刷新。


1
没用 我尝试过Firefox和Chrome,但无法正常工作。
John Doeherskij

请检查我更新的问题,也许您和其他人误解了我。现在,我要完成的任务更加清晰。谢谢。
John Doeherskij

是的,我确实误会了,谢谢您详细地更新问题。
Dhiraj

现在可以了。但是它正在重新加载2次,看起来有点怪异。第一次重新加载。没什么-这可能是浏览器的默认行为。第二次通过您的脚本重新加载-值会按原样刷新,但看起来很糟糕,因为它重新加载了两次。知道如何稍微改善一下,以便重新加载看起来更好或仅重新加载一次吗?在Chrome中看起来比Firefox更好,重新加载速度更快,但是我仍然看到原始的后退状态(一秒钟或半秒钟),并且脚本重新加载只是在那之后。
John Doeherskij

任何新的想法如何解决“双重负担”?
John Doeherskij

6

解决我问题的另一种方法是禁用页面缓存。这使得浏览器可以从服务器获取页面,而不是使用缓存版本:

Response.AppendHeader("Cache-Control","no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");

最佳解决方案,但这是我使用的版本。Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetMaxAge(TimeSpan.Zero); Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); Response.Cache.SetNoStore();
热忱,

2

当前,如果用户单击“后退”按钮,则这是最新的方式重新加载页面。

const [entry] = performance.getEntriesByType("navigation");

// Show it in a nice table in the developer console
console.table(entry.toJSON());

if (entry["type"] === "back_forward")
    location.reload();

看到这里的来源


1

重新加载很容易。您应该使用:

location.reload(true);

而检测回来的是:

window.history.pushState('', null, './');
  $(window).on('popstate', function() {
   location.reload(true);
});

不工作;(我尝试alert('test');代替location.reload(true);但仍然没有尝试。我尝试了firefox和chrome但什么也没有。我的页面上有很多jquery代码,它可以正常工作
John Doeherskij

我已经编辑了答案,请尝试新的解决方案。问题是您需要先推送状态,否则您将不会获得popstate事件。
Anton Stepanenkov

您可能误解了我想要的。我已经用更详细的描述更新了我的问题。如果有时间,请再次检查,谢谢。
John Doeherskij


-1

我找到了最佳答案,对我来说效果很好

只需在链接中使用此简单脚本

<A HREF="javascript:history.go(0)">next page</A>

或按钮单击事件

<INPUT TYPE="button" onClick="history.go(0)" VALUE="next page">

使用此功能时,请先刷新页面,然后再转到下一页,返回时页面将处于最后刷新状态。

我在CAS登录名中使用了它,并提供了我想要的东西。希望能帮助到你 .......

这里找到详细信息


这对我不起作用。“ 0”代表什么?
文森特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.