Usando solo JavaScript, ¿cuál es la forma más eficiente de seleccionar todos los elementos DOM que tienen un determinado data-atributo (digamos data-foo). Los elementos pueden ser diferentes elementos de etiqueta.
<p data-foo="0"></p><br/><h6 data-foo="1"></h6>
javascript
html
dom
DrANoel
fuente
fuente

document.querySelectorAllno funciona en IE7. Tendría que crear un script de respaldo que recorriera el árbol DOM y verificara el atributo en cada etiqueta (en realidad, no tengo idea de qué tan rápidoquerySelectorAlles, e iría a la verificación manual de las etiquetas).data-elementos, es decir:data-foo=0ydata-bar=1ydata-app="js"ydata-date="20181231"Respuestas:
Puede usar querySelectorAll :
fuente
obtendrá todos los elementos con ese atributo.
solo obtendrá unos con un valor de 1.
fuente
.querySelectorAll()devuelve aNodeList. Como se señaló en esa documentación, puede iterar sobre la colección usando.forEach(). Tenga en cuenta que esta es una solución que no es IE: developer.mozilla.org/en-US/docs/Web/API/… . Si necesita admitir IE, solo tendrá que recorrer la NodeList utilizando unforbucle regular .Pruébalo → aquí
fuente
for initerará sobre la longitud y las propiedades del elemento. En su lugar, usefor ofpara iterar sobre las propiedades diseñadas para ser iteradasAquí hay una solución interesante: utiliza el motor CSS de los navegadores para agregar una propiedad ficticia a los elementos que coinciden con el selector y luego evalúa el estilo calculado para encontrar elementos coincidentes:
fuente
No estoy seguro de quién me dio un -1, pero aquí está la prueba.
http://jsfiddle.net/D798K/2/
fuente
getElementsByTagNamecon un*selector global ( ) se rompe en versiones anteriores de IE. Aquí es donde una búsqueda DOM recursiva hace el trabajo. Tampoco hay una propiedad "data-foo" en un ElementNode que esté mapeado desde eldata-fooatributo. Usted está buscando eldatasetobjeto (es decir:node.dataset.foo.Aunque no es tan bonita como
querySelectorAll(que tiene una letanía de problemas), aquí hay una función muy flexible que recurre al DOM y debería funcionar en la mayoría de los navegadores (antiguos y nuevos). Siempre que el navegador admita su condición (es decir, atributos de datos), debería poder recuperar el elemento.Para los curiosos: no se molesten en probar esto vs. QSA en jsPerf. Los navegadores como Opera 11 almacenarán en caché la consulta y sesgarán los resultados.
Código:
Luego puede iniciarlo con lo siguiente:
recurseDOM(document.body, {"1": 1});por velocidad, o simplementerecurseDOM(document.body);Ejemplo con su especificación: http://jsbin.com/unajot/1/edit
Ejemplo con especificaciones diferentes: http://jsbin.com/unajot/2/edit
fuente
querySelectorAll?querySelectorAllapi