2011-03-31 19 views
32

Aquí está un ejemplo simple para ilustrar el comportamiento:

Dada esta html marcado:

<div data-company="Microsoft"></div> 

y este código jQuery (usando jQuery 1.5.1):

// read the data 
alert($("div").data("company")); 
// returns Microsoft <<< OK! 

// set the data 
$("div").data("company","Apple"); 
alert($("div").data("company")); 
// returns Apple <<< OK! 

// attribute selector 
alert($("div[data-company='Apple']").length); 
// returns 0 <<< WHY??? 

// attribute selector again 
alert($("div[data-company='Microsoft']").length); 
// returns 1 <<< WHY??? 

// set the attribute directly 
$("div").attr("data-company","Apple"); 
alert($("div[data-company='Apple']").length); 
// now returns 1 <<< OK! 

Desde jQuery importa automáticamente los datos HTML5- * en el objeto de datos de jQuery, ¿no deberían actualizarse los atributos también cuando cambian los datos?

+1

@James '" div [data-company = 'Apple' "' - se olvidó de cerrar con ']' –

Respuesta

51

Normalmente, no hay necesidad de Roundtripping .data() 's si eres consistente en el uso de .data() para acceder/set/modificar los datos sobre los elementos DOM. Por esa razón, tiene sentido evitar la sobrecarga de rendimiento al acceder al DOM para cada operación de ajuste/modificación .data() (.data() almacena internamente sus valores en jQuery.cache).

Si desea forzar el comportamiento de ida y vuelta a sí mismo, puede suscribirse a los eventos "changeData" "setData" o y luego empujar la actualización .data() en esos eventos a través del elemento DOM correspondiente a través .attr().

+2

Eso tiene sentido: ¿Cuál sería entonces el método preferido para usar .data() en el contexto de un selector? Digamos que quería acceder a todos los elementos donde data-company = 'Microsoft' que se establecieron/modificaron con .data()? –

+1

No creo que haya un método fácil para consultar contra el caché '.data()'. Si quisiera usar un selector como ese, necesitaría implementar el viaje de ida y vuelta en el evento "changeData" que mencioné. Luego, podría mantener sus atributos de datos sincronizados con los cambios '.data()' (y también podría hacerlo solo de manera selectiva, en los elementos que pretenda consultar más adelante). –

+0

¡Gracias, Dave! Por cierto, he disfrutado tu serie en tekpub. –

16

Este es el comportamiento correcto de acuerdo con los documentos:

Los atributos Data- se tira en el primer tiempo la propiedad de datos se accede y luego ya no se accede o mutado (se almacenan los valores de todos los datos internamente en jQuery).

(a partir de: http://api.jquery.com/data)

+0

¿Ha sido así siempre o se ha cambiado en una de las versiones? –

+1

Parece que este ha sido siempre el caso. La cita anterior de los documentos también aparece en las notas de la versión de 1.4.3 cuando esta característica se lanzó por primera vez: http://blog.jquery.com/2010/10/16/jquery-143-released/ – Craig

Cuestiones relacionadas