2010-12-02 32 views
7

Recientemente actualicé el archivo jQuery de nuestro proyecto de 1.4.2 a 1.4.4 y parece que a partir del 1.4.3 ha dejado de funcionar la forma en que hemos estado usando jQuery.data.jQuery.data ya no funciona con la ventana?

tenemos este código:

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

if (events.scroll) 
if (!events.scroll.include(handler)) 
    $(window).scroll(handler); 

el propósito es evitar que este controlador en particular quede vinculado varias veces.

En 1.4.2, funciona bien. En 1.4.4, events no está definido.

function handler() { 
    //do something 
} 

$(document).ready(function(){ 
    $(window).scroll(handler); 
    $('div#test').scroll(handler); 

    $(window).data('events') -> undefined 
    $('div#test').data('events') -> Object 
}); 

¿Qué ha cambiado con esta API? ¿Cómo debo listar eventos para window?


me han cambiado la primera línea a la siguiente:

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

un poco desordenado buscando, pero la capacidad de conectar los eventos a los objetos lisos es convincente.

Respuesta

10

Hubo un cambio en jQuery 1.4.3+ para este tipo de eventos, para evitar conflictos de nombres de objetos, por window (o cualquier otro objeto plano) utilice la tecla "__events__" lugar, como este:

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

The same __events__ key is used for any objects that don't have a .nodeType property (que window no, por lo que se trata como un objeto simple aquí).


Para que quede claro que esto fue un cambio consciente, intencional, lo que está incluido en the jQuery 1.4.3 release notes:

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

+0

¡Ajá! Alguien que realmente tenga una idea del problema real, pasos en xD +1 – Matchu

4

The basic API still seems to work.

However, it doesn't seem to work on the window.

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

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

+0

No funciona con el objeto 'window'. Revisar otra vez. http://jsfiddle.net/dH4pz/ –

+0

@Adam: edits :) – Matchu

+1

No es un error, el comportamiento es intencional en jQuery 1.4.3+ –

Cuestiones relacionadas