jQuery.data不再适用于窗口?

Ada*_*sek 7 javascript jquery javascript-events

近日笔者从提升我们项目的jQuery的文件1.4.21.4.4,看来,由于1.4.3在路上,我们一直在使用jQuery.data已停止工作.

我们有这个代码:

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

if (events.scroll)
if (!events.scroll.include(handler))
  $(window).scroll(handler);
Run Code Online (Sandbox Code Playgroud)

目的是防止此特定处理程序被多次绑定.

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
});
Run Code Online (Sandbox Code Playgroud)

这个API改变了什么?我该如何列出活动window


我已将第一行更改为:

var events = $(window).data('__events__').events;
Run Code Online (Sandbox Code Playgroud)

有点凌乱,但将事件连接到普通对象的能力是令人信服的.

Nic*_*ver 10

对于事件类型,jQuery 1.4.3+发生了变化,以避免对象名称冲突,因为window(或任何其他普通对象)使用密钥"__events__",如下所示:

var events = $(window).data('__events__');
Run Code Online (Sandbox Code Playgroud)

相同的__events__键用于任何没有.nodeType属性的对象(window没有属性,所以它在这里被视为普通对象).


要明确这是一个有意识的,有意识的改变,它包含在jQuery 1.4.3发行说明中:

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