我有以下处理程序:
$(window).bind('pageshow', function() { alert("back to page"); });
当我离开页面(通过按下链接)并返回页面(通过按下“返回”按钮)时,不会调用alert() (iPad 2,iOS 5.1)。
请问我做错了什么?我需要绑定的任何其他事件?
PS:有趣的是,在离开页面时会正确接收页面隐藏。
我有以下处理程序:
$(window).bind('pageshow', function() { alert("back to page"); });
当我离开页面(通过按下链接)并返回页面(通过按下“返回”按钮)时,不会调用alert() (iPad 2,iOS 5.1)。
请问我做错了什么?我需要绑定的任何其他事件?
PS:有趣的是,在离开页面时会正确接收页面隐藏。
您可以检查事件的persisted
属性pageshow
。它在初始页面加载时设置为 false。从缓存加载页面时,它设置为 true。
window.onpageshow = function(event) {
if (event.persisted) {
alert("back to page");
}
};
由于某种原因,jQuery 在事件中没有这个属性。您可以从原始事件中找到它。
$(window).bind("pageshow", function(event) {
if (event.originalEvent.persisted) {
alert("back to page");
}
};
这可能是一个缓存问题。当您通过“返回”按钮返回页面时,页面将从缓存中拉出(行为取决于浏览器)。因此,您的 JS 不会触发,因为页面已经在缓存中呈现并且重新运行您的 js 可能对布局等有害。
您应该能够通过调整响应中的缓存标头或使用一些浏览器技巧来克服这个问题。
以下是有关该问题的一些链接:
编辑
这些都是从上面的链接中提取的:
history.navigationMode = 'compatible';
<body onunload=""><!-- This does the trick -->
pageshow
and的特殊事件pagehide
。”$(document).ready(handler)
window.onunload = function(){};
你在那里做的是将返回值绑定alert("back to page")
为回调。那是行不通的。您需要绑定一个函数:
$(window).bind('pageshow', function() { alert("back to page"); });
我添加了相同的问题,即 iOS 在返回时并不总是发布“pageshow”事件。
如果没有,safari 会继续在页面上执行 JS,所以我认为计时器会继续触发。
所以我提出了这个解决方案:
var timer;
function onPageBack() { alert("back to page"); }
window.addEventListener('pageshow', function() {
if (event.persisted)
onPageBack();
// avoid calling onPageBack twice if 'pageshow' event has been fired...
if (timer)
clearInterval(timer);
});
// when page is hidden, start timer that will fire when going back to the page...
window.addEventListener('pagehide', function() {
timer = setInterval(function() {
clearInterval(timer);
onPageBack();
}, 100);
});
我就这样解决了这个问题;
$(window).bind("pageshow", function () {
setTimeout(function () {
back();
}, 1000);
});
function back() {
//YOUR CODES
}
你应该检查你的页面是否有 iFrame 组件?我不知道为什么,但我删除了 iFrame 组件来解决这个问题