jQuery.data不再适用于窗口?

我最近将我们项目的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.4events未定义。

 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; 

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

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

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

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


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

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

基本API似乎仍然有效。

但是,它似乎不适用于窗口。

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

听起来像一个错误,它可能与最近对data更改有关,现在可以访问HTML5 data-属性。 考虑为它准备一张票 :/