2009-11-13 116 views
1

我想將一個函數綁定到Javascript中的子窗口的beforeunload事件。 我有下面的代碼:在Firefoxwindow.onbeforeunload在子窗口中未觸發

newWind = window.open(settings.url, "Dialog", "width=" + settings.width + ",height=" + settings.height + ",resizable=" + settings.resizable + ",scrollbars=" + true); 

newWind.onunload = function() { alert('test'); } 

工作正常,但在IE7中失敗。任何人都可以看到我做錯了什麼?

+0

根據你的標題,你的意思是設置newWind.onbeforeunload? 我還認爲在「settings.url」頁面中定義onbeforeunload不是一個選項嗎? – scunliffe 2009-11-13 11:43:38

回答

4
newWind.onunload = function() { alert('test'); } 

IE不會讓您指定從一個窗口上下文功能到另一個窗口對[前]卸載,出於某種原因。你可以分配一個外部函數給其他事件處理程序,包括newWind.document.body.onunload,但它不是一個好主意。

首先,因爲IE的垃圾收集是基於窗口的,所以如果關閉或導航開啓器窗口,彈出窗口會嘗試執行一個死函數,或者在範圍內使用死變量函數,導致奇怪的JavaScript錯誤。

其次,因爲您不知道何時彈出文檔被加載足以能夠設置處理程序。在調用open之後,彈出文檔可能根本沒有開始加載,在這種情況下,您無法安全地設置任何事件處理程序。因此,在設置onunload處理程序之前,您需要很短的延遲時間,並且用戶可能會在此期間關閉該窗口。開幕式不知道要拖延多久;相反,子對話框將不得不調用父回來告訴它已準備就緒。最好是讓小孩子彈出來接收自己的事件,並且告訴開放者讓它知道它們。

跨窗口腳本編程有無窮的陷阱。儘量避免它。對於對話框總是使用頁內元素,這比窗口彈出窗口更可靠,更不討厭。

0

我使用下面的技巧,找出當孩子窗口被關閉:

function checkChildWindow(win, onclose) { 
    var w = win; 
    var cb = onclose; 
    var t = setTimeout(function() { checkChildWindow(w, cb); }, 500); 
    var closing = false; 
    try { 
     if (win.closed || win.top == null) //happens when window is closed in FF/Chrome/Safari 
     closing = true;   
    } catch (e) { //happens when window is closed in IE   
     closing = true; 
    } 
    if (closing) { 
     clearTimeout(t); 
     onclose(); 
    } 
} 

function openWindow(url) { 
    ... 
    var wnd = window.open(url, "window_name", "[...flags...]"); 
    checkChildWindow(wnd, function() { alert('child was closed!'); }); 
    ... 
} 
相關問題