Chcę, aby wybrana przeze mnie funkcja działała po dodaniu elementu DOM do strony. Dzieje się to w kontekście rozszerzenia przeglądarki, więc strona działa niezależnie ode mnie i nie mogę modyfikować jej źródła. Jakie mam tutaj opcje?
Myślę, że teoretycznie mógłbym po prostu używać setInterval()
do ciągłego poszukiwania obecności elementu i wykonywania akcji, jeśli element tam jest, ale potrzebuję lepszego podejścia.
Odpowiedzi:
Ponieważ zdarzenia mutacji zostały wycofane w 2012 roku i nie masz kontroli nad wstawionymi elementami, ponieważ są one dodawane przez kod innej osoby, jedyną opcją jest ciągłe sprawdzanie ich obecności.
Po wywołaniu tej funkcji będzie ona działać co 100 milisekund, czyli 1/10 (jedna dziesiąta) sekundy. Jeśli nie potrzebujesz obserwacji elementów w czasie rzeczywistym, to powinno wystarczyć.
źródło
MutationObserver()
: davidwalsh.name/mutationobserver-apiEvent.ADDED_TO_STAGE
?Właściwa odpowiedź brzmi „użyj obserwatorów mutacji” (jak opisano w tym pytaniu: Określanie, czy element HTML został dynamicznie dodany do DOM ), jednak obsługa (szczególnie w IE) jest ograniczona ( http://caniuse.com/mutationobserver ) .
Tak więc rzeczywista odpowiedź RZECZYWISTA brzmi: „Użyj obserwatorów mutacji… ostatecznie. Ale na razie idź z odpowiedzią Jose Faeti” :)
źródło
Pomiędzy wycofywaniem się zdarzeń mutacji a pojawieniem się
MutationObserver
, skutecznym sposobem powiadamiania o dodaniu określonego elementu do DOM było wykorzystanie zdarzeń animacji CSS3 .Cytując wpis na blogu:
źródło
animationstart
, jsbin.com/netuquralu/1/edit .Możesz użyć
livequery
wtyczki do jQuery. Możesz podać wyrażenie selektora, takie jak:Za każdym razem, gdy
removeItemButton
dodawany jest przycisk klasy, na pasku stanu pojawia się komunikat.Jeśli chodzi o wydajność, możesz chcieć tego uniknąć, ale w każdym przypadku możesz wykorzystać wtyczkę zamiast tworzyć własne programy obsługi zdarzeń.
Ponownie odwiedzona odpowiedź
Powyższa odpowiedź miała na celu jedynie wykrycie, że element został dodany do DOM poprzez wtyczkę.
Jednak najprawdopodobniej
jQuery.on()
podejście byłoby bardziej odpowiednie, na przykład:Jeśli masz dynamiczną zawartość, która powinna odpowiadać na przykład na kliknięcia, najlepiej powiązać zdarzenia z kontenerem nadrzędnym za pomocą
jQuery.on
.źródło
ETA 24 kwietnia 17 Chciałem to trochę uprościć za pomocą niektórych
async
/await
magii, ponieważ czyni to o wiele bardziej zwięzłym:Używając tego samego obiecanego-obserwowalnego:
Twoja funkcja dzwonienia może być tak prosta, jak:
Jeśli chcesz dodać limit czasu, możesz użyć prostego
Promise.race
wzorca, jak pokazano tutaj :Oryginalny
Możesz to zrobić bez bibliotek, ale musiałbyś użyć niektórych rzeczy z ES6, więc pamiętaj o problemach ze zgodnością (tj. Jeśli twoją publicznością są głównie Amisze, luddite lub, co gorsza, użytkownicy IE8)
Najpierw użyjemy interfejsu API MutationObserver do skonstruowania obiektu obserwatora. Owiniemy ten obiekt obietnicą, a
resolve()
kiedy wywołanie zwrotne zostanie uruchomione (h / t davidwalshblog) artykuł na blogu Davida Walsha o mutacjach :Następnie utworzymy plik
generator function
. Jeśli jeszcze ich nie użyłeś, to przegapiłeś - ale krótkie podsumowanie jest takie: działa jak funkcja synchronizacji, a kiedy znajdzieyield <Promise>
wyrażenie, czeka w sposób nieblokujący, aż obietnica się pojawi spełnione ( Generatory robią więcej niż to, ale to nas tutaj interesuje ).Trudną częścią generatorów jest to, że nie „zwracają” jak normalna funkcja. Więc użyjemy funkcji pomocniczej, aby móc używać generatora jak zwykłej funkcji. (ponownie, h / t do dwb )
Następnie, w dowolnym momencie, zanim może nastąpić oczekiwana mutacja DOM, po prostu uruchom
runGenerator(getMutation)
.Teraz możesz zintegrować mutacje DOM w synchronicznym przepływie sterowania. Co powiesz na to.
źródło
Istnieje obiecująca biblioteka javascript o nazwie Arrive, która wygląda na świetny sposób na rozpoczęcie korzystania z obserwatorów mutacji, gdy obsługa przeglądarki stanie się powszechna.
https://github.com/uzairfarooq/arrive/
źródło
Sprawdź tę wtyczkę, która robi dokładnie to - jquery.initialize
Działa dokładnie jak każda funkcja. Różnica polega na tym, że bierze selektor, który wprowadziłeś i szuka nowych pozycji dodanych w przyszłości pasujących do tego selektora i inicjalizuje je
Inicjalizacja wygląda następująco
Ale teraz, jeśli nowy
.some-element
selektor dopasowania elementu pojawi się na stronie, zostanie on natychmiast zainicjowany.Sposób dodawania nowej pozycji nie jest ważny, nie musisz przejmować się żadnymi callbackami itp.
Więc jeśli dodasz nowy element, taki jak:
zostanie natychmiast zainicjowany.
Plugin jest oparty na
MutationObserver
źródło
Czyste rozwiązanie javascript (bez
jQuery
):źródło