Używając tylko JavaScript, który jest najbardziej efektywnym sposobem wybrania wszystkich elementów DOM, które mają określony data-
atrybut (powiedzmy data-foo
). Elementy mogą być różnymi elementami znaczników.
<p data-foo="0"></p><br/><h6 data-foo="1"></h6>
javascript
html
dom
DrANoel
źródło
źródło
document.querySelectorAll
nie działa na IE7. Trzeba by utworzyć skrypt awaryjnej co chodzić drzewa DOM i sprawdzanie atrybut każdego znacznika (w rzeczywistości nie mam pojęcia, jak szybkoquerySelectorAll
jest, i pójdzie do ręcznego sprawdzania tagów).data-
elementy, tj .:data-foo=0
idata-bar=1
orazdata-app="js"
idata-date="20181231"
Odpowiedzi:
Możesz użyć querySelectorAll :
źródło
dostaniesz wszystkie elementy z tym atrybutem.
dostaniesz tylko te o wartości 1.
źródło
.querySelectorAll()
zwraca aNodeList
. Jak wspomniano w tej dokumentacji, możesz iterować kolekcję za pomocą.forEach()
. Pamiętaj, że jest to rozwiązanie inne niż IE: developer.mozilla.org/en-US/docs/Web/API/… . Jeśli potrzebujesz obsługi IE, musisz po prostu zapętlić NodeList za pomocą zwykłejfor
pętli.Wypróbuj → tutaj
źródło
for in
iteruje długość i właściwości przedmiotu. Zamiast tego użyjfor of
iteracji po właściwościach przeznaczonych do iteracjiTutaj interesujące rozwiązanie: używa silnika CSS przeglądarki, aby dodać sztuczną właściwość do elementów pasujących do selektora, a następnie ocenia obliczony styl w celu znalezienia pasujących elementów:
źródło
Nie jestem pewien, kto zrobił mi -1, ale oto dowód.
http://jsfiddle.net/D798K/2/
źródło
getElementsByTagName
global (*
) jest uszkodzony w starszych kompilacjach IE. W tym miejscu rekurencyjne wyszukiwanie DOM wykonuje zadanie. Nie ma również właściwości „data-foo” w elemencie ElementNode odwzorowanym na podstawiedata-foo
atrybutu. Szukaszdataset
obiektu (tjnode.dataset.foo
. : .Chociaż nie jest tak ładna, jak
querySelectorAll
(co ma wiele problemów), oto bardzo elastyczna funkcja, która ponownie uruchamia DOM i powinna działać w większości przeglądarek (starych i nowych). Tak długo, jak przeglądarka obsługuje twój warunek (tj. Atrybuty danych), powinieneś być w stanie pobrać element.Ciekawe: nie przejmuj się testowaniem tego vs. QSA na jsPerf. Przeglądarki takie jak Opera 11 buforują zapytanie i wypaczają wyniki.
Kod:
Następnie możesz zainicjować go w następujący sposób:
recurseDOM(document.body, {"1": 1});
dla prędkości lub po prosturecurseDOM(document.body);
Przykład ze specyfikacją: http://jsbin.com/unajot/1/edit
Przykład z inną specyfikacją: http://jsbin.com/unajot/2/edit
źródło
querySelectorAll
?querySelectorAll
api