2010-12-02 2 views
7

Недавно я обновил файл jQuery нашего проекта от 1.4.2 до 1.4.4 и выяснилось, что с 1.4.3 способ, которым мы использовали jQuery.data, прекратил работать.jQuery.data больше не работает с окном?

У нас есть этот код:

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

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

цель состоит в том, чтобы предотвратить этот конкретный обработчик от привязки несколько раз.

В 1.4.2 это прекрасно работает. В 1.4.4, events не определено.

function handler() { 
    //do something 
} 

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

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

Что изменилось с помощью этого API? Как мне перечислить события для window?


Я изменил первую строку следующим образом:

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

немного грязный вид, но и возможность подключать события к простым объектам неотразима.

ответ

10

Было изменение в JQuery 1.4.3+ для типов событий, чтобы избежать конфликтов имен объектов, для window (или любого другого простого объекта) использовать ключ "__events__" вместо этого, как это:

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

The same __events__ key is used for any objects that don't have a .nodeType property (который window нет, поэтому здесь рассматривается как простой объект).


Чтобы быть ясно, что это было сознательное, намеренное изменение, оно включено в the jQuery 1.4.3 release notes:

JavaScript Объекты
Ряд изменений были сделаны, когда .data() используется на объектах JavaScript (или, точнее, на все, что не является узлом DOM). Для начала, когда вы устанавливаете данные на объекте JavaScript, данные устанавливаются непосредственно на объект - вместо входа во внутреннее хранилище объектов данных. Кроме того, события, привязанные к объектам, помещаются в новое свойство __events__, которое на самом деле является функцией. Это было сделано для того, чтобы события могли быть привязаны непосредственно к объекту, собираться мусором при сборке объекта и не быть сериализованы сериализатором JSON. Эти изменения должны сделать данные и события jQuery намного более полезными для объектов JavaScript.

4

The basic API still seems to work.

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

Итак, API для доступа к JQuery назначаемые события реально не изменилось; он больше не применяется к окну. Это не похоже на намеренное решение, и 1.4.3 -> 1.4.4 changelog не упоминает об этом.

Звучит как ошибка, и это может иметь отношение к недавним изменениям в data, теперь они имеют доступ к атрибутам HTML5 data-. Рассмотрю filing a ticket для него:/

+0

Это не работает с объектом `window`. Проверить снова. http://jsfiddle.net/dH4pz/ – 2010-12-02 02:33:27

+0

@Adam: edits :) – Matchu 2010-12-02 02:34:19

Смежные вопросы