Javascript 如何在使用浏览器后退按钮时强制重新加载页面?
我需要以某种方式检测用户是否按下了浏览器后退按钮,并使用jquery通过刷新(重新加载内容和CSS)重新加载页面 如何通过jquery检测此类操作 因为现在如果我在浏览器中使用后退按钮,一些元素不会被重新加载。但如果我在网站上使用链接,所有内容都会被刷新并正确显示 重要强> 有些人可能误解了我想要什么。我不想刷新当前页面。我想在按下后退按钮后刷新加载的页面。以下是我更详细的意思:Javascript 如何在使用浏览器后退按钮时强制重新加载页面?,javascript,jquery,browser,browser-cache,page-refresh,Javascript,Jquery,Browser,Browser Cache,Page Refresh,我需要以某种方式检测用户是否按下了浏览器后退按钮,并使用jquery通过刷新(重新加载内容和CSS)重新加载页面 如何通过jquery检测此类操作 因为现在如果我在浏览器中使用后退按钮,一些元素不会被重新加载。但如果我在网站上使用链接,所有内容都会被刷新并正确显示 重要 有些人可能误解了我想要什么。我不想刷新当前页面。我想在按下后退按钮后刷新加载的页面。以下是我更详细的意思: 用户正在访问第1页 在第1页,他点击了第2页的链接 他被转到第二页 现在(重要的部分!)他点击浏览器中的后退按钮,因为他
您应该使用隐藏输入作为刷新指示器,其值为“否”: 单击“上一步”按钮时,隐藏字段中的值将保留与最初离开页面时相同的值
因此,第一次加载页面时,输入值将为“否”。当您返回页面时,将显示“是”,您的JavaScript代码将触发刷新。重新加载很容易。你应使用:
location.reload(true);
检测背部是:
window.history.pushState('', null, './');
$(window).on('popstate', function() {
location.reload(true);
});
当浏览器通过历史遍历导航到您的页面时,您可以使用
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)
。但我不认为这是最好的解决方案
有关更多信息,请查看:
- 关于MDN的文章
- 布雷迪·艾德森
- MDN上的事件引用
- 问题:
- 问题:
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);
没有窗户,历史。。。并确保定义了url
希望这会有所帮助。这篇文章发布已经有一段时间了,但如果您不需要支持旧浏览器,我发现了一个更优雅的解决方案
你可以和我核对一下
performance.navigation.type
此处提供了包括浏览器支持在内的文档:
因此,要查看页面是否是使用back从历史加载的,您可以执行以下操作
if(performance.navigation.type == 2){
location.reload(true);
}
2
表示该页面是通过导航到历史记录来访问的。其他可能性包括-
0:
通过以下方式访问页面:链接、书签、表单提交或脚本,或者在地址栏中键入URL
1:
通过单击“重新加载”按钮或通过Location.Reload()方法访问该页面
255:
任何其他方式
详情如下:
注意:Performance.navigation.type现在被弃用,取而代之的是返回“navigate”/“reload”/“back\u forward”/“prerender”的PerformanceNavigation.type:我找到了最好的答案,它对我来说非常有效
只需在链接中使用这个简单的脚本
<A HREF="javascript:history.go(0)">next page</A>
或者单击按钮事件
<INPUT TYPE="button" onClick="history.go(0)" VALUE="next page">
使用此选项时,首先刷新页面,然后转到下一页,
当您返回时,它将具有上次刷新的状态
我在CAS登录中使用了它,并提供了我想要的。
希望对……有帮助
详情可从
由于performance.navigation
现在已不推荐使用,您可以尝试以下方法:
var perfEntries = performance.getEntriesByType("navigation");
if (perfEntries[0].type === "back_forward") {
location.reload(true);
}
对我来说,解决这个问题的另一种方法是禁用页面的缓存。使浏览器能够从服务器获取页面,而不是使用缓存版本:
Response.AppendHeader("Cache-Control","no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");
在html头文件中使用以下元标记,这对我很有用
<meta http-equiv="Pragma" content="no-cache">
当前,如果用户单击后退按钮,这是最新的重新加载页面方式
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();
请参阅源代码,我遇到了相同的问题,后退按钮将更新位置字段中显示的url,但页面内容没有更改
正如其他人指出的,通过捕获“pageshow”事件,可以检测document.location中的更改是否是由后退按钮或其他原因引起的
但我的问题是,当我点击后退按钮时,“pageshow”根本没有触发。唯一发生的事情是位置字段中的url发生了更改(就像它应该发生的那样),但页面内容没有更改。为什么?
我找到了理解原因的关键:
它说“pageshow”-事件是由“从同一窗口或选项卡中的另一页导航到该页”或“使用浏览器的前进或后退按钮返回该页”引起的
这让我问:“我真的要回到这一页吗?”。“什么标识页面?”。如果我的后退按钮没有“返回页面”,那么当然不会触发“showpage”。那我真的是“回到一页”了吗?或者我可能一直在同一页上?什么是“页面”?如何识别页面?通过URL
原来我点击后退按钮并没有“改变页面”。它只是更改了我的url中的散列(即#+某物)。当URL的唯一变化是哈希时,浏览器不认为它是不同的页面。
所以我修改了
<meta http-equiv="Pragma" content="no-cache">
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();