移动版Safari的返回按钮

37
我发现的问题与这个问题非常相似,只是桌面版Safari似乎已经解决了这个问题。基本上,问题是这样的:当客户在移动Safari上浏览网页,并且页面执行pageA.html中的JavaScript函数,然后导航到pageB.html,接着按下返回按钮回到pageA.html时,JavaScript函数将不会运行。它会跳过JavaScript调用。

我尝试了上面链接中提到的解决方案,但对于移动Safari来说都没有用。有人遇到过这个bug吗?你是怎么处理的?


2
如果链接中没有 ?,您可以尝试将所有链接 URL 后添加 ?。例如:href="next.html" 变成 href="next.html?"。这将向网络浏览器提供提示,即页面内容是动态的,重新访问该页面应该重新从服务器加载页面。这也适用于外部脚本。例如:src="mylib.js" 变成 src="mylib.js?" - Jay
1个回答

94

这是由后退前进缓存引起的。它可以在用户导航离开页面时保存完整状态。当用户使用后退按钮导航回来时,页面可以非常快地从缓存中加载。这与仅缓存HTML代码的常规缓存不同。

当页面被加载到后退前进缓存时,onload事件不会被触发。相反,您可以检查onpageshow事件的persisted属性。它在初始页面加载时设置为false。当页面从后退前进缓存中加载时,它设置为true。

window.onpageshow = function(event) {
    if (event.persisted) {
        alert("From back / forward cache.");
    }
};

因为某些原因,jQuery在事件中没有这个属性。但你可以从原始事件中找到它。

$(window).bind("pageshow", function(event) {
    if (event.originalEvent.persisted) {
      alert("From back / forward cache.");
    }
});

当浏览器后退按钮被按下时,一个快速的解决方案是重新加载页面。然而,这会使回退/前进缓存的任何积极效果失效。

window.onpageshow = function(event) {
    if (event.persisted) {
        window.location.reload() 
    }
};

值得一提的是,你会看到很多页面提供使用空的onunload处理程序作为解决方案。自iOS5以来,这种方法已经不再起作用。

$(window).bind("unload", function() { });

5
请注意,这个解决方案在当前版本的iOS上不再有效(我记得在5以上的版本已经失效)。对于页面历史状态,"pageshow"事件将仅在第一次后退/前进时触发,并且再也不会触发。除此之外,我找到的唯一可行的解决方案是利用"popstate"事件来识别后退/前进。 - Shiboe
2
自iOS5以来,空的onunload处理程序就没有起作用。上面的答案适用于iOS6。不确定iOS7是否适用。稍后会进行测试。 - Mika Tuupola
1
这在iOS7上可以工作,但如果屏幕被关闭然后再次打开,它也会刷新页面。有什么办法可以避免这种情况吗? - Dave4988
7
抱歉,但这在我的OSX和Safari上无法运行。event.persisted始终为false。 我做错了什么吗? - MadKian88
2
据我所知,这在现代浏览器中不起作用。将代码插入到<head>中,并且使用console.log()alert()命令输出event.persisted的值,结果总是返回false。在Windows上测试了FF 54和Chrome 59以及iOS 10.3.2上的Safari,但都没有效果。 - indextwo
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接