有没有办法列出包含两个或更多同类事件的所有元素?
我在JsBin上放了一个例子: http://jsbin.com/alafo3/edit
在这个例子中,我想要一个包含<p>
且ID =“hallo2”的列表。
答案 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