2011-02-22 17 views
17

Bu konuda çelişen kabul edilmiş yanıtlarla birlikte bir dizi yayın (append supposedly immediate) gördüm. Biz asenkron edilebilir görülüyor (http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js) JQuery 1.4 kullanılarak ve) (ekleme ediyoruz, öyle ki:Jquery append() işlevi eşzamansız davranıyor mu?

Düzenlendi AJAX geri arama bağlamında

... 
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"); 
} 

çalıştırır kod göstermek ve oluşturur Sayfa beklendiği gibi, henüz hedef sorguları çalışma zamanında hiçbir şey vermez. JS konsolunda aynı kodu çalıştırmak öğeleri beklendiği gibi alır.

Bu, JQuery'de beklenen davranışsa, ekleme bitinceye kadar beklemenin doğru yolu nedir?

+2

jQuery 1.8 ?? nasıl olur?? Gelecekten misin? :) – DrStrangeLove

+2

Ekle, senkronize ancak Ajax aramanızın değil. Bu kod nerede bulunur? Ajax çağrınızın geri çağırma fonksiyonunda? – Capsule

+0

Doğru sürümle düzenlenmiştir. Bahse girerim 1.8'de istediğim gibi çalışır. – RSG

cevap

24

Tüm yorumlar bu sorunun giderilmesine yardımcı oldu. Konsolda kırmızı bir ringa balığı izliyordum. sorun uyumsuzluùundan değildi, o bir sonraki çizgilerle oldu:

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

Kısacası

$(this).html(); 

olmak Gereken herkes doğruydu. Jquery append() senkronize şekilde davranır.

8

append'dan sonra işler çalışmazsa, bunu deneyin.

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

Detaylar:

  • Görünüşe append özellikle Google Chrome'da, Görünüşe DOM eşzamanlı güncelleme yok
  • senkron, ben bir div yüksekliğini alınmaya çalışılırken bu sorunla karşı karşıya Bir append
  • 'dan sonra varsayımım, senkronize olmayan şekilde güncellenen tarayıcı güncelleme iş parçacıkları olduğunu, aşağıdakilerle ilgili daha fazla yorum olduğunu, yine de, ork, ama çözüm benim için her durumda çalışıyor.
+1

'dan hemen önce 'console.log'u ($ MAIN_DIV.length) yerleştirirseniz ne olur? Tarayıcı görünür bir şekilde gösterilmese bile düzenini güncelleyecektir. kullanıcı, JavaScript istek verileri veya DOM'dan ölçümler olduğunda. (Bu, [düzen atma] nedenidir (http://wilsonpage.co.uk/preventing-layout-thrashing/).) –

+0

Tamam, render konuları Bu, tarayıcının UI güncellemelerini nasıl ele aldığına dair varsayımdır.Kodumda bu sorunla karşılaştım ve yukarıdaki çözümü kullanarak sabitledim.Fakat kodunun, işlev aynı iş parçacığı içinde tamamlanmasından sonra bile çalışabilmesi olabilir. tarayıcının nasıl çalıştığına dair uzman – Bitonator

+1

Bunu söylemek istemem ama bence yanılıyorsunuz.Yukarıdaki sorunun basit bir şekilde yeniden üretilmesini (bazı jsfiddle) üretebildiğinizden şüpheliyim; '.append' gerçekten tamamen senkronize. Ayrıca, JavaScript'in tek bir iş parçacığı olduğunu ve hiçbir şeyin (tarayıcı dahil) aynı anda veriyi dönüştürmediğini lütfen unutmayın. –