列出具有多个事件侦听器的元素

时间:2010-07-22 14:17:29

标签: jquery events

有没有办法列出包含两个或更多同类事件的所有元素?

我在JsBin上放了一个例子: http://jsbin.com/alafo3/edit

在这个例子中,我想要一个包含<p>且ID =“hallo2”的列表。

2 个答案:

答案 0 :(得分:4)

您还可以访问附加数据的events键,例如

$('#hello2').data('events').click.length

返回2

更新:

你可以用这种方式扩展jQuery:

$.fn.hasMultipleEventHandlersFor = function(event) {
    return this.filter(function() {
        var events =  $(this).data('events');
        return events && events[event] && events[event].length > 1;
    });
};

并使用它:

$('p').hasMultipleEventHandlersFor('click');

将选择具有多个处理程序的所有元素。

答案 1 :(得分:2)

您可以循环存储事件的$.cache对象,如下所示:

$.each($.cache, function(i, v) {
  if(v.events && v.events.click && v.events.click.length > 1) {
    alert($('[' + $.expando + '=' + i + ']').attr('id'));
  }
})​;

Give it a try here,或者对于具有多个处理程序的任何事件,使其更通用,如下所示:

$.each($.cache, function(i, v) {
  $.each(v.events, function(j, u) {
    if(u.length > 1)
      alert($('[' + $.expando + '=' + i + ']').attr('id'));
  });
})​;

You can try that version here,请注意,这两种方法都需要jQuery 1.4+,expando属性不会在1.3.x中公开。


如果你想要一个引用这些元素的jQuery集合,你可以随意构建它,如下所示:

var elems = [];
$.each($.cache, function(i, v) {
  $.each(v.events, function(j, u) {
    if(u.length > 1)
      $.merge(elems, $('[' + $.expando + '=' + i + ']'));
  });
});
​$(elems).css('color', 'red');​​​​ //use it, $(DOMElementArray) overload here

You can test that version here