2011-03-31 26 views
8

過去,我使用$(window).onload在其他腳本加載後運行一段代碼。在這種情況下,我沒有能力更改JS文件的加載順序,我所關心的代碼需要操作由另一個JS文件動態插入的DOM節點,這個JS文件是在頁面下方加載的。這兩個腳本都位於文檔的底部附近。有沒有人對這種情況有任何建議?在所有其他JS執行後運行jQuery

+2

**如果**正在執行另一個腳本?它使用AJAX嗎? – SLaks 2011-03-31 02:42:33

回答

0

如果其他腳本完全在加載事件中執行,則可以向同一事件添加處理程序,並將代碼放入setTimeout調用中(延遲爲1),這將強制您的代碼在下一個執行期間執行打破。

13

如果您知道期望的元素,則可以使用setInterval輪詢DOM以查看它們何時被插入。例如,這是你如何能輪詢元素與ID foo

$(window).load(function() 
{ 
    var i = setInterval(function() 
    { 
     if ($('#foo').length) 
     { 
      clearInterval(i); 
      // safe to execute your code here 
     } 
    }, 100); 
}); 
+0

對於這樣的函數,使用document.getElementById('foo')會更有效率。 – RobG 2011-03-31 03:24:13

+0

的確,'document.getElementById'更有效率,但是再一次,jQuery並沒有用於其原始性能。它也爲這種簡單的選擇器進行了優化。更重要的是:兩者之間不會有明顯的差異,因爲這個函數將以相對較慢和固定的速率執行。 – 2011-03-31 03:26:39

+0

輝煌的解決方案。 – Christian 2016-05-04 01:52:29

2

即使你不能改變的加載順序,你可以改變它是怎麼裝的?我已經在過去使用的時候想加載一些JavaScript,並執行一些代碼,我確信它有加載完成後

一件事是jQuery的$ .getScript:

$.getScript('javascripttoload.js', function() { 
     //do the DOM manipulation you were talking about... 
}); 

http://api.jquery.com/jQuery.getScript/

1

如果您需要將事件處理程序附加到未來的DOM節點,則可以使用jQuery .live(),否則,可以使用livequery插件。

例如:

$(".nodes").livequery(function() { 
    // do something with the nodes 
} 

,它將調用所提供的匿名功能適用於所有當前和未來的節點與類.nodes

1

的問題是試圖聲明一個變量對象之前存儲的jQuery對象在頁面上。將這些聲明移動到僅在$(window).load後綁定的單擊事件之後執行的代碼塊才能解決問題。

感謝所有的提示,但!

相關問題