2010-07-13 160 views
68

有誰知道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://stackoverflow.com/a/18137334/345716) – 2013-08-08 22:36:25

回答

4

只有蘋果將肯定知道,但我的猜測是,他們故意不能夠在移動Safari瀏覽器這個功能,因爲它是最常用的黑幕字符來讓你留在他們的網站或彈出大量的色情/廣告窗口。

+46

或者,你知道,自動保存你的改變,所以不會因爲你不小心點錯了東西而丟失。 – 2010-07-14 17:38:12

+4

我沒有說沒有有效的用途,我只是說這些是最常用的。 – 2010-07-14 18:38:19

+3

@JoelMueller您的評論應該是被接受的答案:) – 2014-04-22 13:30:24

3

有一個known bug in WebKit與onbeforeunload。我相信它已經在Chrome 5的最新測試版中得到修復,但iPad的瀏覽器很可能是由沒有修復的WebKit版本構成的。

Related Chrome bug report

+1

我很困惑或iPad瀏覽器中是否存在此錯誤? – Peter 2016-02-19 14:21:52

13

我發現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

1

如果你只是需要知道頁面是否已經離開,你可以使用document.unload。它在ios瀏覽器中正常工作。如果您看到Apple documentation你會發現,它的棄用,他們建議使用document.pagehide

+0

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

8

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://stackoverflow.com/questions/3239834/window-onbeforeunload-not-working-on-the-ipad – user2335065 2015-07-08 02:26:09