Wählen Sie alle Elemente, die mit "data-" Attribut, ohne die Verwendung von jQuery
Nur mit JavaScript, was ist der effizienteste Weg, um wählen Sie alle DOM-Elemente, die eine gewisse data-
Attribut (sagen wir mal data-foo
). Die Elemente können unterschiedliche tag-Elemente.
<p data-foo="0"></p><br/><h6 data-foo="1"></h6>
- Beachten Sie, dass
document.querySelectorAll
funktioniert nicht auf IE7. Sie müsste dann ein fallback-Skript, welches durch den DOM-Baum und die Prüfung für das Attribut in jedem tag (eigentlich habe ich keine Ahnung, wie schnellquerySelectorAll
ist, und würde für die manuelle überprüfen von tags). - Was ist Ihr Grund für die nicht mit jQuery? Es ist so ziemlich unersetzlich in Situationen wie dieser...
- überhaupt nicht, Sie können sogar wählen Sie diese Elemente in reinem css auch.
- da nicht jede Umgebung, Firma, Website, Programmierung standard, was Sie haben, erlaubt die Verwendung von jQuery. jQuery ist nicht unersetzlich.
- Vereinbart. Würde es nicht mehr Sinn machen, um jQuery verwenden, es sei denn, Sie waren schon es zu benutzen, selbst dann würde ich wahrscheinlich opt-out. Vor 6 Jahren war es viel mehr üblich, haben Sie jQuery in Ihre Website, unterstützen IE5-8 wurde häufiger, und jQuery, sofern die Abstraktionen, die dies tun, in einem einfachen one-liner.
- Ich immer noch nicht sehen, jede Antwort, die wirklich funktioniert auf verschiedene
data-
Elemente, dh:data-foo=0
unddata-bar=1
unddata-app="js"
unddata-date="20181231"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie querySelectorAll:
erhalten Sie alle Elemente mit diesem Attribut.
wird nur erhalten Sie mit einem Wert von 1.
Versuchen Sie es → hier
for in
iteriert über die Länge und die Element-Eigenschaften. Verwenden Sie stattdessenfor of
Durchlaufen Eigenschaften entwickelt, um iteriert überHier ist eine interessante Lösung: es nutzt der Browser CSS engine zum hinzufügen einer dummy-Eigenschaft, um Elemente, die passenden Selektor und wertet dann die berechnete Stil zu finden, aufeinander abgestimmten Elementen:
Zwar nicht so schön wie
querySelectorAll
(die eine Litanei von Fragen), hier ist eine sehr flexible Funktion, die eine Rekursion der DOM und sollte in den meisten Browsern funktionieren (alte und neue). Solange der browser unterstützt Ihren Zustand (d.h.: Daten, Attribute), sollten Sie in der Lage, um das element abzurufen.Für die neugierigen: nicht die Mühe, dieses zu testen vs. QSA auf jsPerf. Browser wie Opera 11 wird cache die Abfrage und die Ergebnisse verzerren.
Code:
Können Sie dann beginnen Sie mit dem folgenden:
recurseDOM(document.body, {"1": 1});
für Geschwindigkeit, oder einfach nurrecurseDOM(document.body);
Beispiel mit Ihren Vorgaben: http://jsbin.com/unajot/1/edit
Beispiel mit abweichender Spezifikation: http://jsbin.com/unajot/2/edit
querySelectorAll
?Nicht sicher, wer dinged mich mit einer -1, aber hier ist der Beweis.
http://jsfiddle.net/D798K/2/
getElementsByTagName
mit einem globalen (*
) Wahlschalter defekt ist bei älteren IE baut. Dies ist, wo eine rekursive DOM suchen, der erledigt den job. Es ist auch kein "data-foo" - Eigenschaft auf ein ElementNode, die abgebildet werden, von derdata-foo
Attribut. Sie suchen für diedataset
Objekt (sprich:node.dataset.foo
.