我需要以某种方式检测用户是否已经按下了浏览器返回按钮,并使用 jquery 以刷新(重新加载内容和 CSS)的方式重新加载页面。
如何通过 jquery 检测这样的操作?
因为现在如果我在浏览器中使用返回按钮,有些元素不会重新加载。但是如果我在网站中使用链接,一切都会刷新并正确显示。
重要!
有些人可能误解了我想要的东西。我不想刷新当前页面。我想刷新页面后,我按后退按钮加载。以下是我更详细的解释:
您应该使用一个隐藏的输入作为刷新指示器,其值为“ 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”。当您返回到页面时,它将是“ yes”,并且您的 JavaScript 代码将触发刷新。
重新加载很容易,你应该使用:
location.reload(true);
而检测回来的是:
window.history.pushState('', null, './'); $(window).on('popstate', function() { location.reload(true); });
当浏览器通过历史遍历导航到您的页面时,您可以使用 pageshow事件来处理以下情况:
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 )。但我不认为这是最好的解决办法。
window.location.reload( true )
查看更多信息:
只要使用 jquery:
jQuery( document ).ready(function( $ ) { //Use this inside your document ready jQuery $(window).on('popstate', function() { location.reload(true); }); });
以上将工作100% 时,后退或前进按钮已被点击使用阿贾克斯以及。
如果没有,那么脚本的其他部分一定是配置错误。
例如,如果使用 window.history.pushState('', null, './');,它可能不会重新加载类似上一篇文章中的示例之一
window.history.pushState('', null, './');
所以当你使用 history.pushState();的时候 确保你正确地使用它。
history.pushState();
建议在大多数情况下,你只需要:
history.pushState(url, '', url);
没有窗口。历史... 并确保 网址被定义。
希望这能帮上忙。
这已经是一段时间以来,因为这张贴,但我发现了一个更优雅的解决方案,如果你不需要支持旧的浏览器。
你可以检查一下
performance.navigation.type
包括浏览器支持在内的文档如下: https://developer.mozilla.org/en-US/docs/Web/API/Performance/navigation
因此,看看页面是否从历史加载使用回来,你可以这样做
if(performance.navigation.type == 2){ location.reload(true); }
2表示通过导航到历史记录来访问该页
2
通过下面的链接、书签、表单提交或脚本,或者通过在地址栏中键入 URL 来访问页面。
通过单击 Relload 按钮或通过 Location.Reload ()方法访问页面。
还有别的办法吗
这里有详细资料: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigation
注意: Performance.Navigation.type现在已经被弃用,取而代之的是 类型,它返回‘导航’/‘ reload’/‘ back _ forward’/‘ prerender’: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigationTiming/type
我找到了最好的答案,它对我来说非常有效
只要在你的链接中使用这个简单的脚本
<A HREF="javascript:history.go(0)">next page</A>
或按钮点击事件
<INPUT TYPE="button" onClick="history.go(0)" VALUE="next page">
当你使用它的时候,你首先刷新你的页面,然后转到下一个页面, 当您返回时,它将处于最后一个刷新状态。
我已经在 CAS 登录中使用了它,并且给了我我想要的。 希望能有所帮助。
从 给你找到的详细资料
因为 performance.navigation现在已经被弃用,所以您可以尝试这样做:
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();
请参阅 给你了解源代码
我有同样的问题,后退按钮会更新显示在位置字段的网址,但页面内容没有改变。
正如其他人指出的那样,通过捕获“ pageshow”-event,可以检测 document.location 中的更改是由后退按钮还是其他什么原因引起的。
但我的问题是,当我点击后退按钮时,“页面显示”根本没有触发。唯一发生的情况是位置字段中的 URL 发生了变化(应该是这样) ,但页面内容没有变化。为什么?
我找到了理解是什么导致了这种情况的关键: https://developer.mozilla.org/en-US/docs/Web/API/Window/pageshow_event。
它说“页面显示”-事件是由“从同一个窗口或选项卡中的另一个页面导航到该页面”或“使用浏览器的前进或后退按钮返回该页面”引起的
这让我不禁问道: “我真的回到了那一页吗?”.“是什么标识了一个页面?”.如果我的后退按钮不是“返回页面”,那么当然不会触发“显示页面”。所以我真的是“回到一页”吗?还是我一直都在同一个“页面”上?什么是“一页”?如何识别页面?通过网址吗?
事实证明我点击后退按钮并没有“改变页面”。它只是改变了我的 url 中的 HASH (# + something)。当 URL 中唯一改变的是散列时,浏览器似乎并不认为它是另一个页面。
因此,我修改了在单击按钮时操纵 URL 的代码。除了更改散列之外,我还添加了一个查询参数,其值与散列相同,但没有“ #”。所以我的新网址看起来像:
/some Url? id = something # something
我的应用程序认为是“不同页面”的每个页面现在都有不同的查询字符串参数‘ id’值。就浏览器而言,它们是不同的“页面”。这解决了问题。“页面显示”-事件开始触发和后退按钮工作。
这个页面上的许多其他方法对我来说都不起作用,也许是因为当用户导航回页面时,“ bfcache”阻止了任何事情的发生。然而,我发现注册一个 window.onbeforeunload处理程序在大多数浏览器中对我都有效,我相信这是因为它是 隐式地使“ bfcache”无效。密码是这样的:
window.onbeforeunload
window.onbeforeunload = function() { window.location.reload(true); }
这个事件可能会在其他情况下触发,而不是“返回”按钮导航,但这与我的情况无关。2021年8月,我在以下平台上测试了最新版本的上市浏览器:
就我而言,我并不真正关心手机。我确实关心 IE,但是我没有 IE 的访问权限,所以我不能测试它。如果有人在 IE 上尝试这个,并且可以在评论中报告结果,那将会很有帮助。
我发现,如果我使用 Cache-Control响应头使浏览器缓存失效,iOS Safari 也可以工作
Cache-Control
Cache-Control: no-store, must-revalidate
修复 iOS Safari。请参阅 这么回答了解如何在各种平台上设置 Cache-Control响应头。
这可以在11月21日最新的 Firefox 和 Chrome 中使用。
window.addEventListener( "pageshow", function ( event ) { var perfEntries = performance.getEntriesByType("navigation"); if (perfEntries[0].type === "back_forward") { location.reload(); } });
在 Chrome96中,当你使用后退按钮时,类型是‘ reload’
我试了以前所有的答案,没有一个有用。
最终我找到了这个解决方案,它确实奏效了:
(function () { window.onpageshow = function(event) { if (event.persisted) { window.location.reload(); } }; })();
下面是一个用于 Safari 检测的版本,如果检测到,则执行官方已经废弃的旧代码(但仍在 Safari 中)。
let isSafari = navigator.vendor && navigator.vendor.indexOf('Apple') > -1 && navigator.userAgent && navigator.userAgent.indexOf('CriOS') == -1 && navigator.userAgent.indexOf('FxiOS') == -1; if(isSafari) { window.addEventListener( "pageshow", function ( event ) { let historyTraversal = event.persisted || ( typeof window.performance != "undefined" && window.performance.navigation.type === 2 ); if (historyTraversal) { // Handle page restore. window.location.reload(); } }); } else { let perfEntries = performance.getEntriesByType("navigation") if (perfEntries[0].type === "back_forward") { window.location.reload(true); } }