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.querySelectorAll
no 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ápidoquerySelectorAll
es, e iría a la verificación manual de las etiquetas).data-
elementos, es decir:data-foo=0
ydata-bar=1
ydata-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 unfor
bucle regular .Pruébalo → aquí
fuente
for in
iterará sobre la longitud y las propiedades del elemento. En su lugar, usefor of
para 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
getElementsByTagName
con 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-foo
atributo. Usted está buscando eldataset
objeto (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
?querySelectorAll
api