簡體   English   中英

如何在IE中的文檔上觸發“onload”事件

[英]How to fire “onload” event on document in IE

我目前正在為Javascript方法開發單元測試,以檢測文檔的准備情況。 此代碼已經處於框架級別,因此請避免在jQuery或其他庫中實現此代碼。

我已使用以下代碼成功模擬了'readystatechange'更改事件:

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

我沒有為'load'事件做同樣的事情。 以下代碼導致IE7中的無效參數錯誤,在最后一行調用fireEvent拋出:

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

有沒有人這樣做過,或者之前沒有這樣做過? 我也對任何以不同方式解雇事件的建議感興趣。

編輯:按照Crescent Fresh的建議,我將代碼更改為:

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

沒有更多的錯誤,但'onload'的監聽器不會觸發。 這是我配置它的方式:

document.attachEvent('onload',listener);

根據MSDN的這個頁面, document沒有onload事件。

你想要window.onloaddocument.body.onload 這些在IE中是相同的:由於歷史原因, <body onload="...">實際上設置了window.onload ,因此MS決定使document.body.onload成為window.onload的別名。

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

出於某種原因,在加載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>

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

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

你試圖解雇readystatechange會得到什么結果? readyState值是否實際發生了變化? 是否,這也沒有多大用處:要么使用未更改的readyState來觸發事件,要么使用不是文檔狀態的有效反映的readyState來執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM