5

我最近将 JQuery 升级到了 1.9 版。在 1.4 版上,我正在做这样的事情:

     var windowEvents = $(window).data("events");
     if (windowEvents.unload.length > 0) {
          // some fun stuff
     }

当然,在 jQuery 1.8 中这个功能被移除了。经过一番研究,我找到了解决此问题的建议:

     var windowEvents = $._data($(window), "events");

但是,根据控制台,windowEvents 是未定义的。我究竟做错了什么?还有其他建议吗?

提前致谢 :)

4

4 回答 4

3

$._data如果绑定了事件处理程序,似乎对我有用:

$(window).on('unload', function() {
   // do stuff
});

if (($._data( window, 'events' ).unload || []).length) {
    console.log('unload is bound');
}else{
    console.log('unload is NOT bound');
}

小提琴

于 2013-07-09T17:45:29.180 回答
2

我在http://dbj.org/dbj/2013/04/09/list-of-jquery-events/上找到了解决方案

它的基础是:

/* (c) 2013 by DBJ.ORG, GPL/MIT applies */
jQuery.events = function (expr ) {
  var rez = [], evo ;
   jQuery(expr).each(
      function () {
         if ( evo = jQuery._data( this, "events"))
           rez.push({ element: this, events: evo }) ;
     });
 return rez.length > 0 ? rez : null ;
}

要使用它,只需调用:

jQuery.events("div");

div 是任何 jquery 选择器的位置。我已经在 jQuery 1.9 上尝试过,它对我来说效果很好。

于 2014-04-10T08:12:37.623 回答
1

我最终包括检查是否定义了 windowEvents。此外,我在询问事件时包含了 [0](此解决方案可在此处找到:jQuery 1.8 find event handlers)。所以最终的代码是这样的:

var windowEvents = $._data($(window)[0], "events");
if (windowEvents && windowEvents.unload.length > 0) {
    // some fun stuff
}

现在,它的功能与升级前一样。谢谢你的帮助!

于 2013-07-09T18:30:28.267 回答
0

它们仍然存储在同一个地方。但它只存储已经绑定的事件,并且只有在至少一个被绑定之后(否则data()将返回undefined)。

所以你将不得不改变你的条件

var windowEvents = $(window).data("events") || {};
 if (windowEvents.unload && windowEvents.unload.length > 0) {
      // some fun stuff
 }
于 2013-07-09T17:40:42.873 回答