我正在爲客戶端網站上使用的插件編寫JavaScript,並且需要使用beforeunload
處理程序將一些信息存儲到用戶的Cookie或localstorage以進行跟蹤。jQuery中的多個beforeunload處理程序
但是,由於我不控制客戶的網站,我擔心客戶的頁面在我們設置之前已經定義了beforeunload處理程序的情況。特別是,我擔心客戶端的JavaScript創建一個'beforeunload'處理程序,該處理程序返回一個字符串以創建'Are you sure you want to leave this page?'
樣式的彈出窗口,並且在此之後添加處理程序可能會破壞或以其他方式干擾此功能。
在鉻控制檯,基於一個小實驗看來,如果我添加使用jQuery(window).on('beforeunload', handler)
處理程序,那麼所有的處理程序獲得加入他們的順序執行,那麼任何確認對話框的存在和含量僅由最終的非undefined
返回值決定。因此,如果最後一個處理程序添加顯式返回,則返回null
,則不顯示任何消息,並且如果它返回一個字符串,則會顯示一個包含該字符串作爲其內容的確認對話框。這是我想要的行爲;這意味着只要我從beforeunload
處理程序返回undefined
處理程序我添加,我不應該打破我們的任何客戶的代碼。
但是我可以在所有瀏覽器中依賴此行爲嗎?如果客戶端通過除jQuery以外的機制添加了其原始beforeunload
處理程序,如明確指定給window.onbeforeunload
或使用window.addEventListener
? jQuery如何在幕後處理多個處理程序的分配?
'if(window.onbeforeunload){oldBeforeUnload = onbeforeunload; onbeforeunload = function(){yourstuff(); oldBeforeUnload()}' – mplungjan 2013-04-11 15:03:56
@mplungjan首先,這需要'返回oldBeforeUnload()',而不僅僅是'oldBeforeUnload()',或者你打破了現有的功能。其次,我不知道這種方法是否必要,或者是否使用jQuery添加處理程序已經具有這樣的行爲 - 因此是一個問題。我也不知道,如果客戶端使用jQuery,你的方法將打破他們使用jQuery'.off'方法刪除處理程序的能力 - 我懷疑它的確如此。 – 2013-04-11 15:17:58
這只是一個想法。您可能需要同時執行兩項操作 – mplungjan 2013-04-11 15:19:24