window.onbeforeunload不适用于iPad?

问题描述:

有谁知道iPad上是否支持onbeforeunload事件和/或是否有其他方式使用它?window.onbeforeunload不适用于iPad?

我已经尝试了几乎所有的东西,并且它似乎从未在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

所以,浏览器确实有这个属性,但由于某种原因它不会被解雇。

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

有没有人对发生了什么有所了解?我非常感谢任何输入。

感谢

+0

谢谢两位您的输入。这一定是你提到的原因之一。不幸的是,苹果公司没有关于这个和其他限制的官方文件。希望他们能够提出一种更有创意的方式来启用此功能,同时防止恶意使用它。我经常听说人们不小心从页面中跳出,并丢失了他们在表单中输入的所有数据。 – 2010-07-16 17:15:07

+0

您是否尝试过使用'addEventListener()'? – Hello71 2011-01-28 02:52:15

+2

我很确定'beforeunload'在iOS上的Safari上不起作用。 :-(也许不是你在找什么,但我有一个关于如何[可靠地测试一个正在工作的'beforeunload']的建议(http://*.com/a/18137334/345716) – 2013-08-08 22:36:25

只有苹果将肯定知道,但我的猜测是,他们故意不能够在移动Safari浏览器这个功能,因为它是最常用的黑幕字符来让你留在他们的网站或弹出大量的色情/广告窗口。

+46

或者,你知道,自动保存你的改变,所以不会因为你不小心点错了东西而丢失。 – 2010-07-14 17:38:12

+4

我没有说没有有效的用途,我只是说这些是最常用的。 – 2010-07-14 18:38:19

+3

@JoelMueller您的评论应该是被接受的答案:) – 2014-04-22 13:30:24

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

Related Chrome bug report

+1

我很困惑或iPad浏览器中是否存在此错误? – Peter 2016-02-19 14:21:52

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

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

+0

你有这个解决方法的例子吗? – testndtv 2011-07-30 16:50:21

+0

呵呵,似乎这确认了怪癖(第二页在确认消息之前被击中)不仅适用于移动Safari,也适用于Firefox(也可能适用于其他)。你只是吹了我的脑海。 – Amalgovinus 2011-08-03 23:59:24

+2

'unload'事件弃用'pagehide'支持请参阅https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511 -SW5 – sol0mka 2016-06-09 13:58:19

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

+0

'document.pagehide'对我很好,谢谢! – yarl 2015-09-08 08:54:07

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

看到听到的。

页面解除事件(beforeunload,unload,pagehide)之前不再允许警报。

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

移动Safari不支持beforeunload事件。您可以在此处看到所有受支持事件的列表:Handling Events Apple documentation

并且beforeunload不在列表中!

Javascript代码对我的作品在Safari和Chrome在iPad和iPhone,以及台式机/笔记本/其他浏览器:

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! 
    ... 
}); 
+1

它可以捕捉事件,但是如何弹出确认提示?使用'返回'测试';'类似于操作不起作用.. – user2335065 2015-07-05 16:33:18

+0

谢谢我错过了原来的问题。我没有专门在iOS上测试过,但可能添加这个额外的行将工作:\t window.event.cancelBubble = true; 我会添加到我的答案 – Danger 2015-07-07 19:59:51

+2

谢谢,但可悲的是它不起作用... 我试图把alert()放在它里面,似乎新的页面已经在alert()被触发之前加载。另请参阅: http://*.com/questions/3239834/window-onbeforeunload-not-working-on-the-ipad – user2335065 2015-07-08 02:26:09