2011-05-11 60 views
1

我一直在尋找對我的問題的答案 - 迄今爲止沒有運氣。爲什麼窗戶只打開一次`onload`事件?

這裏是我的代碼:

var oNewWindow = window.open(sLink,'_blank'); 
oNewWindow.addEventListener('load',function() { alert('Page loaded'); }, false); 

當彈出窗口/選項卡中打開的處理程序被調用,但如果我瀏覽彈出窗口裏面,處理程序不會被調用。爲什麼?有沒有辦法讓它工作?

基本思想是用戶打開一個彈出窗口,然後在彈出窗口中開始瀏覽,而父窗口中的代碼繼續工作並監視彈出窗口中發生了什麼。彈出頁面是同一個域上的頁面。

第一次加載彈出窗口後,我附加了一個onunload處理程序,它會在父窗口中調用處理程序,然後啓動計時器。然後,父窗口的腳本將與彈出窗口的內容一起工作。但是,如果計時器耗盡且彈出窗口內的舊頁面仍然存在,我得到不正確的數據,並且整個腳本停止,問題就會出現滯後。之後我無法附加另一個onunload處理程序。

onload處理程序是爲整個窗口設置的,而不是窗口內的文檔,那麼爲什麼不是處理程序調用?

另外,我的腳本是在GreaseMonkey的幫助下運行的。因爲我只使用Firefox,所以我不需要跨瀏覽器。

回答

2

一旦用戶導航離開原始頁面,打開的窗口不再具有由打開窗口應用的load事件,這就是爲什麼該警報不會再次觸發。

您可以使用的一種方法是在iframe(www.mypage.com/myframe?url=someurl.com)以內包含所需url的頁面,以便子窗口內的頁面不會更改,但iframe的內容會更改。從這裏您可以告知window.openeriframe內正在發生什麼。

+0

非常好的方法。加載包含iframe的彈出窗口。然後從父腳本訪問iframe並將'onload'事件附加到它,然後'iframe.src = link'。父腳本具有iframe的句柄,因此可以分析內容。 – user1651105 2011-05-11 17:15:10

2

原因是因爲當瀏覽器導航到新頁面時,會爲該頁面初始化一個新的window對象。這可能令人困惑,但最好將window對象視爲與操作系統上運行的進程所擁有的窗口無關。

總之,導航後,父窗口和打開的窗口之間的任何關係都會丟失。

0

另一種替代方法是將腳本塊插入到子窗口中,然後該子窗口將執行附加的「加載」事件。

這樣,它就完全獨立於父窗口。

相關問題