2009-07-10 152 views
9

我之前已經問過這個問題,並且從某種意義上說問題已經解決了一半,我發現Javascript有一些嚴格的安全性。子窗口關閉時如何運行父窗口的功能?

我所學到的:父窗口打開一個子窗口。子窗口重定向到不同的域並被重定向回來。它試圖在關閉自身時觸發父窗口的功能。

window.opener.startLoad(); 

這會導致權限(安全)問題,並且不起作用。

(一半)新問題:如何獲得一個窗口來打開子窗口,何時關閉在父窗口中運行一個函數?

我需要這樣做,因爲這將是發生了很多非常有效的方式!

謝謝你的幫助。

+0

爲了迴應您對我的回答的最新評論,我恐怕無法想到在窗口關閉時不會調用該函數的原因。你可以在你打開窗口的地方發佈你的代碼,以及你在關閉時試圖調用的函數嗎?我可能能夠幫助你,但現在我沒有想法。 – Sean 2009-07-11 23:31:49

回答

19

試試這個:

var win = window.open(url, name); 
win.onunload = afterChildClose; // afterChildClose() is the function. 
win.close(); // afterChildClose() should fire now. 

所有這些代碼將設在父窗口的JavaScript執行(包括afterChildClose())。您正在創建窗口並將該功能分配給卸載事件。

哦,我剛想到的一件事。如果子窗口刷新或導航到另一個URL,則onunload事件也會觸發。如果您只想在窗口關閉時觸發事件,則應在win.closed中的afterChildClose()中包含一個檢查。

編輯:這裏是代碼,我放在一起嘗試這兩個示例頁面。

父窗口:

<html> 
<body> 
<script type="text/javascript"> 
    var win = window.open("secondwindow.html", "woo"); 
    win.onunload =onun; 

    function onun() { 
     if(win.location != "about:blank") // This is so that the function 
              // doesn't do anything when the 
              // window is first opened. 
     { 
      alert("closed"); 
     } 
    } 
</script> 
</body> 
</html> 

子窗口( 「secondwindow.html」):

<html> 
<body> 
<script type="text/javascript"> 
    setTimeout('window.close();', 5000); 
</script> 
</body> 
</html> 

當我嘗試打開Firefox中的第一個文件,它打開的窗口,窗口等待5秒和退出,並且第一個文檔顯示alert(),所以即使在子窗口關閉時它仍在工作。

+0

afterChildClose函數駐留在哪裏? – Abs 2009-07-10 23:54:31

2

我降落在這裏尋找類似的功能,但不可能完全得到它與跨瀏覽器兼容工作。因此,這裏是另一種方式作爲一個子窗口關閉執行代碼:

var win = window.open("http://www.google.com"); 

var winClosed = setInterval(function() { 

    if (win.closed) { 
     clearInterval(winClosed); 
     location.assign("http://www.bing.com/"); //Execute your code here 
    } 

}, 250); 

它不使用任何事件處理程序從子窗口,它並不需要修改子窗口中的內容。