89

有谁知道onbeforeunloadiPad 是否支持该事件和/或是否有不同的使用方式?

我已经尝试了几乎所有东西,似乎onbeforeunload从未在 iPad(Safari 浏览器)上触发该事件。

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

  • 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

因此,浏览器确实具有该属性,但由于某种原因它没有被触发。

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

有没有人知道发生了什么?我将不胜感激任何意见。

谢谢

4

8 回答 8

24

这段 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!
    ...
} );
于 2015-06-25T01:08:45.183 回答
20

我发现 onunload() 事件确实会触发。它的行为有点奇怪;附加到事件的回调函数中的任何内容实际上都是在新页面在后台加载后运行的(您无法判断它是否已加载,但服务器日志记录会显示它已加载)。

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

于 2011-01-28T02:09:25.560 回答
6

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

于 2010-07-14T16:53:47.233 回答
3

WebKit中有一个已知的错误与 onbeforeunload。我相信它已在 Chrome 5 的最新测试版中得到修复,但 iPad 的浏览器很可能是由没有修复的 WebKit 版本制成的。

相关的 Chrome 错误报告

于 2010-07-14T17:36:44.800 回答
3

Mobile Safari 不支持 beforeunload 事件。您可以在此处查看所有受支持事件的列表:处理事件 Apple 文档

并且 beforeunload 不在列表中!

于 2015-05-07T13:08:29.193 回答
2

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

见闻。

在页面关闭事件期间不再允许警报(在卸载、卸载、页面隐藏之前)。

我认为警报、提示、确认和其他类似的操作也不再被允许。

于 2015-01-09T07:05:24.360 回答
2

这是一个适用于所有现代浏览器的解决方案:

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文档卸载时无法调用。见:这里

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

注意

我在我的示例中使用console.log了代替,因为当从或调用时会被某些浏览器阻止。alertalertbeforeunloadvisibilitychange

于 2018-10-17T22:33:06.363 回答
1

如果您只需要知道页面是否已离开,您可以使用document.unload. 它在 ios 浏览器中运行良好。如果您在Apple 文档中看到,您会发现它已被弃用,他们建议使用 document.pagehide

于 2014-10-04T13:57:20.387 回答