2013-10-26 18 views
5

Wiem, że można to w jakiś sposób poradzić, ale od tej chwili jest to naprawdę trudne. Piszę scenariusz i chcę uruchomić kilka konkretnych funkcji po zakończeniu manipulacji DOM. Nie mogę modyfikować/dodawać/usuwać żadnego innego skryptu (ponieważ może zostać wstrzyknięty na stronę za pomocą jakiegoś frameworka). Strona korzysta z zapytań ajaxowych (nie zaimplementowanych w jQuery), aby załadować/zmodyfikować zawartość. Teraz chcę, aby zdarzenie zostało wywołane po zakończeniu każdej modyfikacji DOM. Moje obecne podejście polega na uruchomieniu funkcji w każdym zdarzeniu DOMSubtreeModified. Coś takiegoWypalanie zdarzenia javascript na każdej zmianie DOM "zakończone"

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

Jednak wadą tego podejścia jest to, powiedzmy Ajax ładunki 10 elementów w rozmowy, to dla każdego elementu doSomeStuff jest zwolniony. Czy można to ograniczyć do strzelania tylko po załadowaniu 10 elementu? Coś jak resetowanie zdarzenia $ (document) .ready()? więc $ (document) .ready() jest uruchamiany za każdym razem, gdy DOM jest gotowy (po załadowaniu zawartości ajax)

+0

DOMSubtreeModified to przestarzałe http://stackoverflow.com/questions/6659662/why-is-the-domsubtreemodified-event-deprecated-in-dom-level-3 i istnieją zalecenia dotyczące korzystania z tego zamiast aktualizacji http: // .html5rocks.com/2012/02/Detect-DOM-changes-with-Mutation-Observers – Bernhard

+0

@Bernhard DOMSubtreeModified wciąż działa z chromem, ale w jaki sposób obserwatorzy mutacji mogą mi powiedzieć, czy dokument jest znowu gotowy? – whizzzkid

Odpowiedz

1

W jQuery znajduje się metoda ajaxComplete, która wywołuje daną funkcję po każdym zakończonym wywołaniu AJAX. Zobacz więcej here.

Proponuję użyć jQuery lub (w przypadku, gdy nie jest to opcja) przeanalizuj kod źródłowy tej funkcji, aby zobaczyć, jak się to odbywa.

+0

Nie udało mi się wdrożyć tego. Czy to dotyczy tylko zapytań ajax jQuery? ... ponieważ strona, której dotyczy problem, nie używa funkcji ajax jQuery. – whizzzkid

+0

Dokumentacja mówi: "Teraz zrób zapytanie Ajax używając dowolnej metody jQuery", więc tak, myślę, że działa tylko z żądaniami jQuery. Głębsze spojrzenie na źródła może pomóc :) –

+0

:(jakiekolwiek uniwersalne rozwiązanie? – whizzzkid

2

Za pomocą obserwatora obrażeń można słuchać zmian, a jeśli zdarzenie jest uruchamiane, dokument został zmieniony.

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

Całkowicie ważny, ale nie chcę, aby był uruchamiany przy każdej zmianie dom. co powiesz tylko na wypalanie w dom change? ... coś jak ajaxComplete w jQuery, ale bez jQuery ... słuchanie całej zawartości ładowanie ... – whizzzkid

+0

@whizzkid Nie ma wydarzenia dla wszystkich zmian kopuły zakończone. Ten answear tylko oglądać, czy jedna zmiana jest kompletna/stało. Więc jeśli potrzebujesz słuchacza do ukończenia nieznanej liczby zmian, musisz stworzyć licznik lub coś innego i zredukować licznik aż do 0 wewnątrz oddzwaniania obserwatora. Jeśli jest 0, wiesz, że wszelkie zmiany zostały zakończone. Ale to nie jest dobra rzecz, a lepsza architektura zorientowana na oddzwonienie jest bardziej uzasadniona. – Bernhard

+0

Czy coś takiego jak $ (document) .ready() można ponownie zainicjować, aby ponownie uruchomić ogień, gdy będzie gotowe ponownie? – whizzzkid

0

Wiem, że trochę późno do partii, ale to brzmi jak może chcesz ZWLOKA swoją funkcję doSomeStuff. Jeśli nie jesteś przeciwny wprowadzeniu zależności od pliku Underscore.js, ma on dobrą funkcję debounce.

Powiązane problemy