Ich verwende .on()
, um Ereignisse von Divs zu binden, die nach dem Laden der Seite erstellt werden. Es funktioniert gut für Click, Mouseenter ... aber ich muss wissen, wann ein neues Div der Klasse MyClass hinzugefügt wurde. Ich suche das:
$('#MyContainer').on({
wascreated: function () { DoSomething($(this)); }
}, '.MyClass');
Wie mache ich das? Ich habe es geschafft, meine gesamte App ohne Plugin zu schreiben und möchte es auch so halten.
Vielen Dank.
Antworten:
Früher konnte man sich in die jQuery-
domManip
Methode einbinden, um alle jQuery-Dom-Manipulationen abzufangen und zu sehen, welche Elemente eingefügt wurden usw., aber das jQuery-Team hat dies in jQuery 3.0+ beendet, da es im Allgemeinen keine gute Lösung ist, sich auf diese Weise in jQuery-Methoden einzubinden. Wir haben es so gemacht, dass die internedomManip
Methode außerhalb des jQuery-Kerncodes nicht mehr verfügbar ist.Mutationsereignisse sind ebenfalls veraltet, so wie man es vorher tun konnte
Dies sollte vermieden werden, und heute sollten stattdessen Mutationsbeobachter verwendet werden, was so funktionieren würde
quelle
Hier ist mein Plugin, das genau das tut - jquery.initialize
Die Verwendung ist dieselbe wie bei der Verwendung der
.each
Funktion, aber mit der.initialize
Funktion für das Element.each
werden auch Elemente, die in Zukunft hinzugefügt werden, ohne zusätzlichen Code initialisiert - unabhängig davon, ob Sie sie mit AJAX oder etwas anderem hinzufügen.Initialize haben genau die gleiche Syntax wie die Funktion .each
Wenn nun auf der Seite ein neues Element angezeigt wird, das mit der Auswahl für einige Elemente übereinstimmt, wird es 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.
Plugin basiert auf
MutationObserver
quelle
.initialize
Funktionencallback
nur für Elemente auszuführen , die dynamisch hinzugefügt werden (z. B. über Ajax), und den Rückruf für Elemente zu überspringen, die bereits beim ersten Laden der Seite vorhanden sind? Ich versuche, einen Parameter hinzuzufügen,options
um dies zu erreichen, aber bisher habe ich dies nicht zum Laufen gebracht.$('.myClass').addClass('ignore-initialize'); $.initialize('.myClass:not(.ignore-initialize)', callback);
Nachdem ich diesen und mehrere andere Beiträge durchgesehen hatte, versuchte ich, das, was ich für das Beste von jedem hielt, in etwas Einfaches zu destillieren, mit dem ich erkennen konnte, wann eine Klasse von Elementen eingefügt wurde, und dann auf diese Elemente einwirken konnte .
Für mich ist es wichtig, dass a) das Zielelement in jeder Tiefe innerhalb von "addedNodes" vorhanden ist und b) das Element nur beim erstmaligen Einfügen verarbeitet werden kann (keine Notwendigkeit, die gesamte Dokumenteinstellung zu durchsuchen oder "bereits verarbeitet" zu ignorieren. Flaggen).
quelle
if(mutation.addedNodes.length)
weiladdedNodes
undremovedNodes
Arrays immermutation
vom Typ vorhanden sindchildList
(geprüft in IE11, Chrome53, FF49). Immer noch +1, da Ihre die einzige AntwortaddedNodes
ist, die berücksichtigt wird (callback
wird nur aufgerufen, wenn ein Knoten hinzugefügt wird); nicht nur auf diesem Thread, sondern auch auf vielen anderen Threads. Alle anderen rufen nur diecallback
für alle Mutationen auf, auch wenn der Knoten gelöscht wird.3 Jahre Erfahrung später höre ich so "Element einer bestimmten Klasse, die dem DOM hinzugefügt wurde" : Sie fügen einfach einen Hook in die jQuery-
html()
Funktion ein, wie folgt:Dies funktioniert, wenn Sie jQuery verwenden, was ich auch tue. Und es hängt nicht von dem browserspezifischen Ereignis ab
DOMNodeInserted
, das nicht browserübergreifend kompatibel ist. Ich habe auch die gleiche Implementierung für hinzugefügt.prepend()
Insgesamt wirkt dies wie ein Zauber für mich und hoffentlich auch für Sie.
quelle
html
Helfer von jQuery verwenden , um das DOM zu ändern, und nicht nur "jQuery verwenden" im Allgemeinen. Elemente, die beispielsweise mit hinzugefügt wurden,jQuery.append
lösen dieses Ereignis nicht aus.insertionQ('#intercom-container').every(function(/element){ element.style.display = 'none'; });
Sie könnten Mutationsereignisse verwenden
http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings-mutationevents
BEARBEITEN
von MDN: https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_events
Veraltet Diese Funktion wurde aus dem Web entfernt. Obwohl einige Browser dies möglicherweise noch unterstützen, wird es gerade gelöscht. Verwenden Sie es nicht in alten oder neuen Projekten. Seiten oder Web-Apps, die es verwenden, können jederzeit beschädigt werden.
Mutationsbeobachter sind der vorgeschlagene Ersatz für Mutationsereignisse in DOM4. Sie sollen in Firefox 14 und Chrome 18 enthalten sein.
https://developer.mozilla.org/en/docs/Web/API/MutationObserver
MutationObserver
bietet Entwicklern die Möglichkeit, auf Änderungen in einem DOM zu reagieren. Es ist als Ersatz für Mutationsereignisse konzipiert, die in der DOM3-Ereignisspezifikation definiert sind.Anwendungsbeispiel
Das folgende Beispiel stammt von http://hacks.mozilla.org/2012/05/dom-mutationobserver-reacting-to-dom-changes-without-killing-browser-performance/ .
quelle
Zwei Ergänzungen zu Adeneos Antwort:
(1) Wir können die Zeile ändern
Zu
Wir werden den
"Uncaught TypeError: Cannot read property 'contains' of undefined"
Fehler also nicht sehen .(2) Add-
subtree: true
Inconfig
, um hinzugefügte Knoten rekursiv in allen hinzugefügten Elementen zu finden.quelle