Ich versuche gerade, JavaScript zu schreiben, um das Attribut der Klasse zu erhalten, auf die geklickt wurde. Ich weiß, dass ich einen Ereignis-Listener verwenden sollte, um dies richtig zu machen. Mein Code lautet wie folgt:
var classname = document.getElementsByClassName("classname");
var myFunction = function() {
var attribute = this.getAttribute("data-myattribute");
alert(attribute);
};
classname.addEventListener('click', myFunction(), false);
Ich hatte erwartet, jedes Mal eine Warnmeldung zu erhalten, wenn ich auf eine der Klassen klickte, um mir das Attribut mitzuteilen, aber leider funktioniert dies nicht. Kann mir bitte jemand helfen?
( Hinweis - Ich kann dies ganz einfach tun jQuery
, möchte es aber NICHT verwenden. )
javascript
dom-events
30 Sekunden Stosam
quelle
quelle
Antworten:
Das sollte funktionieren.
getElementsByClassName
Gibt einArray zurück.Array-ähnliches Objekt (siehe Bearbeiten) der Elemente, die den Kriterien entsprechen.jQuery erledigt den Loop-Teil für Sie, den Sie in einfachem JavaScript ausführen müssen.
Wenn Sie ES6-Unterstützung haben , können Sie Ihre letzte Zeile durch Folgendes ersetzen:
Hinweis: Ältere Browser (wie IE6, IE7, IE8) werden nicht unterstützt
getElementsByClassName
und kehren daher zurückundefined
.EDIT: Korrektur
getElementsByClassName
gibt kein Array zurück, aber in den meisten Fällen eine HTMLCollection oder in einigen Browsern eine NodeList ( Mozilla ref ). Beide Typen sind Array-ähnlich (dh sie haben eine Längeneigenschaft und auf die Objekte kann über ihren Index zugegriffen werden), sind jedoch nicht ausschließlich ein Array oder werden von einem Array geerbt. (Dies bedeutet, dass andere Methoden, die für ein Array ausgeführt werden können, für diese Typen nicht ausgeführt werden können.)Vielen Dank an user @ Nemo, der darauf hingewiesen und mich dazu gebracht hat, alles zu verstehen.
quelle
document.getElementsByClassName
Tatsächlich wird immer ein Array zurückgegeben, auch wenn nur ein Element den Kriterien entsprichtArray.from()
hat einen zweiten Parameter, der eine Kartenfunktion ist, so dass der obige (unter der Annahme, dass es6 unterstützt wird) geschrieben werden kannArray.from(classname, c => c.addEventListener('click', myFunction));
.* Dies wurde bearbeitet, damit Kinder der Zielklasse die Ereignisse auslösen können. Einzelheiten finden Sie unten in der Antwort. * *
Eine alternative Antwort zum Hinzufügen eines Ereignis-Listeners zu einer Klasse, in der häufig Elemente hinzugefügt und entfernt werden. Dies ist inspiriert von der
on
Funktion von jQuery, mit der Sie einen Selektor für ein untergeordnetes Element übergeben können, das das Ereignis abhört.Geige: https://jsfiddle.net/u6oje7af/94/
Dadurch wird auf Klicks auf untergeordnete
base
Elemente des Elements gewartet. Wenn für das Ziel eines Klicks ein übergeordnetes Element mit dem Selektor übereinstimmt, wird das Klassenereignis behandelt. Sie können Elemente beliebig hinzufügen und entfernen, ohne den einzelnen Elementen weitere Klick-Listener hinzufügen zu müssen. Dies wird sie alle auch für Elemente erfassen, die nach dem Hinzufügen dieses Listeners hinzugefügt wurden, genau wie die jQuery-Funktionalität (die ich mir unter der Haube etwas ähnlich vorstelle).Dies hängt von den sich ausbreitenden Ereignissen ab. Wenn Sie sich also
stopPropagation
an einem anderen Ort befinden, funktioniert dies möglicherweise nicht. Außerdem hat dieclosest
Funktion anscheinend einige Kompatibilitätsprobleme mit dem IE (was nicht?).Dies könnte zu einer Funktion gemacht werden, wenn Sie diese Art von Aktion wiederholt abhören müssen, wie z
========================================= BEARBEITEN
: Dieser Beitrag verwendete ursprünglich die
matches
Funktion für DOM-Elemente auf dem Ereignisziel, dies beschränkte die Ziele von Ereignissen jedoch nur auf die direkte Klasse. Es wurde aktualisiert, umclosest
stattdessen die Funktion zu verwenden, sodass Ereignisse für untergeordnete Elemente der gewünschten Klasse auch die Ereignisse auslösen können. Der Originalcodematches
befindet sich in der Originalgeige: https://jsfiddle.net/u6oje7af/23/quelle
Sie können den folgenden Code verwenden:
quelle
evt.target.classList.contains('databox')
Mit modernem JavaScript geht das folgendermaßen:
event.target
zum Abrufen weiterer Informationen für ein bestimmtes Elementquelle