2009-12-09 35 views
7

中的文檔上觸發「onload」事件我目前正在爲Javascript方法開發單元測試,以檢測文檔的準備情況。這段代碼已經在框架級別了,所以請避免提到這已經在jQuery或其他庫中實現。如何在IE

我已經成功地模擬了「readystatechange」改變事件用下面的代碼:

var event; 
event = document.createEventObject(); 
event.type = 'readystatechange'; 
document.fireEvent('onreadystatechange',event); 

我沒有爲「負荷」事件這樣做。在IE7無效參數錯誤,由調用拋出下面的代碼結果fireEvent最後一行:

event = document.createEventObject(); 
event.type = 'load'; 
document.fireEvent('onload',event); 

有沒有人這樣做,或失敗之前做到這一點?我也對任何建議以不同的方式解決事件感興趣。

編輯:由新月新鮮的建議下,我改變了我的代碼:

event = document.createEventObject(); 
event.type = 'load'; 
document.body.fireEvent('onload',event); 

沒有更多的錯誤,但是對於「onload事件」聽者不火。下面是我如何配置它:

document.attachEvent('onload',listener); 
+1

'load'事件實際上在'document.body'上觸發。所以你可以試試'document.body.fireEvent('onload',event)'。我懷疑這實際上會觸發連接到'onload'的句柄。如果它確實讓我震驚...... – 2009-12-09 16:22:41

+0

你是100%的權利。在document.body上觸發事件可以沒有錯誤地完成,但是不會觸發附加了document.attachEvent的偵聽器。 – 2009-12-09 16:32:13

+0

@Eric:這麼想。這是一個無賴的人。 – 2009-12-09 16:42:07

回答

4

根據this page at MSDNdocument沒有onload事件。您需要window.onloaddocument.body.onload。這些在IE中是相同的:由於歷史原因,<body onload="...">實際上設置爲window.onload,因此MS決定使document.body.onload別名爲window.onload

問題在於 - 正如Eric在評論中提到的那樣 - 似乎沒有辦法手動觸發窗口事件,這意味着可能沒有Eric的問題的解決方案。

+1

@Christoph:好點,Crescent Fresh已經提到:我應該在document.body上發起事件。對window.onload有趣的評論,但沒有那麼有用,因爲window沒有fireEvent方法。 – 2009-12-09 16:38:00

+0

@Christoph感謝您編輯您的答案。我會接受它作爲這個有趣的討論的結論。 – 2009-12-09 17:41:50

0

當文檔(包括外部資源,如圖像)完全加載,而不是之前加載事件將觸發。

你試圖觸發什麼結果readystatechangereadyState價值實際上是否改變?無論是否這兩者都沒有太大的用處:或者您使用readyState來觸發未發生變化的事件,或者您使用readyState來觸發該事件,但這不是對文檔狀態的有效反映。

+0

@NickFitz附加在IE中觸發'onload'事件的偵聽器感謝你的回答。我不想改變document.readyState的值,它之前保持'完整'(因爲我有一個等待,直到readyState變成'complete')並且在我的測試之後。請記住,此代碼是爲單元測試編寫的。 – 2009-12-09 16:35:11

+0

@NickFitz:Eric只是試圖模擬真實世界的'load'事件進行本地單元測試。 – 2009-12-09 16:41:28

+0

如果是單元測試,那麼根本不需要觸發任何事件。只需創建一個具有已知值的模擬事件對象,並直接調用事件處理程序,然後檢查它是否爲這些值生成了正確的結果。否則,它不是一個單元測試,它是一個集成測試:您正在測試代碼如何與瀏覽器的內部事件處理機制集成。 – NickFitz 2009-12-10 11:29:59

3

出於某種原因,在DOM加載後,IE看起來會覆蓋windowonload屬性和一個空對象。至少是這樣的話,當你嘗試從一個DOM元素的任何事件處理程序中訪問它...

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Test by Josh</title> 
    <script type="text/javascript"> 
     window.onload = function() { 
     alert("Test"); 
     } 
     alert(typeof window.onload); 
    </script> 
    </head> 
    <body> 
    <h1 onclick="alert(typeof window.onload);">Test</h1> 
    </body> 
</html> 

在這種情況下,你會看到在window.onload被確認爲一個功能,那麼你會看到「測試」警報。當你點擊標題時,你會看到window.onload現在是一個object。我試着迭代對象的屬性,但它是空的。這並不酷。

一個蹩腳的解決方法是抓取可訪問範圍中的函數,並將其分配給您可以在方便時觸發的其他屬性...

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Test by Josh</title> 
    <script type="text/javascript"> 
     window.onload = function() { 
     alert("Test"); 
     }   
    </script> 
    </head> 
    <body> 
    <h1 onclick="window.onloadfix()">Test</h1> 
    <!-- Could potentially be injected via server-side include if needed --> 
    <script type="text/javascript"> 
     window.onloadfix = function() { 
     window.onload(); 
     } 
    </script> 
    </body> 
</html> 

我想不出任何其他方式來解決這個問題了。

+0

@Josh Stodola有趣...我今天發現document.attachEvent不是IE中的一個函數:你當然可以調用它,但(typeof document.attachEvent)返回「object」和document.attachEvent.call和document。 attachEvent.apply未定義...這個瀏覽器永遠不會停下來讓我感到驚訝。 – 2009-12-09 21:18:18