2010-03-23 39 views
4

我已經創建了一個與Dom一起工作的腳本,因此它必須等到Dom完成之後才能執行每個操作。我希望這個腳本可以包含在兩個方面:Firefox DOMContentLoaded事件問題

  • 在head標籤中,以便在Dom準備好之前加載它。我已經使用document.addEventListener("DOMContentLoaded",function(){...},false)這個,它運作良好
  • 當Dom已經加載dinamically加載。在這種情況下,腳本不起作用,因爲如果Dom已經加載的DomContentLoaded事件沒有被解僱的原因

所以我想知道,有沒有辦法來檢查,如果Dom已經加載以便腳本可以在不使用DOMContentLoaded事件的情況下執行代碼?

PS:這必須是一個外部腳本,所以我必須在那裏將被列入

回答

2

好吧,這是俗氣,但它應該工作: 總結你的外部腳本在init()方法:

例如(我只是猜測這裏)

var myModule = { 

    init: function { 
     //all the code goes here 
     /.. 
    } 
} 

然後把你的腳本導入回頭標記,並在你的DOM標記的最底部添加腳本標籤

<script> 
    myModule.init(); 
</script> 

我再次止跌」噸通常建議它,但如果你需要避免檢查DOM的加載事件,我會做

0

一做這將是檢查是否可以在最後的getElementById的東西,最簡單的方法在網頁上的控制的頁面。例如:

if (document.getElementById('footer')) { /* Dom is probably loaded */ } 
else { /* Dom is probably NOT loaded */ } 

但實際上,最好的做法可能是確保代碼總是以相同的方式調用。您可以使用「onload」事件,因爲這可以在所有瀏覽器中使用,並且通常在DOMContentLoaded事件之後只需幾分之一秒。但是,我想這真的取決於你。

+1

我已經想過這種方法,但我不知道頁面中有哪些元素,所以我無法檢查元素的存在,並且出於同樣的原因,我無法使用onload事件。 – mck89 2010-03-23 15:03:54

0

定義你的函數: function domReadyHandler() { /* ... */ }

添加事件偵聽器: document.addEventListener('DOMContentLoaded', domReadyHandler, false);

執行處理後,動態加載您的內容,也: function myXhrCallback() { /* ... */; domReadyHandler(); }

+0

這意味着我必須更改站點的整個系統,但我只想使用腳本。 – mck89 2010-03-23 15:07:15

+0

我認爲你在XHR上使用了一個包裝。如果是這樣,也許你可以在XHR響應完成時手動觸發「DOMContentLoaded」? – janmoesen 2010-03-23 15:35:04

+1

不,我不使用任何XHR包裝,並且此腳本不能依賴於任何庫,這必須是外部腳本,因此我無法控制該網站的HTML代碼。 – mck89 2010-03-23 15:53:55

0

您可以設置一個全局變量說該腳本將被動態地包含在內,根據這一點,您可以在腳本被評估時觸發負載監聽器。

window.SCRIPT_IS_DYNAMICALLY_LOADED = true; 
< include script> 

在腳本:

if (window.SCRIPT_IS_DYNAMICALLY_LOADED) { 
    domContentLoadedListener(); 
} else { 
    document.addEventListener("DOMContentLoaded",domContentLoadedListener, false); 
} 
+1

這必須是一個外部腳本,所以我無法控制它將被包含在網頁上 – mck89 2010-03-23 16:10:38

0

檢查document.readyState的值。如果值爲'complete',則可以執行腳本,如果是其他內容,請添加監聽器。