¿Cuál es la diferencia en el uso entre $.data
y $.attr
cuando se usa data-someAttribute
?
Tengo entendido que $.data
se almacena dentro de jQuery $.cache
, no en el DOM. Por lo tanto, si quiero usar $.cache
para el almacenamiento de datos, debería usarlo $.data
. Si quiero agregar atributos de datos HTML5, debería usar $.attr("data-attribute", "myCoolValue")
.
attr()
puede provocar pérdidas de memoria (al menos en IE), mientras que el usodata()
es seguro. Él insinúa esto en su respuesta, aunque no sale explícitamente y lo dice. Más información sobre los documentos de jQuery (consulte las "Notas adicionales"): api.jquery.com/attrdata-someAttribute
no es válido; según la especificación, solo se permiten minúsculas. Te encontrarás con una miríada de problemas extraños al usar caracteres en mayúsculas.Respuestas:
Si está pasando datos a un elemento DOM desde el servidor, debe establecer los datos en el elemento:
Se puede acceder a los datos utilizando
.data()
jQuery:Sin embargo, cuando almacena datos en un nodo DOM en jQuery utilizando datos, las variables se almacenan en el objeto del nodo . Esto es para acomodar objetos complejos y referencias, ya que almacenar los datos en el elemento del nodo como un atributo solo acomodará valores de cadena.
Continuando mi ejemplo desde arriba:Además, la convención de nomenclatura para los atributos de datos tiene una especie de "problema" oculto:
HTML: JS:La clave con guiones seguirá funcionando:
HTML: JS:Sin embargo, el objeto devuelto por
.data()
no tendrá la clave con guiones establecida:Por esta razón, sugiero evitar la clave con guiones en JavaScript.
Para HTML, siga usando el formulario con guiones. Atributos HTML se supone que para obtener automáticamente en minúsculas ASCII , por lo que
<div data-foobar></div>
,<DIV DATA-FOOBAR></DIV>
y<dIv DaTa-FoObAr></DiV>
se supone que debe ser tratada como idénticos, pero para la mejor compatibilidad se debe preferir la forma en minúsculas.El
HTML: JS:.data()
método también realizará una transmisión automática básica si el valor coincide con un patrón reconocido:Esta capacidad de transmisión automática es muy conveniente para instanciar widgets y complementos:
Si absolutamente debe tener el valor original como una cadena, deberá usar
HTML: JS:.attr()
:Este fue un ejemplo artificial. Para almacenar valores de color, solía usar la notación hexadecimal numérica (es decir, 0xABC123), pero vale la pena señalar que el hexadecimal se analizó incorrectamente en las versiones jQuery anteriores a 1.7.2 , y ya no se analiza en
Number
jQuery 1.8 rc 1.jQuery 1.8 rc 1 cambió el comportamiento de la transmisión automática . Antes, cualquier formato que fuera una representación válida de a
HTML: JS:Number
sería enviado aNumber
. Ahora, los valores numéricos solo se convierten automáticamente si su representación permanece igual. Esto se ilustra mejor con un ejemplo.Si planea usar sintaxis numéricas alternativas para acceder a los valores numéricos, asegúrese de convertir el valor a un
JS (cont.):Number
primero, como con un+
operador unario .fuente
.data()
lo que no tiene el conjunto forma un guión, por lo que$('#bar').data('foo-bar-baz')
va a funcionar, pero$('#bar').data()['foo-bar-baz']
no lo hará. Por esta razón, sugiero que las personas eviten usar la forma con guiones.La principal diferencia entre los dos es dónde se almacena y cómo se accede.
$.fn.attr
almacena la información directamente en el elemento en atributos que son visibles públicamente después de la inspección, y que también están disponibles en la API nativa del elemento.$.fn.data
almacena la información en un lugar ridículamente oscuro . Se encuentra en una variable local cerrada sobre llamadadata_user
que es una instancia de una función definida localmente Datos. Esta variable no es accesible desde fuera de jQuery directamente.Conjunto de datos con
attr()
$(element).attr('data-name')
element.getAttribute('data-name')
,data-name
también accesible desde$(element).data(name)
yelement.dataset['name']
yelement.dataset.name
Conjunto de datos con
.data()
.data(name)
.attr()
o desde cualquier otro lugarfuente
.attr()
es el camino a seguir, si luego desea utilizar los datos como selector (.data()
no se encontrará; consulte codepen.io/anon/pen/EvawPV?editors=1011 )Puede usar el
data-*
atributo para incrustar datos personalizados. Losdata-*
atributos nos permiten incorporar atributos de datos personalizados en todos los elementos HTML.El
.data()
método jQuery le permite obtener / establecer datos de cualquier tipo en elementos DOM de una manera segura de referencias circulares y, por lo tanto, de pérdidas de memoria.El
.attr()
método jQuery obtiene / establece el valor del atributo solo para el primer elemento del conjunto coincidente.Ejemplo:
fuente