2010-12-02 8 views
7

J'ai récemment mis à jour le fichier jQuery de notre projet de 1.4.2 à 1.4.4 et il semble que depuis 1.4.3 la façon dont nous avons utilisé jQuery.data a cessé de fonctionner.jQuery.data ne fonctionne plus avec la fenêtre?

Nous avons ce code:

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

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

le but est d'empêcher ce gestionnaire particulier d'être lié à plusieurs reprises. En 1.4.2, cela fonctionne très bien. Dans 1.4.4, events est indéfini.

function handler() { 
    //do something 
} 

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

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

Qu'est-ce qui a changé avec cette API? Comment devrais-je lister les événements pour window?


J'ai changé la première ligne à ceci:

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

un peu désordonné à la recherche, mais la capacité à des événements câbler à des objets simples est convaincant.

Répondre

10

Il y avait un changement de jQuery 1.4.3+ pour les types d'événements, afin d'éviter les collisions de noms d'objets, pour window (ou tout autre objet ordinaire), utilisez plutôt la "__events__" clé, comme ceci:

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

The same __events__ key is used for any objects that don't have a .nodeType property (que window ne fait pas, donc il est traité comme un objet ordinaire ici).


Pour être clair que cela était une conscience, un changement intentionnel, il est inclus dans the jQuery 1.4.3 release notes:

JavaScript Objets
Un certain nombre de modifications ont été apportées lors .data() est utilisé sur les objets JavaScript (ou, plus précisément, sur tout ce qui n'est pas un noeud DOM). Pour démarrer à chaque fois que vous définissez des données sur un objet JavaScript, les données sont définies directement sur l'objet, au lieu d'aller dans le magasin d'objets de données interne. De plus, les événements attachés aux objets sont placés dans une nouvelle propriété __events__ qui est en fait une fonction. Cela a été fait pour permettre aux événements d'être attachés directement à un objet, être collectés lors de la collecte de l'objet, et ne pas être sérialisés par un sérialiseur JSON. Ces changements devraient rendre les systèmes de données et d'événements de jQuery beaucoup plus utiles sur les objets JavaScript.

+0

Aha! Quelqu'un qui a réellement une idée des étapes du problème réel en xD +1 – Matchu

4

The basic API still seems to work.

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

Ainsi, l'API pour accéder à des événements assignés jQuery n'a pas vraiment changé; cela ne s'applique plus à la fenêtre. Cela ne ressemble pas exactement à une décision intentionnelle, et le 1.4.3 -> 1.4.4 changelog n'en fait aucune mention.

Cela ressemble à un bug, et il pourrait avoir à faire avec les changements récents à data maintenant être en mesure d'accéder aux attributs HTML5 data-. Tenez compte filing a ticket pour cela:/

+0

Il ne fonctionne pas avec l'objet 'window'. Revérifier. http://jsfiddle.net/dH4pz/ –

+0

@Adam: edits :) – Matchu

+1

Ce n'est pas un bug, le comportement est intentionnel dans jQuery 1.4.3+ –

Questions connexes