我是jquery的新手,只是意识到,使用浏览器的BACK按钮返回页面时,.ready函数中的代码并不总是可以运行。通过阅读关于stackoverflow已有两年历史的帖子,似乎并不是所有的浏览器都以相同的方式工作,并且没有单个jquery函数可以解决问题。还是这样吗?检测页面是第一次运行还是在用户按下BACK后再次显示页面的最佳方法(在2012年!)?

只是要清楚一点:假设我有一个红色文本页面,单击后使用javascript / jquery将单词更改为蓝色……如果我导航到一个新的URL,然后按BACK,将发生以下情况:
Firefox-单词仍为蓝色
IE / Chrome-文字变回红色

火狐浏览器
我了解Firefox和其他一些浏览器实现了pageshowpagehide事件,并且在显示“ bfcache”中的页面时不会触发ready事件。在此功能内,您可以检查event.originalEvent.persisted to see what the situation is

IE / Chrome
I am aware of one trick使用<input type="hidden" id="dirty">来跟踪网页是否在IE / Chrome中首次加载。不知道这有多可靠。我也可以尝试一个cookie。

完全无知的道歉...

编辑:为什么呢?
我自己的情况可能需要花很多时间来解释,但是下面的一个无聊的例子也有同样的问题:图像显示10张纸牌的页面,用户可以选择一张纸牌使其在屏幕上向上移动。当您选择卡片时,会触发ajax请求,将卡片的详细信息发送到服务器。现在,假设您离开该页面,然后使用BACK返回该页面。可能发生三件事:
 1.浏览器可以调用服务器来获取页面,并且服务器(数据库)知道选择了哪个卡,因此可以输出相关的HTML /脚本
 2. Firefox将使用bfcache来显示您的页面-所选的卡仍将被选择(向上移动),因为DOM的状态被完全保留(不会打ready事件)
 3. IE / Chrome浏览器将从缓存中重新加载原始HTML,并调用ready事件的脚本.....将所有扑克牌显示在“未选中”位置。您选择的卡丢失了!

最佳答案

您可以使用此代码段检查页面是否来自bfcache(后退缓存)

window.addEventListener('pageshow', function(event) {
    console.log(event);
    if (event.persisted) {
        // comes from cache
    }
});


享受编码。

08-25 16:24
查看更多