jQuery.data不再适用于窗口?

时间:2010-12-02 02:17:04

标签: javascript javascript-events jquery

我最近将项目的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 个答案:

答案 0 :(得分:10)

对于事件类型,jQuery 1.4.3+发生了变化,以避免对象名称冲突,对于window(或任何其他普通对象),使用键"__events__"代替,如下所示:< / p>

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

The same __events__ key is used for any objects that don't have a .nodeType propertywindow没有,所以它在这里被视为普通对象。)


要明确这是一次有意识的,有意识的改变,它包含在the jQuery 1.4.3 release notes中:

  

JavaScript对象
  对.jata()用于JavaScript对象(或更准确地说,不是DOM节点的任何东西)进行了许多更改。要在JavaScript对象上设置数据时启动,数据将直接设置在对象上 - 而不是进入内部数据对象库。此外,附加到对象的事件将放入实际上是函数的新__events__属性中。这样做是为了允许事件直接附加到对象,在收集对象时进行垃圾收集,而不是由JSON序列化程序序列化。这些更改应该使jQuery的数据和事件系统在JavaScript对象上更加有用。

答案 1 :(得分:4)

The basic API still seems to work.

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

因此,用于访问jQuery分配的事件的API并没有真正改变;它不再适用于窗户。这听起来并不像是故意的决定,1.4.3 -> 1.4.4 changelog没有提到它。

听起来像一个错误,它可能与最近data的更改有关,现在可以访问HTML5 data-属性。考虑filing a ticket:/