我最近将项目的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;
看起来有点凌乱,但将事件连接到普通对象的能力很有吸引力。
答案 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
property(window
没有,所以它在这里被视为普通对象。)
要明确这是一次有意识的,有意识的改变,它包含在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:/