2012-02-22 66 views

回答

66

你的榜樣將工作只要彈出窗口的URL是在同一個域中父頁面,你的事件更改爲全部小寫:

var new_window = window.open('some url') 
new_window.onbeforeunload = function(){ my code} 
+3

如果新打開的窗口與父窗口不在同一個域中,該怎麼辦?有沒有黑客? – xiaohan2012 2012-02-22 06:06:45

+11

您可以做的最好的方法是在您的域中打開一個文檔,然後將該遠程URL加載到iframe中,或通過服務器腳本將其讀取並從此處呈現它。 – glortho 2012-02-22 06:23:30

+1

@glortho這種方法比在new_window中定義onbeforeunload事件有什麼優勢嗎?更具體地說,如果這會立即將代碼綁定到new_window,甚至在new_page和它的腳本被加載之前? – 2015-09-08 10:46:14

3

您需要將onbeforeunload事件綁定到打開後的窗口。

最簡單的方法是在窗口源代碼中使用JavaScript onbeforeunload代碼。

有關詳細解釋,請參閱Stackoverflow上的這兩個非常類似的問題herehere

+13

是的,他們是**非常**類似的問題... – jondavidjohn 2012-11-15 19:48:03

+0

謝謝。事實上'onbeforeunload'和'onunload'必須在子窗口加載後才能正常工作。 – Xavi 2013-12-09 22:11:29

11

事件名稱是onbeforeunload而不是onBeforeUnload。 JS是區分大小寫的。

+0

如果我們通過使用附加事件將它作爲內聯屬性附加到html並且html更加敏感那麼這意味着什麼會使其完全沒有區別 – nikoss 2015-08-08 02:28:01

-1
var new_window = window.open('some_url') 

您還可以檢查是否new_window.windownull。但是您需要使用setTimeoutsetInterval函數手動檢查它。

這是btw唯一的方法,當你不在同一個域時如何檢查它。

+0

如果你有一個全局的方法,打開並管理窗口爲你,並根據上下文的url可能是內部或外部 – jimconte 2017-12-06 15:43:06

2

雖然接受的答案是相同的起源正確的,我發現跨起源彈出窗口的解決方案:

var win = window.open('http://www.google.com'); 
var timer = setInterval(function() { 
    if(win.closed) { 
     clearInterval(timer); 
     alert('closed'); 
    } 
}, 1000); 

來源:atashbahar.com

對於那些考慮使用它。

即使Facebook在他們的Javascript SDK中使用這個「黑客」。

你可以通過查看他們的代碼來驗證這一點。只需在https://connect.facebook.net/en_US/sdk.js中搜索.closed即可。