2010-07-20 26 views
53

這個問題幾乎全部在標題中。是否可以用javascript打開一個彈出窗口,然後檢測用戶何時關閉它?

是否有可能(以及如何?)用JavaScript打開彈出窗口,然後檢測用戶什麼時候關閉它?

我在項目中使用jquery,所以jQuery解決方案會很好。乾杯!

+0

一個彈出式瀏覽器? – Reigel 2010-07-20 15:43:59

+0

定義「彈出」。我們在談論某種頁面渲染模式框嗎?一個JavaScript警報?一個新的瀏覽器窗口? – 2010-07-20 15:54:50

+1

新的瀏覽器窗口...對不起我的缺乏清晰度 – Pablo 2010-07-20 15:58:14

回答

81

如果你有在彈出的內容的控制,有處理窗口的unload事件,並通過opener物業通知原窗口,首先檢查開啓者是否已關閉。請注意,這不會在Opera中始終有效。

window.onunload = function() { 
    var win = window.opener; 
    if (!win.closed) { 
     win.someFunctionToCallWhenPopUpCloses(); 
    } 
}; 

因爲每當用戶在彈出的頁面導航離開,而不只是在關閉窗口,你應該檢查彈出已someFunctionToCallWhenPopUpCloses實際關閉的unload事件將觸發:

var popUp = window.open("popup.html", "thePopUp", ""); 
function someFunctionToCallWhenPopUpCloses() { 
    window.setTimeout(function() { 
     if (popUp.closed) { 
      alert("Pop-up definitely closed"); 
     } 
    }, 1); 
} 

如果你沒有在彈出的內容的控制,或者如果你的目標瀏覽器一個不支持unload事件,你在主窗口減少到某種輪詢的解決方案。調整適合的時間間隔。

var win = window.open("popup.html", "thePopUp", ""); 
var pollTimer = window.setInterval(function() { 
    if (win.closed !== false) { // !== is required for compatibility with Opera 
     window.clearInterval(pollTimer); 
     someFunctionToCallWhenPopUpCloses(); 
    } 
}, 200); 
+2

我推薦輪詢解決方案,而不是'unload'事件,因爲它與更多瀏覽器兼容(請參閱https://opera-bugs.jottit.com/)。 – 2012-05-16 16:28:00

+0

@JonathonHill:同意。我在答案的早些時候提到了歌劇問題,但我應該更清楚地表達這一觀點。感謝編輯。順便說一句,在Opera中需要'window.closed!== false'的原因是什麼? – 2012-05-16 22:39:24

+0

這是一個解決Opera中的bug的解決方法。我從https://opera-bugs.jottit.com/發現它。 – 2012-05-17 04:36:18

0

我現在唯一能想到的方法是在你的父頁面上創建一個函數,該函數在10秒後自動調用它自己的超時。在函數中,您還可以檢查cookie的值以查看它是真是假。當彈出窗口關閉時,將cookie設置爲true。

希望這會有所幫助。

+0

忽略此。 AJM的方式要容易得多。 + rep – 2010-07-20 15:48:04

4

嘗試查看unloadbeforeunload窗口事件。當通過一些被關閉的窗口這樣的監測,這些應該給你一個機會,打電話回來的時候DOM卸載:

var newWin = window.open('/some/url'); 
newWin.onunload = function(){ 
    // DOM unloaded, so the window is likely closed. 
} 
+0

非常感謝ajm。無論如何,有任何機會獲得彈出的網址? – Pablo 2010-07-20 15:51:04

+0

這不適用於跨瀏覽器。你需要在彈出窗口中處理'unload'事件。 – 2010-07-20 15:53:57

+0

每當有新的請求時,不僅在窗口關閉時卸載。 – 2010-07-20 17:28:32

5

如果你可以使用jQuery UI Dialog,它實際上有一個close事件。

+8

jQuery不是解決所有問題的方法:)。 – s4y 2010-07-20 20:41:34

+10

確實如此。我應該用「if」一詞開始我的回答,如「如果您可以使用jQuery UI對話框」,而不僅僅是*假設*有可能。嘿!等一下... – eje211 2010-07-20 22:46:30

+3

而且,談到JavaScript時,jQuery從來都不是問題的解決方案,但它通常是一個巨大的,巨大的**巨大**解決方案快捷方式,不管它是什麼。您可以通過採用風景路線瞭解更多信息,但在很多情況下,我和大多數人更喜歡(巨大,巨大,**巨大**)jQuery快捷方式。 – eje211 2010-07-20 22:49:40

0

是,辦理彈出窗口onbeforeunload事件,然後使用調用父窗口上的功能:

window.opener.myFunction() 
3

要打開一個新的窗口,電話:

var wnd = window.open("file.html", "youruniqueid", "width=400, height=300"); 

如果你只是想要知道該窗口何時關閉,請使用onunload

wnd.onunload = function(){ 
    // do something 
}; 

如果您想要在用戶確認之前關閉它,請使用onbeforeunload

wnd.onbeforeunload = function(){ 
    return "are you sure?"; 
}; 
+1

這不適用於跨瀏覽器。您需要處理彈出文檔中的'unload'事件。 – 2010-07-20 16:00:43

+0

每當有新的請求時,不僅在窗口關閉時卸載。 – 2010-07-20 17:29:07

3

我們在我的一個項目中工作。

訣竅是在您的父頁面中有一個JS函數,當彈出窗口關閉時您打算調用它,然後在彈出窗口中掛鉤卸載事件。

window.opener屬性是指產生此彈出窗口的頁面。

例如,如果我寫了我原來的頁面上名爲callingPageFunction功能,我把它叫做從彈出這樣的:

$(window).unload(function() { 
    window.opener.callingPageFunction() 
}); 

有兩點需要注意:

  1. 這應該被包裹準備就緒的功能。
  2. 我有一個匿名的功能,因爲你可能在想其他的邏輯有
2

有一個非常簡單的解決方案,您的問題。

首先製作一個新的對象,這將打開一個彈出這樣的:

var winObj = window.open('http://www.google.com','google','width=800,height=600,status=0,toolbar=0'); 

爲了知道什麼時候這個彈出窗口關閉,你只需要保持與類似下面的循環檢查這一點:

var loop = setInterval(function() { 
    if(winObj.closed) { 
     clearInterval(loop); 
     alert('closed'); 
    } 
}, 1000); 

現在你可以用你想要的任何javascript代碼替換alert。

玩得開心! :)

相關問題