2011-09-18 8 views
5

Dado este CSS:Navegadores no observar cambios en Data- *, Propiedades de selector de atributos CSS No volviendo

[data-myplugin-object="blue-window"]{ 
    background-color: #00f; 
} 

[data-myplugin-object="red-window"]{ 
    background-color: #f00; 
} 

Y esto jQuery:

$('[data-myplugin-object="blue-window"]').each(function(event){ 
    $(this).data({ 
     'myplugin-object': 'red-window' 
    }); 
}); 

Y este fragmento HTML:

<div data-myplugin-object="blue-window"> 
    <p>Hello world</p> 
</div> 

Ahora, uno esperaría que cuando se ejecuta el fragmento jQuery (se aplaza apropiadamente hasta la carga de la página se completa, por supuesto,) mi ventana azul (que inicialmente se procesa como azul) se volvería roja.

No, ciertamente no; y el uso de Firebug y Developer Tools en Firefox y Chrome respectivamente, no puedo observar ningún cambio en los atributos data-*.

Para que el navegador (y cajas de herramientas DOM para el caso) para observar los cambios, necesito para volver a .attr() o hay una solución para esto?

Respuesta

11

jQuery.data() atributos no se almacenan realmente en el objeto DOM en jQuery. El objeto DOM está etiquetado con una ID de jQuery única y los datos reales se almacenan en una estructura de datos de JavaScript separada. Entre otras razones, jQuery lo hace de esta manera para evitar errores de fuga de memoria de referencia circular que pueden ocurrir en algunos navegadores cuando los valores de datos son referencias a otros objetos DOM.

Si desea cambiar el atributo DOM real, sugeriría estableciendo el atributo directamente a sí mismo de esta manera:

obj.attr("data-myplugin-object", "red-window"); 

Aunque, por lo que está haciendo, creo que la mayoría de la gente utiliza la adición/eliminar/cambiar los nombres de las clases de CSS, no los atributos personalizados, ya que esa es la forma común de cambiar qué reglas de CSS se aplican a un objeto.

<div id="myObj" class="blueWindow"> 
    <p>Hello world</p> 
</div> 

.blueWindow {background-color: #00F;} 
.redWindow {background-color: #F00;} 

$("#myObj").removeClass("blueWindow").addClass("redWindow"); 

O si no hay otras clases de objeto:

$("#myObj").attr("class", "redWindow"); 
+1

Gracias @ jfriend00 - clases CSS son obviamente más apropiado para el caso de que labra exclusivamente los elementos, sin embargo estoy trabajando en una plugin y quería implementar algunos estilos predeterminados basados ​​en la relevancia semántica de los atributos personalizados (* relevancia para el diseño *) Por supuesto, estos están destinados a ser reemplazados con selectores CSS de mayor especificidad (* como '.classes' *) en cualquier caso, si el método '.attr()' es mi mejor opción, entonces esa es la dirección que tomaré. ¿'.data()' proporciona alguna otra funcionalidad subyacente que pueda perderse con este cambio? (* aparte de los mapas de soporte, etc. *) – Dan

+1

La principal funcionalidad de adicionalidad que conozco para '.data()' está relacionada con los enlaces de memoria cuando se usan cosas que no sean cadenas simples (por ejemplo, referencias de objetos). No solo evita las referencias DOM circulares, sino que también asegura que todo lo que tenga referencia a través de '.data()' se elimine si elimina el objeto DOM a través de jQuery. Si solo está usando cadenas, no creo que ofrezca mucha funcionalidad adicional para usted. Si lo hace mucho, es posible que desee ver el rendimiento y el uso de la memoria de un atributo DOM frente a la forma jQuery. – jfriend00

Cuestiones relacionadas