Estoy tratando de recorrer TODOS los elementos en una página, así que quiero verificar cada elemento que existe en esta página para una clase especial.
Entonces, ¿cómo digo que quiero verificar CADA elemento?
javascript
dom
Florian Müller
fuente
fuente
document.body.getElementsByTagName('*')
for (... of ...) { }
Respuestas:
Puede pasar un
*
agetElementsByTagName()
para que devuelva todos los elementos de una página:Tenga en cuenta que podría usar
querySelectorAll()
, si está disponible (IE9 +, CSS en IE8), solo para encontrar elementos con una clase en particular.Esto sin duda aceleraría las cosas para los navegadores modernos.
Los navegadores ahora admiten foreach en NodeList . Esto significa que puede hacer un bucle directo de los elementos en lugar de escribir su propio bucle for.
fuente
all[i]
le daría el elemento actual.getElementsByClassName()
tiene peor soporte quequerySelectorAll()
(el primero no es compatible con IE 8). El OP declaró claramente que desea recorrer todos los elementos de una página, para lo cual le di la solución y le ofrecí una alternativa. No estoy seguro de cuál es el problema con eso ;-).Estaba buscando lo mismo. Bueno no exactamente. Solo quería enumerar todos los nodos DOM.
Para obtener elementos con una clase específica, podemos usar la función de filtro.
Solución encontrada en MDN
fuente
document.body.getElementsByTagName('*')
podrían devolver los nodos en orden revuelto.Como siempre, la mejor solución es usar la recursividad:
A diferencia de otras sugerencias, esta solución no requiere que cree una matriz para todos los nodos, por lo que es más ligera en la memoria. Más importante aún, encuentra más resultados. No estoy seguro de cuáles son esos resultados, pero cuando prueba en Chrome, encuentra aproximadamente un 50% más de nodos en comparación con
document.getElementsByTagName("*");
fuente
document.getElementsByTagName("*");
" - sí, encontrará nodos de texto y nodos de comentarios, así como nodos de elementos . Como el OP solo preguntaba sobre elementos, eso es innecesario.NodeList
simplemente hace referencia a losNode
s que ya están construidos en su DOM, por lo que no es tan pesado como podría imaginar. Alguien que sabe más puede influir, pero creo que es solo un tamaño de referencia de memoria, por lo que 8 bytes por nodo.Aquí hay otro ejemplo sobre cómo puede recorrer un documento o un elemento:
fuente
Para aquellos que usan Jquery
fuente
Andy E. dio una buena respuesta.
Agregaría que si desea seleccionar todos los elementos secundarios en un selector especial (esto me sucedió recientemente), puede aplicar el método "getElementsByTagName ()" en cualquier objeto DOM que desee.
Por ejemplo, solo necesitaba analizar parte "visual" de la página web, así que hice esto
Esto nunca tendrá en cuenta la parte de la cabeza.
fuente
desde este enlace
referencia de javascript
ACTUALIZACIÓN: EDITAR
desde mi última respuesta encontré una solución mejor y más simple
fuente
document.all
se desaconseja a favor dedocument.getElementBy*
.Utilizar
*
fuente
creo que esto es muy rápido
fuente
Hacer que todos los elementos se utilicen
var all = document.getElementsByTagName("*"); for (var i=0, max=all.length; i < max; i++);
está bien si necesita verificar cada elemento pero resultará en verificar o repetir elementos o texto repetidos.A continuación se muestra una implementación de recursión que comprueba o repite cada elemento de todos los elementos DOM solo una vez y agrega:
(Créditos a @George Reith por su respuesta recurrente aquí: Mapa HTML a JSON )
fuente
Puedes probar con
document.getElementsByClassName('special_class');
fuente
getElementsByClassName()
y no es compatible con Internet Explorer hasta la versión 9.