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.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;
有点凌乱,但将事件连接到普通对象的能力是令人信服的。
对于事件类型,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-
属性。 考虑为它准备一张票 :/