Используя только JavaScript, какой самый эффективный способ выбрать все элементы DOM, которые имеют определенный data-
атрибут (скажем data-foo
). Элементы могут быть различными элементами тега.
<p data-foo="0"></p><br/><h6 data-foo="1"></h6>
javascript
html
dom
DrANoel
источник
источник
document.querySelectorAll
не работает на IE7. Вам нужно будет создать запасной скрипт, который будет обходить дерево DOM и проверять атрибут в каждом теге (на самом деле я понятия не имею, насколько быстро этоquerySelectorAll
делается, и я бы пошел на ручную проверку тегов).data-
элементах,data-foo=0
а именно : иdata-bar=1
иdata-app="js"
иdata-date="20181231"
Ответы:
Вы можете использовать querySelectorAll :
источник
вы получите все элементы с этим атрибутом.
получит только те, которые имеют значение 1.
источник
.querySelectorAll()
возвращает aNodeList
. Как отмечено в этой документации, вы можете перебирать коллекцию, используя.forEach()
. Обратите внимание, что это решение не для IE: developer.mozilla.org/en-US/docs/Web/API/… . Если вам нужна поддержка IE, вам придется просто зацикливаться на NodeList, используя обычныйfor
цикл.Попробуйте это здесь
источник
for in
итерирует по длине и свойствам элемента. Вместо этого используйтеfor of
для перебора свойств, предназначенных для перебораВот интересное решение: он использует движок CSS браузеров для добавления фиктивного свойства к элементам, соответствующим селектору, а затем оценивает вычисленный стиль для поиска соответствующих элементов:
источник
Не уверен, кто обидел меня с -1, но вот доказательство.
http://jsfiddle.net/D798K/2/
источник
getElementsByTagName
глобальный*
селектор ( ) не работает в старых сборках IE. Это где рекурсивный поиск DOM выполняет свою работу. Также нет свойства «data-foo» для ElementNode, который сопоставлен сdata-foo
атрибутом. Вы ищетеdataset
объект (то есть:node.dataset.foo
.Хотя это и не так красиво, как
querySelectorAll
(что имеет множество проблем), вот очень гибкая функция, которая повторяет DOM и должна работать в большинстве браузеров (старых и новых). Пока браузер поддерживает ваше условие (то есть: атрибуты данных), вы должны иметь возможность извлечь элемент.Для любопытных: не пытайтесь протестировать это против QSA на jsPerf. Браузеры, такие как Opera 11, будут кэшировать запрос и искажать результаты.
Код:
Затем вы можете запустить его следующим образом:
recurseDOM(document.body, {"1": 1});
для скорости, или простоrecurseDOM(document.body);
Пример с вашей спецификацией: http://jsbin.com/unajot/1/edit
Пример с другой спецификацией: http://jsbin.com/unajot/2/edit
источник
querySelectorAll
?querySelectorAll
api