2011-02-22 167 views
17

我看過一些帖子(append supposedly immediate),其中有一些矛盾的接受答案。我們使用JQuery 1.4http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js)和append()似乎是異步的,這樣的:Jquery append()是否異步行爲?

編輯以顯示

... 
var message = $.ajax({ 
    type: "GET", 
    url: "/getVolumes/" + _Id, 
    async: false 
}).responseText; 
if (parseInt(message) != 0){ 
    var $results = $(message); 
    $MAIN_DIV.append($results); 
    retrieveTargets(); 
} 
...  
function retrieveTargets(){ 
    var $targets = $(".resultTargets"); 
} 

執行AJAX回調的背景下代碼,並創建如預期的頁面,但目標查詢在運行時不會產生任何結果。在JS控制檯中運行相同的代碼將按預期方式檢索元素。

如果這是JQuery的預期行爲,那麼等待append完成的正確方法是什麼?

+2

jQuery 1.8 ??怎麼來的??你來自未來? :) – DrStrangeLove 2011-02-22 23:21:29

+2

追加是同步的,但您的Ajax調用不是。此代碼位於何處?在你的ajax調用的回調函數中? – Capsule 2011-02-22 23:23:45

+0

使用正確的版本進行編輯。我敢打賭,這將在1.8中以我想要的方式工作。 – RSG 2011-02-22 23:25:41

回答

24

所有的評論幫助追蹤了這一點。我在控制檯中跟着一隻紅鯡魚。 問題是不同步,這是下一個行:

$targets.each(function(){ 
    ... 
    this.html(); 
    ... 

需要進行

$(this).html(); 

總之,大家是正確的。 Jquery append()的行爲是同步的。

8

試試這個,如果事情不能在append之後工作。

$('#dynamic-container').append(<your-content>) ; 
setTimeout(function() { 
    ...code which addresses elements inside #dynamic-container... 
},0) ; 

更多詳細信息:

  • 顯然append是同步
  • 顯然DOM不會同步更新,特別是在谷歌Chrome,我面對嘗試檢索div的高度時,這個問題後append
  • 我的假設是有瀏覽器更新線程異步更新,更多的評論下面,仍然不清楚如何w的東西ork,但該解決方案適用於所有情況。
+1

)之前放置'console.log($ MAIN_DIV.length)',會發生什麼?這是不正確的。瀏覽器將更新它的佈局,即使它不可見地呈現給用戶,當JavaScript從DOM請求數據或測量時(這是[layout thrashing](http://wilsonpage.co.uk/preventing-layout-thrashing/)的原因)。 – 2014-12-08 20:43:44

+0

好吧,渲染線程部分是我對瀏覽器如何處理UI更新的假設,我在我的代碼中遇到了這個問題,並使用上面的解決方案修復了它,甚至可能是佈局代碼在同一線程中的函數完成後運行。關於瀏覽器如何工作的專家 – Bitonator 2014-12-12 15:18:40

+1

我討厭這麼說,但我認爲你錯了。我懷疑你能夠對上述問題進行簡單的再現(某些問題),隔離問題; '.append'確實是完全同步的。另請注意,JavaScript是單線程的,並且事物(包括瀏覽器)不會同時變更數據。 – 2014-12-12 19:03:46