Vanilla-JavaScript-Ereignisdelegierung

8

Was ist die beste Art und Weise (am besten / am besten), um die Ereignisdelegierung in Vanilla js durchzuführen?

Zum Beispiel, wenn ich das in jQuery hatte:

%Vor%

Wie kann ich das in Vanille js übersetzen? Vielleicht mit .addEventListener()

Ich kann mir folgendes vorstellen:

%Vor%

Aber das scheint ineffizient, besonders wenn #main viele Kinder hat.

Ist das der richtige Weg, es dann zu tun?

%Vor%     
MrGuru 07.05.2014, 03:30
quelle

2 Antworten

9

Ich habe eine einfache Lösung gefunden , die ziemlich gut funktioniert ( ältere IE-Unterstützung ungeachtet). Hier erweitern wir den Prototyp von EventTarget , um eine delegateEventListener -Methode bereitzustellen, die die folgende Syntax verwendet:

%Vor%

Ich habe eine ziemlich komplexe Geige erstellt, um sie in Aktion zu demonstrieren, wo wir delegieren alle Ereignisse für die grünen Elemente. Das Stoppen der Propagation funktioniert weiterhin und Sie können auf das zugreifen, was event.currentTarget bis this sein sollte (wie bei jQuery).

Hier ist die Lösung in vollem Umfang:

%Vor%     
Ian Clark 01.06.2014, 09:50
quelle
0

Ich habe eine ähnliche Lösung, um eine Ereignisdelegierung zu erreichen. Es nutzt die Array-Funktionen slice , reverse , filter und forEach .

  • slice konvertiert die NodeList von der Abfrage in ein Array, das ausgeführt werden muss, bevor die Liste umgekehrt werden darf.
  • reverse invertiert das Array (so dass der letzte Traversierungsstart so nah wie möglich am Event-Ziel beginnt.
  • filter überprüft, welche Elemente event.target enthalten.
  • forEach ruft den bereitgestellten Handler für jedes Element aus dem gefilterten Ergebnis auf, solange der Handler false nicht zurückgibt.

Die Funktion gibt die erstellte Delegate-Funktion zurück, die es ermöglicht, den Listener später zu entfernen. Beachten Sie, dass das native event.stopPropagation() das Durchlaufen von validElements nicht stoppt, weil die Bubbling-Phase bereits das delegierende Element durchlaufen hat.

%Vor%

Obwohl es nicht empfohlen wird, native Prototypen zu erweitern, kann diese Funktion zum Prototyp für EventTarget (oder Node in IE) hinzugefügt werden. Ersetzen Sie dabei element durch this innerhalb der Funktion und entfernen Sie den entsprechenden Parameter ( EventTarget.prototype.delegateEventListener = function(eventType, childSelector, handler){...} ).

    
Kevin Drost 09.02.2018 13:04
quelle

Tags und Links