Dado un elemento HTML arbitrario con cero o más data-*
atributos, ¿cómo se puede recuperar una lista de pares clave-valor para los datos?
Por ejemplo, dado esto:
<div id='prod' data-id='10' data-cat='toy' data-cid='42'>blah</div>
Me gustaría poder recuperar esto programáticamente:
{ "id":10, "cat":"toy", "cid":42 }
Usando jQuery (v1.4.3), acceder a los bits de datos individuales usando $.data()
es simple si las claves se conocen de antemano, pero no es obvio cómo se puede hacer con conjuntos arbitrarios de datos.
Estoy buscando una solución 'simple' de jQuery si existe, pero de lo contrario no me importaría un enfoque de nivel inferior. Intenté analizar, $('#prod').attributes
pero mi falta de javascript-fu me decepciona.
actualizar
customdata hace lo que necesito. Sin embargo, incluir un complemento jQuery solo por una fracción de su funcionalidad parecía una exageración.
Observando la fuente me ayudó a arreglar mi propio código (y mejoró mi javascript-fu).
Aquí está la solución que se me ocurrió:
function getDataAttributes(node) {
var d = {},
re_dataAttr = /^data\-(.+)$/;
$.each(node.get(0).attributes, function(index, attr) {
if (re_dataAttr.test(attr.nodeName)) {
var key = attr.nodeName.match(re_dataAttr)[1];
d[key] = attr.nodeValue;
}
});
return d;
}
actualización 2
Como se demostró en la respuesta aceptada, la solución es trivial con jQuery (> = 1.4.4). $('#prod').data()
devolvería la información requerida dict.
fuente
Respuestas:
En realidad, si está trabajando con jQuery, a partir de la versión
1.4.31.4.4 (debido al error como se menciona en los comentarios a continuación), losdata-*
atributos son compatibles a través de.data()
:La
jQuery.fn.data
función devolverá todos losdata-
atributos dentro de un objeto como pares clave-valor, siendo la clave la parte del nombre del atributo despuésdata-
y el valor siendo el valor de ese atributo después de convertirse siguiendo las reglas indicadas anteriormente.También he creado una demostración simple si eso no te convence: http://jsfiddle.net/yijiang/WVfSg/
fuente
!jQuery.isNaN( data ) ? parseFloat( data ) : ...
). Tenía números de serie del producto en mi atributo, como eldata-serial="00071134"
que jQuery transformó en un número71134
, lo que me obligó a volver a lo menos elegante.attr('data-serial')
(no es una opción en su caso). He visto preguntas sobre SO que han expresado frustraciones similares wrt.data()
, intentaré desenterrar una ...$.data()
también devuelve todo lo que ha almacenado usando$.data(key, value)
. Si realmente desea verificar si algo está realmente almacenado en el marcado como un atributo data- *, este método podría no ser la mejor opción.También debería ofrecerse una solución de JavaScript pura, ya que la solución no es difícil:
Esto proporciona una matriz de objetos de atributos, que tienen
name
yvalue
propiedades:Editar: para ir un paso más allá, puede obtener un diccionario iterando los atributos y rellenando un objeto de datos:
Entonces podría acceder al valor de, por ejemplo,
data-my-value="2"
comodata.myValue
;jsfiddle.net/3KFYf/33
Editar: si desea establecer atributos de datos en su elemento mediante programación desde un objeto, puede:
jsfiddle.net/3KFYf/34
EDITAR: si está usando babel o TypeScript, o está codificando solo para los navegadores es6, este es un buen lugar para usar las funciones de flecha es6 y acortar un poco el código:
fuente
-
carácter como lo hace jQuery, pero la respuesta editada sí.JSON.stringify()
ha JSON formatea en.el.getAttribute("data-foo")
. He actualizado mi respuesta para mostrar cómo puede establecer atributos de datos basados en un objeto.Echa un vistazo aquí :
Si el navegador también es compatible con la API de JavaScript HTML5, debería poder obtener los datos con:
o
Ah, pero también leí:
Es de mayo de 2010.
Si utiliza jQuery todos modos, es posible que desee echar un vistazo a la CustomData plugin. Sin embargo, no tengo experiencia con eso.
fuente
$("#my").customdata()
debería darte{method: "delete", remote: "true"}
... así que debería funcionar.Como se mencionó anteriormente, los navegadores modernos tienen la API The HTMLElement.dataset .
Esa API le proporciona un DOMStringMap , y puede recuperar la lista de
data-*
atributos simplemente haciendo:También puede recuperar una matriz con los
data-
nombres clave de la propiedad comoo mapear sus valores por
y de esta manera puedes iterarlos y usarlos sin la necesidad de filtrar entre todos los atributos del elemento como lo necesitábamos antes .
fuente
o
gilly3
la excelente respuesta de convert a un método jQuery:Uso:
$('.foo').info()
;fuente
Debería obtener los datos a través de los atributos del conjunto de datos
conjunto de datos es una herramienta útil para obtener atributos de datos
fuente
this.dataset
todavía no funciona en todos los navegadores. Sin embargo, hay un complemento jquery que proporciona esta función.Puede iterar sobre los atributos de datos como cualquier otro objeto para obtener claves y valores, aquí le mostramos cómo hacerlo
$.each
:fuente
Utilizo cada uno anidado , para mí esta es la solución más fácil (Fácil de controlar / cambiar "lo que haces con los valores, en mi ejemplo, salida de atributos de datos como
ul-list
) (Código Jquery)Codepen: https://codepen.io/ezra_siton/pen/GRgRwNw?editors=1111
fuente
Una forma de encontrar todos los atributos de datos es usar
element.attributes
. Utilizando.attributes
, puede recorrer todos los atributos del elemento, filtrando los elementos que incluyen la cadena "datos-".fuente