window.onbeforeunload无法在iPad上运行?

时间:2010-07-13 17:38:59

标签: javascript ios ipad onbeforeunload

有人知道iPad上是否支持onbeforeunload事件和/或是否有不同的使用方式?

我已经尝试了很多东西,似乎永远不会在iPad(Safari浏览器)上触发onbeforeunload事件。

具体来说,这就是我尝试过的:

  • window.onbeforeunload = function(event) { event.returnValue = 'test'; }
  • window.onbeforeunload = function(event) { return 'test'; }
  • (以上两者一起)
  • window.onbeforeunload = function(event) { alert('test')'; }
  • (所有上述功能,但在<body onbeforeunload="...">

所有这些都适用于PC上的FF和Safari,但不适用于iPad。

此外,我在加载页面后完成了以下操作:

alert('onbeforeunload' in window);
alert(typeof window.onbeforeunload);
alert(window.onbeforeunload);

分别是:

  • true
  • object
  • null

因此,浏览器确实具有该属性,但由于某种原因它不会被解雇。

我尝试离开页面的方法是点击后退和前进按钮,在顶部栏中进行谷歌搜索,更改地址栏中的位置,然后点击书签。

有没有人知道发生了什么?我非常感谢任何意见。

谢谢

8 个答案:

答案 0 :(得分:18)

我发现onunload()事件会触发。这种行为有点奇怪;你在附加到事件的回调函数中拥有的任何东西实际上是在新页面加载到后台后运行的(你不能告诉它已加载,但服务器日志记录会显示它已经加载)。

更奇怪的是,如果你的onunload()中有一个confirm()调用,并且用户点击了一个链接去了其他地方,你就可以了。但是,如果用户关闭了iPad Safari浏览器选项卡,则会触发onunload()事件,但您的confirm()将作为响应隐式取消。

答案 1 :(得分:11)

在ipad和iphone以及台式机/笔记本电脑/其他浏览器上,这个JavaScript适用于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!
    ...
} );

答案 2 :(得分:4)

只有Apple肯定会知道,但我的猜测是他们故意没有在移动版Safari中启用该功能,因为它最常被阴影角色用来让你留在他们的网站上或弹出很多色情/广告窗户。

答案 3 :(得分:3)

onbeforeunload有一个known bug in WebKit。我相信它已经在Chrome 5的最新测试版中得到了修复,但iPad的浏览器很可能是由没有修复的WebKit版本制作的。

Related Chrome bug report

答案 4 :(得分:3)

Mobile Safari不支持

beforeunload事件。您可以在此处查看所有支持的活动的列表:Handling Events Apple documentation

而且前载不在列表中!

答案 5 :(得分:2)

https://code.google.com/p/chromium/issues/detail?id=97035

见听。

  页面解雇事件(beforeunload,unload,pagehide)中不再允许

警告。

我认为警报,提示,确认以及其他类似行为也不再允许。

答案 6 :(得分:1)

如果您只是想知道页面是否已经离开,您可以使用document.unload。它在ios浏览器中工作正常。如果您在Apple documentation上看到,您发现它已被弃用,他们建议您使用document.pagehide

答案 7 :(得分:0)

以下是适用于所有现代浏览器的解决方案:

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

因此,重要的是包括两个事件以涵盖所有场景。

NB

在我的示例中,我使用了console.log而不是alert,因为当从alertbeforeunload进行调用时,visibilitychange会被某些浏览器阻止。