Я пытаюсь перебрать ВСЕ элементы на странице, поэтому я хочу проверить каждый элемент, который существует на этой странице, на наличие специального класса.
Итак, как мне сказать, что я хочу проверить КАЖДЫЙ элемент?
javascript
dom
Флориан Мюллер
источник
источник
document.body.getElementsByTagName('*')
for (... of ...) { }
Ответы:
Вы можете передать a,
*
чтобыgetElementsByTagName()
он возвращал все элементы на странице:Обратите внимание, что вы можете использовать
querySelectorAll()
, если он доступен (IE9 +, CSS в IE8), чтобы просто находить элементы с определенным классом.Это, безусловно, ускорит дело для современных браузеров.
Браузеры теперь поддерживают foreach на NodeList . Это означает, что вы можете напрямую зацикливать элементы вместо того, чтобы писать свой собственный цикл for.
источник
all[i]
текущий элемент.getElementsByClassName()
имеет худшую поддержку, чемquerySelectorAll()
(первая не поддерживается в IE 8). ОП четко заявил, что он хочет перебрать все элементы на странице, для которых я дал ему решение и предложил альтернативу. Я не уверен, в чем проблема с этим ;-).Искал же. Ну, не совсем так. Я только хотел перечислить все узлы DOM.
Чтобы получить элементы с определенным классом, мы можем использовать функцию фильтра.
Нашел решение на MDN
источник
document.body.getElementsByTagName('*')
вернуть узлы в зашифрованном порядке.Как всегда, лучшим решением является использование рекурсии:
В отличие от других предложений, это решение не требует создания массива для всех узлов, так что его больше света на память. Что еще более важно, он находит больше результатов. Я не уверен, каковы эти результаты, но при тестировании на Chrome он обнаруживает примерно на 50% больше узлов по сравнению с
document.getElementsByTagName("*");
источник
document.getElementsByTagName("*");
» - да, он найдет текстовые узлы и узлы комментариев, а также узлы элементов . Поскольку ОП просто спрашивал об элементах, это не нужно.NodeList
просто ссылается наNode
s, которые уже встроены в вашу DOM, так что это не так тяжело, как вы можете себе представить. Кто-то, кто знает больше, может взвесить, но я думаю, что это просто эталонный размер памяти, поэтому 8 байтов на узел.Вот еще один пример того, как вы можете перебрать документ или элемент:
источник
Для тех, кто использует Jquery
источник
Энди Э. дал хороший ответ.
Я хотел бы добавить, что если вы хотите выбрать все дочерние элементы в каком-то специальном селекторе (эта необходимость недавно произошла со мной), вы можете применить метод "getElementsByTagName ()" к любому нужному объекту DOM.
Например, мне нужно было просто проанализировать «визуальную» часть веб-страницы, поэтому я просто сделал это
Это никогда не будет принимать во внимание главную роль.
источник
по этой ссылке
javascript reference
UPDATE: EDIT
так как мой последний ответ я нашел лучшее, более простое решение
источник
document.all
не рекомендуется в пользуdocument.getElementBy*
.использование
*
источник
я думаю это очень быстро
источник
Получение всех элементов с помощью
var all = document.getElementsByTagName("*"); for (var i=0, max=all.length; i < max; i++);
нормально, если вам нужно проверить каждый элемент, но приведет к проверке или циклу повторяющихся элементов или текста.Ниже приведена рекурсивная реализация, которая проверяет или зацикливает каждый элемент всех элементов DOM только один раз и добавляет:
(Авторы @George Reith за свой рекурсивный ответ здесь: сопоставьте HTML с JSON )
источник
Вы можете попробовать с
document.getElementsByClassName('special_class');
источник
getElementsByClassName()
и он не поддерживается Internet Explorer до версии 9.