2013-10-26 17 views
5

Bunun bir şekilde ele alınabileceğini biliyorum, ancak şu andan itibaren, bu bana gerçekten zor bir zaman veriyor. Bir betik yazıyorum ve bir DOM manipülasyonu tamamlandığında bazı özel işlevleri kovmak istiyorum. Başka bir betiği değiştiremez/ekleyemez/kaldıramaz (bazı çerçeveyi kullanarak sayfaya enjekte edilebileceğinden). Sayfa, içeriği yüklemek/değiştirmek için ajax istekleri (jQuery'de uygulanmadı) kullanıyor. Şimdi her DOM modifikasyonu tamamlandığında bir olayın tetiklenmesini istiyorum. Şu anki yaklaşımım, her DOMSubtreeModified olayında işlevi tetiklemektir. BuHer DOM değişikliğinde javascript olayı tetikleniyor "complete"

$(document).bind('DOMSubtreeModified', doSomeStuff); 

gibi bir şey Fakat bu yaklaşımın dezavantajı, bir çağrı içinde 10 element, daha sonra her element için doSomeStuff ateşlenir ajax yükler diyelim. Bu sadece 10. öğe yüklendikten sonra ateşleme ile sınırlı olabilir mi? $ (Document) .ready() etkinliğini sıfırlamak gibi bir şey var mı? böylece $ (document) .ready() her AJAX çağrısını bittikten sonra belli bir işlevini çağıran bir yöntem ajaxComplete vardır, DOM jQuery yılında

+0

DOMSubtreeModified, http://stackoverflow.com/questions/6659662/why-is-the-domsubtreemodified-event-deprecated-in-dom-level-3 kullanımdan kaldırılmıştır ve bunun yerine http: // güncelleştirmeleri kullanmanın önerileri vardır. .html5rocks.com/2012/02/Alg-DOM değişiklikleri-Mutasyonla-Gözlemciler – Bernhard

+0

@Bernhard DOMSubtreeModified hala kromla çalışır, yine de mutasyon gözlemcileri belgenin tekrar hazır olup olmadığını nasıl anlatabilir? – whizzzkid

cevap

1

(yükleme ajax içeriği sonra) hazır her zaman ateşlenir. Diğer here.

jQuery'yi kullanmanızı öneririm (veya bu bir seçenek değilse), bu işlevin kaynak kodunu orada nasıl yapıldığını görmek için analiz eder.

+0

Bunu uygulamakta başarısız oldum. Bu sadece jQuery ajax isteklerini dinler mi? ... çünkü ilgili sayfa jQuery'nin ajax işlevini kullanmıyor. – whizzzkid

+0

belgesinde 'Şimdi, herhangi bir jQuery yöntemini kullanarak bir Ajax isteği yapın 'yazıyor, evet, sadece jQuery istekleriyle çalışıyor. Kaynaklara daha derin bir bakış, :) –

+0

:(herhangi bir evrensel çözüm? – whizzzkid

2

Mutasyon Gözlemcisi ile değişiklikleri dinleyebilir ve etkinlik gerçekleşirse belge değiştirildi.

MutationObserver = window.MutationObserver || window.WebKitMutationObserver; 

var observer = new MutationObserver(function(mutations, observer) { 
    // Add the actions to be done here if a changes on DOM happened 
    console.log(mutations, observer); 

}); 

// Register the element root you want to look for changes 
observer.observe(document, { 
    subtree: true, 
    attributes: true 
}); 
+0

Tamamen geçerli, ancak her dom değişikliğinde ateş etmesini istemiyorum. nasıl sadece dom de atış ateşleme tamamlandı? ... jQuery ama jQuery olmadan ajaxComplete gibi bir şey ... tüm içerik yükleniyor yükleniyor ... – whizzzkid

+0

@whizzkid Tüm kubbe değişiklikleri için hiçbir olay tamamlandı. Bu cevap sadece tek bir değişiklik tamamlandığında/gerçekleştiğinde izler. Bu nedenle, bilinmeyen bir sayıda değişikliğin tamamlanması için bir dinleyiciye ihtiyacınız varsa, bir sayaç veya başka bir şey oluşturmanız ve sayacı gözlemcinin içinde 0'a kadar azaltmanız gerekir. Eğer 0 ise, herhangi bir değişiklik tamamlandı. Ama bu iyi bir şey değil ve daha iyi geri çağrı odaklı mimari daha mantıklı. – Bernhard

+0

$ (document) .ready() gibi bir şey tekrar hazır olduğunda tekrar ateşe yeniden başlatılabilir mi? – whizzzkid

0

Ben partiye biraz geciktim biliyorum ama sizin doSomeStuff fonksiyonunu sektirilmesini isteyebilirsiniz gibi geliyor. Underscore.js'ye bağımlılık getirmeye karşı değilseniz, güzel bir debounce işlevine sahiptir.

İlgili konular