Was ist die effizienteste Methode, um alle DOM-Elemente mit einem bestimmten data-
Attribut auszuwählen (sagen wir data-foo
) , wenn Sie nur JavaScript verwenden? Die Elemente können unterschiedliche Tag-Elemente sein.
<p data-foo="0"></p><br/><h6 data-foo="1"></h6>
javascript
html
dom
DrANoel
quelle
quelle
document.querySelectorAll
dies unter IE7 nicht funktioniert. Sie müssten eine Ausweich Skript erstellen , das würde gehen in jedem Tag den DOM - Baum und Kontrolle für das Attribut (ich habe eigentlich keine Ahnung , wie schnellquerySelectorAll
ist, und für die manuelle Überprüfung von Tags gehen würde).data-
Elementen funktioniert , dh:data-foo=0
unddata-bar=1
unddata-app="js"
unddata-date="20181231"
Antworten:
Sie können querySelectorAll verwenden :
quelle
Sie erhalten alle Elemente mit diesem Attribut.
Sie erhalten nur solche mit einem Wert von 1.
quelle
.querySelectorAll()
gibt a zurückNodeList
. Wie in dieser Dokumentation erwähnt, können Sie die Sammlung mit iterieren.forEach()
. Beachten Sie, dass dies eine Nicht-IE-Lösung ist: developer.mozilla.org/en-US/docs/Web/API/… . Wenn Sie IE unterstützen müssen, müssen Sie nur die NodeList mit einer regulärenfor
Schleife durchlaufen .Probieren Sie es aus → hier
quelle
for in
werden die Längen- und Elementeigenschaften durchlaufen. Verwenden Sie stattdessen,for of
um Eigenschaften zuHier ist eine interessante Lösung: Sie verwendet die CSS-Engine des Browsers, um Elementen, die mit dem Selektor übereinstimmen, eine Dummy-Eigenschaft hinzuzufügen, und wertet dann den berechneten Stil aus, um übereinstimmende Elemente zu finden:
quelle
Ich bin mir nicht sicher, wer mich mit einer -1 beschimpft hat, aber hier ist der Beweis.
http://jsfiddle.net/D798K/2/
quelle
getElementsByTagName
ein globaler (*
) Selektor defekt. Hier erledigt eine rekursive DOM-Suche den Job. Es gibt auch keine "data-foo" -Eigenschaft für einen ElementNode, der demdata-foo
Attribut zugeordnet ist. Sie suchen nach demdataset
Objekt (dh :node.dataset.foo
.Während nicht so hübsch wie
querySelectorAll
(was eine ganze Reihe von Problemen hat), ist hier eine sehr flexible Funktion, die das DOM rekursiv macht und in den meisten Browsern (alt und neu) funktionieren sollte. Solange der Browser Ihre Bedingung unterstützt (dh Datenattribute), sollten Sie in der Lage sein, das Element abzurufen.Für Neugierige: Testen Sie dies nicht gegen QSA auf jsPerf. Browser wie Opera 11 zwischenspeichern die Abfrage und verzerren die Ergebnisse.
Code:
Sie können es dann wie folgt starten:
recurseDOM(document.body, {"1": 1});
für Geschwindigkeit oder einfachrecurseDOM(document.body);
Beispiel mit Ihrer Spezifikation: http://jsbin.com/unajot/1/edit
Beispiel mit unterschiedlicher Spezifikation: http://jsbin.com/unajot/2/edit
quelle
querySelectorAll
?querySelectorAll