Implementierung von jQuery "live" - binder mit nativem Javascript
Ich versuche herauszufinden, wie das binden einer Veranstaltung zu dynamisch erstellten Elementen. Ich brauche das event zu bestehen auf das element selbst nachdem es zerstört ist und regeneriert werden.
Offensichtlich mit jQuery-live-Funktion, die leicht, aber was würden Sie Aussehen, umgesetzt mit nativen Javascript?
- Man konnte immer Lesen Sie die jQuery-Quelle :p. Nicht sicher, wie weit wäre es von native JS-obwohl, da bin ich mir sicher, es wird ganz stark davon abhängen, sich von diesem Punkt (in Bezug auf die Verwendung von Selektoren und so weiter).
- Nur ein Hinweis:
.live()
veraltet ist, für eine lange, lange Zeit. Es wurde ersetzt durch.delegate()
wurde ersetzt durch.on()
, so nutzen Sie bitte die Letzte. Außerdem, das Letzte zeigt den Unterschied zwischen Bindung und delegieren, so möchten Sie vielleicht zu schauen. Das wichtigste ist die Kontrolle für das event-target. - Diese Antwort von mir vielleicht helfen, stackoverflow.com/a/27373951/1385441
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ein einfaches Beispiel:
Die grundlegende Idee ist, dass Sie möchten, fügen Sie einen Ereignis-handler, um das Dokument und lassen Sie die event-Blase bis der DOM. Dann prüfen Sie das
event.target
Eigenschaft, um zu sehen, ob Sie mit den gewünschten Kriterien (in diesem Fall nur, dass dieid
des Elements).Edit:
@shabunc vor ein ziemlich großes problem mit meiner Lösung-die Ereignisse auf die Kind-Elemente werden nicht korrekt erkannt. Eine Möglichkeit dieses Problem zu beheben, ist die Betrachtung der Vorfahren-Elemente zu sehen, ob die angegebenen
id
:id
Sie angegeben haben. Ich werde aktualisieren, meine Antwort, um dies zu reflektieren.Neben Andrew ' s post und Binyamin Kommentar, vielleicht ist das eine option:
Mit diesem können Sie 'nav .Punkt a' als Selektor.
Basierend auf Andrew ' s code.
e.preventDefault()
innenaddEventListener
. Wenn verwendet, dann müssen Sie ändern, um es zudocument.querySelector(elementQuerySelector).addEventListener(eventType, function (event) {
sonst wird es verhindern, dass Sie durch klicken auf andere Elemente auf der SeiteAlternative zu verbindlich, ein event dynamisch zu einem bestimmten element kann eine Globale event-listener. Also, jedes mal, wenn Sie aktualisieren Sie die DOM mit einem weiteren neuen element auf das element wird auch die "Fänge". Ein Beispiel:
JS:
CSS:
HTML:
In diesem Beispiel habe ich einen Ereignis-listener auf die
<ul>
für click-Ereignisse. So ein Ereignis passiert, für alle child-Elemente. Von der einfachen event-handler, die ich erstellt habe, können Sie sehen, dass es einfach ist, mehr Logik, mehr buttons (mit verschiedenen oder sich wiederholende Namen), Anker etc.Alles zu, man könnte hinzufügen der eventlistener zu dokumentieren, anstatt die Liste element, fangen alle click-events auf der Seite und dann Griff die click-events in der event-handler.
data-event
die keine semantische Bedeutung. Und fügen Sie einige Weg, um die event-Optionen. Für code wie diesem empfehle ichVue.js
verwaltet alle das Zeug für Euch 😉Anderen Lösungen ein wenig zu kompliziert...
Es ist ein polyfill in Fall, dass Sie brauchen, um Unterstützung für Internet Explorer oder alten Browsern.