jQuery.data ya no funciona con la window?

Recientemente actualicé el file jQuery de nuestro proyecto de 1.4.2 a 1.4.4 y parece que desde el 1.4.3 la forma en que hemos estado usando jQuery.data ha dejado de funcionar.

Tenemos este código:

 var events = $(window).data('events'); if (events.scroll) if (!events.scroll.include(handler)) $(window).scroll(handler); 

el objective es evitar que este controller en particular se vincule varias veces.

En 1.4.2 , esto funciona bien. En 1.4.4 , los events no están definidos.

 function handler() { //do something } $(document).ready(function(){ $(window).scroll(handler); $('div#test').scroll(handler); $(window).data('events') -> undefined $('div#test').data('events') -> Object }); 

¿Qué cambió con esta API? ¿Cómo debo listr events para la window ?


He cambiado la primera línea a esto:

 var events = $(window).data('__events__').events; 

un poco desorderado, pero la capacidad de conectar events a objects simples es convincente.

Hubo un cambio en jQuery 1.4.3+ para los types de events, para evitar colisiones de nombres de objects, para la window (o cualquier otro object simple) use la key "__events__" lugar, como esta:

 var events = $(window).data('__events__'); 

La misma key __events__ se usa para cualquier object que no tenga una propiedad .nodeType (qué window no, por lo que se trata como un object simple aquí).


Para que quede claro que se trataba de un cambio consciente e intencionado, está incluido en las notas de la versión de jQuery 1.4.3 :

Objetos de JavaScript
Se realizaron varios cambios a cuando .data () se usa en objects JavaScript (o, más exactamente, cualquier cosa que no sea un nodo DOM). Para comenzar cada vez que establezca datos en un object JavaScript, los datos se configuran directamente en el object, en lugar de ingresar al almacén interno de objects de datos. Además, los events que están adjuntos a objects se ponen en una nueva propiedad __events__ que en realidad es una function. Esto se hizo para permitir que los events se adjuntasen directamente a un object, se recolectaran datos no deseados cuando se recostackra el object y no se serializaran mediante un serializador JSON. Estos cambios deberían hacer que los datos y los sistemas de events de jQuery sean mucho más útiles en los objects de JavaScript.

La API básica todavía parece funcionar.

Sin embargo, no parece funcionar en la window.

Por lo tanto, la API para acceder a los events asignados a jQuery en realidad no ha cambiado; simplemente ya no se aplica a la window. Eso no suena exactamente como una decisión intencional, y el logging de cambios 1.4.3 -> 1.4.4 no hace mención de ello.

Suena como un error, y podría tener que ver con los cambios recientes en los data ahora pueden acceder a attributes de data- HTML5. Considere presentar un ticket para ello: /