window.onbeforeunload 不适用于 iPad?

IT技术 javascript ios ipad onbeforeunload
2021-02-06 19:15:08

有谁知道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

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

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

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

谢谢

6个回答

这段 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!
    ...
} );
谢谢我在原始问题中错过了这一点。我没有在 iOS 上专门测试过这个,但可能添加这个额外的行会起作用:window.event.cancelBubble = true; 我会添加到我的答案中
2021-03-20 19:15:08
@ user2335065 您是否找到了相同的解决方案。
2021-03-22 19:15:08
谢谢,但遗憾的是它不起作用......我试图将 alert() 放入其中,似乎新页面在 alert() 被触发之前已经开始加载。另请参阅:stackoverflow.com/questions/3239834/...
2021-04-02 19:15:08
伙计们,您是否找到了在离开页面之前显示确认提示的任何解决方案?这适用于除 IOS Safari 之外的所有浏览器。我也尝试过 pagehide 事件,但对我不起作用。提前致谢。
2021-04-05 19:15:08
它可以捕获事件,但如何弹出确认提示?使用return 'test';与 op 类似的方法不起作用..
2021-04-08 19:15:08

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

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

嗯,似乎这个确认怪癖(在确认消息之前点击第二页)不仅适用于移动 safari,而且适用于 Firefox(可能还有其他)。你简直让我大吃一惊。
2021-03-21 19:15:08
@sol0mka:就是这样,伙计!伟大的!在我的情况下,以下代码完成了这项工作,就我所有的浏览器和 iOS 而言: $(window).on('beforeunload pagehide', function() { // 我必须在页面上完成的工作改变 } ); 这应该是我眼中公认的答案。
2021-03-27 19:15:08
unload事件弃用,取而代之的pagehide看到developer.apple.com/library/ios/documentation/AppleApplications/...
2021-04-05 19:15:08
应该注意的是,在某些情况下,浏览器可能无法可靠地触发 unload、beforeunload 和 pagehide 事件。例如,如果移动用户通过应用管理器关闭浏览器应用,pagehide 将不会触发。来源:developer.mozilla.org/en-US/docs/Web/API/Window/pagehide_event
2021-04-05 19:15:08

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

或者,您知道,自动保存您的更改,这样它们就不会因为您不小心点错了东西而丢失。
2021-03-21 19:15:08
@JoelMueller 您的评论应该是公认的答案:)
2021-04-06 19:15:08
@JoelMueller 这正是我的用例。咕噜噜@苹果
2021-04-06 19:15:08
@JoelMueller 能否请您分享任何官方文档,我们可以在其中说明移动 safari 会自动保存更改的声明。
2021-04-08 19:15:08
我没有说没有有效的用途,我只是说那些是最常用的用途。
2021-04-10 19:15:08

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

相关的 Chrome 错误报告

我很困惑,还是 iPad 浏览器上仍然存在此错误?
2021-03-21 19:15:08

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

而 beforeunload 不在列表中!