有谁知道 iPad 是否支持 onbeforeunload
事件和/或是否有不同的使用方式?
我几乎尝试了所有方法,似乎从未在 iPad(Safari 浏览器)上触发 onbeforeunload
事件。
具体来说,这是我尝试过的:
window.onbeforeunload = function(event) { event.returnValue = 'test'; }
window.onbeforeunload = function(event) { return 'test'; }
(以上两者加起来)
window.onbeforeunload = function(event) { alert('test')'; }
(所有上述功能,但在
所有这些都适用于 PC 上的 FF 和 Safari,但不适用于 iPad。
此外,我在加载页面后完成了以下操作:
alert('onbeforeunload' in window);
alert(typeof window.onbeforeunload);
alert(window.onbeforeunload);
结果分别是:
真的
目的
无效的
因此,浏览器确实具有该属性,但由于某种原因它没有被触发。
我尝试离开页面的方法是单击后退和前进按钮,在顶部栏中进行谷歌搜索,更改地址栏中的位置以及单击书签。
有没有人知道发生了什么?我将不胜感激任何意见。
谢谢
addEventListener()
?
beforeunload
在 iOS 上的 Safari 上不起作用。 :-( 也许不是您要找的东西,但我有一个关于如何reliably test for a working beforeunload
的建议
window.onbeforeunload = function(event) { event.returnValue = 'test'; }
不适用于 iOS 9.2.1 的 Chrome 和 Safari。我真的很喜欢onbeforeunload
,因为如果我点击取消,页面不会改变。
这段 JavaScript 在 ipad 和 iphone 上的 Safari 和 Chrome 以及桌面/笔记本电脑/其他浏览器上适用于我:
var isOnIOS = navigator.userAgent.match(/iPad/i)|| navigator.userAgent.match(/iPhone/i);
var eventName = isOnIOS ? "pagehide" : "beforeunload";
window.addEventListener(eventName, function (event) {
window.event.cancelBubble = true; // Don't know if this works on iOS but it might!
...
} );
我发现 onunload() 事件确实会触发。它的行为有点奇怪;附加到事件的回调函数中的任何内容实际上都是在新页面在后台加载后运行的(您无法判断它是否已加载,但服务器日志记录会显示它已加载)。
更奇怪的是,如果你在 onunload() 中有一个 confirm() 调用,并且用户点击了一个链接去其他地方,那么你在做生意。但是,如果用户关闭 iPad Safari 浏览器选项卡,onunload() 事件将触发,但您的 confirm() 将隐含取消作为响应。
只有 Apple 肯定知道,但我的猜测是他们故意没有在移动 Safari 中启用该功能,因为它最常被阴暗的角色用来让你留在他们的网站上或弹出大量色情/广告窗口。
有一个带有 onbeforeunload 的 known bug in WebKit。我相信它已在 Chrome 5 的最新测试版中得到修复,但 iPad 的浏览器很可能是由没有修复的 WebKit 版本制成的。
Mobile Safari 不支持 beforeunload 事件。您可以在此处查看所有受支持事件的列表:Handling Events Apple documentation
并且 beforeunload 不在列表中!
https://code.google.com/p/chromium/issues/detail?id=97035
见闻。
在页面关闭事件期间不再允许警报(在卸载、卸载、页面隐藏之前)。
我认为警报、提示、确认和其他类似的操作也不再被允许。
这是一个适用于所有现代浏览器的解决方案:
var unloaded = false;
window.addEventListener("beforeunload", function(e)
{
if (unloaded)
return;
unloaded = true;
console.log("beforeUnload");
});
window.addEventListener("visibilitychange", function(e)
{
if (document.visibilityState == 'hidden')
{
if (unloaded)
return;
unloaded = true;
console.log("beforeUnload");
}
});
移动浏览器往往不支持beforeunload
,因为浏览器可以在不卸载页面的情况下进入后台,然后随时被操作系统杀死。
大多数桌面浏览器都包含一个错误,该错误会导致在文档卸载时不会调用 visibilityState
。请参阅:here。
因此,重要的是要包括这两个事件以涵盖所有场景。
注意
我在示例中使用了 console.log
而不是 alert
,因为从 beforeunload
或 visibilitychange
调用 alert
会被某些浏览器阻止。
如果您只需要知道页面是否已离开,您可以使用 document.unload
。它在 ios 浏览器中运行良好。如果您在 Apple documentation 上看到,您会发现它已被弃用,他们建议使用 document.pagehide
return 'test';
不起作用..