Ich möchte, dass eine Funktion meiner Wahl ausgeführt wird, wenn der Seite ein DOM-Element hinzugefügt wird. Dies steht im Zusammenhang mit einer Browsererweiterung, sodass die Webseite unabhängig von mir ausgeführt wird und ich ihre Quelle nicht ändern kann. Welche Möglichkeiten habe ich hier?
Ich denke, theoretisch könnte ich einfach setInterval()
ständig nach der Anwesenheit des Elements suchen und meine Aktion ausführen, wenn das Element vorhanden ist, aber ich brauche einen besseren Ansatz.
Antworten:
Da Mutationsereignisse 2012 veraltet waren und Sie keine Kontrolle über die eingefügten Elemente haben, da sie durch den Code einer anderen Person hinzugefügt werden, besteht Ihre einzige Option darin, diese kontinuierlich zu überprüfen.
Sobald diese Funktion aufgerufen wird, wird sie alle 100 Millisekunden ausgeführt, was 1/10 (ein Zehntel) einer Sekunde entspricht. Sofern Sie keine Echtzeit-Elementbeobachtung benötigen, sollte dies ausreichen.
quelle
MutationObserver()
: davidwalsh.name/mutationobserver-apiEvent.ADDED_TO_STAGE
?Die eigentliche Antwort lautet "Mutationsbeobachter verwenden" (wie in dieser Frage beschrieben: Feststellen, ob dem DOM dynamisch ein HTML-Element hinzugefügt wurde ), die Unterstützung (insbesondere im IE) ist jedoch begrenzt ( http://caniuse.com/mutationobserver ). .
Die eigentliche IST-Antwort lautet also "Benutze Mutationsbeobachter ... irgendwann. Aber geh jetzt mit Jose Faetis Antwort" :)
quelle
Zwischen der Ablehnung von Mutationsereignissen und dem Auftreten von Mutationsereignissen
MutationObserver
bestand eine effiziente Möglichkeit, benachrichtigt zu werden, wenn ein bestimmtes Element zum DOM hinzugefügt wurde, darin, CSS3-Animationsereignisse auszunutzen .Um den Blog-Beitrag zu zitieren:
quelle
animationstart
, jsbin.com/netuquralu/1/edit .Sie können das
livequery
Plugin für jQuery verwenden. Sie können einen Selektorausdruck wie den folgenden angeben:Jedes Mal, wenn eine Schaltfläche einer
removeItemButton
Klasse hinzugefügt wird, wird eine Meldung in einer Statusleiste angezeigt.In Bezug auf die Effizienz möchten Sie dies möglicherweise vermeiden, aber in jedem Fall können Sie das Plugin nutzen, anstatt Ihre eigenen Ereignishandler zu erstellen.
Überarbeitete Antwort
Die obige Antwort sollte nur erkennen, dass ein Element über das Plugin zum DOM hinzugefügt wurde .
Am wahrscheinlichsten
jQuery.on()
wäre jedoch ein Ansatz angemessener, zum Beispiel:Wenn Sie über dynamischen Inhalt verfügen, der beispielsweise auf Klicks reagieren soll, binden Sie Ereignisse am besten mit an einen übergeordneten Container
jQuery.on
.quelle
ETA 24 Apr 17 Ich wollte dies mit etwas
async
/await
Magie ein wenig vereinfachen , da es dadurch viel prägnanter wird:Unter Verwendung der gleichen versprochenen beobachtbaren:
Ihre aufrufende Funktion kann so einfach sein wie:
Wenn Sie eine Zeitüberschreitung hinzufügen möchten, können Sie ein einfaches
Promise.race
Muster verwenden, wie hier gezeigt :Original
Sie können dies ohne Bibliotheken tun, müssen jedoch einige ES6-Elemente verwenden. Beachten Sie daher die Kompatibilitätsprobleme (dh, wenn Ihre Zielgruppe hauptsächlich aus Amish-, Luddite- oder, schlimmer noch, IE8-Benutzern besteht).
Zuerst verwenden wir die MutationObserver-API , um ein Beobachterobjekt zu erstellen. Wir werden dieses Objekt in ein Versprechen einwickeln, und
resolve()
wenn der Rückruf ausgelöst wird (h / t davidwalshblog), wird David Walsh Blog-Artikel über Mutationen veröffentlicht :Dann erstellen wir eine
generator function
. Wenn Sie diese noch nicht verwendet haben, verpassen Sie sie - aber eine kurze Zusammenfassung lautet: Sie läuft wie eine Synchronisierungsfunktion, und wenn sie einenyield <Promise>
Ausdruck findet, wartet sie nicht blockierend auf das Versprechen erfüllt ( Generatoren leisten mehr als das, aber das interessiert uns hier ).Ein schwieriger Teil bei Generatoren ist, dass sie nicht wie eine normale Funktion "zurückkehren". Wir werden also eine Hilfsfunktion verwenden, um den Generator wie eine reguläre Funktion verwenden zu können. (wieder h / t zu dwb )
Führen Sie dann zu jedem Zeitpunkt, bevor die erwartete DOM-Mutation auftreten könnte, einfach aus
runGenerator(getMutation)
.Jetzt können Sie DOM-Mutationen in einen synchronen Kontrollfluss integrieren. Wie wäre es damit?
quelle
Es gibt eine vielversprechende Javascript-Bibliothek namens Arrive, die eine großartige Möglichkeit darstellt, die Mutationsbeobachter zu nutzen, sobald die Browserunterstützung alltäglich wird.
https://github.com/uzairfarooq/arrive/
quelle
Schauen Sie sich dieses Plugin an, das genau das tut - jquery.initialize
Es funktioniert genau wie jede Funktion. Der Unterschied besteht darin, dass Sie den von Ihnen eingegebenen Selektor verwenden und nach neuen Elementen suchen, die in Zukunft mit diesem Selektor übereinstimmen, und diese initialisieren
Initialisieren sieht so aus
Aber jetzt, wenn neues Element übereinstimmt
.some-element
Selektor auf der Seite angezeigt wird, wird er sofort initialisiert.Die Art und Weise, wie neue Elemente hinzugefügt werden, ist nicht wichtig. Sie müssen sich nicht um Rückrufe usw. kümmern.
Wenn Sie also ein neues Element hinzufügen möchten, wie:
es wird sofort initialisiert.
Plugin basiert auf
MutationObserver
quelle
Eine reine Javascript-Lösung (ohne
jQuery
):quelle