jQuery.data больше не работает с окном? - PullRequest
7 голосов
/ 02 декабря 2010

Я недавно обновил файл jQuery нашего проекта с 1.4.2 до 1.4.4, и похоже, что с 1.4.3 способ, которым мы использовали 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;

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

Ответы [ 2 ]

10 голосов
/ 02 декабря 2010

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

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

Тот же ключ __events__ используется для любых объектов, у которых нет свойства .nodeType (чего нет у window, поэтому здесь он обрабатывается как простой объект).


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

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

4 голосов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...