¿Existe un método sencillo y directo para seleccionar elementos en función de sus data
atributos? Por ejemplo, seleccione todos los anclajes que tengan un atributo de datos denominado customerID
que tenga el valor de 22
.
Dudo un poco en usar rel
u otros atributos para almacenar dicha información, pero me resulta mucho más difícil seleccionar un elemento en función de los datos almacenados en él.
jquery
html
custom-data-attribute
Hazem Salama
fuente
fuente
$('*[data-customerID]')
puede usarlo con, por ejemplo$('*[data-customerID]').each( function() { ... });
Respuestas:
Debería poder omitir el
*
, pero si recuerdo correctamente, dependiendo de la versión de jQuery que esté utilizando, esto podría dar resultados defectuosos.Tenga en cuenta que, por compatibilidad con la API de selectores (
document.querySelector{,all}
), las comillas alrededor del valor del atributo (22
) no se pueden omitir en este caso .Además, si trabaja mucho con atributos de datos en sus scripts jQuery, es posible que desee considerar el uso del complemento de atributos de datos personalizados HTML5 . Esto le permite escribir código aún más legible mediante el uso
.dataAttr('foo')
y da como resultado un tamaño de archivo más pequeño después de la minificación (en comparación con el uso.attr('data-foo')
).fuente
.data()
mapas se asignan a losdata-*
atributos personalizados de forma predeterminada, lo que hace que este complemento sea redundante. Sin embargo, todavía se puede usar para versiones anteriores de jQuery ".$('[data-customerID]')
.data()
), ¿verdad?Para las personas que buscan en Google y desean reglas más generales sobre la selección con atributos de datos:
$("[data-test]")
seleccionará cualquier elemento que simplemente tenga el atributo de datos (sin importar el valor del atributo). Incluso:$('[data-test~="foo"]')
seleccionará cualquier elemento donde el atributo de datos contengafoo
pero no tenga que ser exacto, como:$('[data-test="the_exact_value"]')
seleccionará cualquier elemento donde el valor exacto del atributo de datos seathe_exact_value
, por ejemplo:pero no
fuente
~=
coincide con palabras separadas por espacios en blanco, mientras que*=
coincide con cualquier subcadena.^
personaje?$('[data-test^=foo]')
en este caso, selecciona cualquier cosa que comience con foo, como<div data-test="foo_exact_value">
o<div data-test="food">
no<div data-test="seafoo">
El uso
$('[data-whatever="myvalue"]')
seleccionará cualquier cosa con atributos html, pero en las nuevas jQueries parece que si usa$(...).data(...)
para adjuntar datos, usa algo del navegador mágico y no afecta el html, por lo tanto, no se descubre.find
como se indica en la respuesta anterior .Verificar (probado con 1.7.2+) (también ver violín ): (actualizado para ser más completo)
fuente
.filter
aquí$item.attr('data-id', 10);
No he visto una respuesta de JavaScript sin jQuery. Esperemos que ayude a alguien.
Información:
atributos de datos
.querySelectorAll ();
fuente
Para seleccionar todos los anclajes con el atributo de datos
data-customerID==22
, debe incluir ela
para limitar el alcance de la búsqueda solo a ese tipo de elemento. Hacer búsquedas de atributos de datos en un bucle grande o en alta frecuencia cuando hay muchos elementos en la página puede causar problemas de rendimiento.fuente
Ejemplos nativos de JS
Obtener NodeList de elementos
html:
<div data-id="container"></div>
Consigue el primer elemento
html:
<div id="container"></div>
Dirigirse a una colección de nodos que devuelve una lista de nodos
html:
Obtenga elementos basados en valores de datos múltiples (OR)
html:
Obtenga elementos basados en valores de datos combinados (Y)
html:
Obtenga elementos donde el valor comienza con
fuente
a través del método Jquery filter ():
http://jsfiddle.net/9n4e1agn/1/
HTML:
JavaScript:
fuente
La construcción de esta manera:
$('[data-XXX=111]')
no funciona en Safari 8.0 .Si configura el atributo de datos de esta manera:
$('div').data('XXX', 111)
solo funciona si configura el atributo de datos directamente en DOM de esta manera:$('div').attr('data-XXX', 111)
.Creo que es porque el equipo de jQuery optimizó el recolector de basura para evitar pérdidas de memoria y operaciones pesadas en la reconstrucción del DOM en cada atributo de cambio de datos.
fuente
Para que esto funcione en Chrome, el valor no debe tener otro par de comillas.
Solo funciona, por ejemplo, así:
fuente
$('[data-action=setStatus]').removeClass('disabled')
A veces es deseable filtrar elementos en función de si tienen elementos de datos adjuntos mediante programación (es decir, no a través de atributos dom):
Lo anterior funciona pero no es muy legible. Un mejor enfoque es usar un pseudo-selector para probar este tipo de cosas:
Ahora podemos refactorizar la declaración original a algo más fluido y legible:
fuente
Solo para completar todas las respuestas con algunas características del 'estándar de vida': por ahora (en la era html5) es posible hacerlo sin una biblioteca de terceros:
document.querySelector('[data-answer="42"],[type="submit"]')
document.querySelectorAll('[data-answer="42"],[type="submit"]')
[data-answer="42"],[type="submit"]
[data-answer]
oinput[type]
fuente