2010-07-22 53 views

回答

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'); 

這將選擇具有多個處理程序的所有元素點擊事件。

+0

不錯,如果在jQuery 1.4.3+中檢查非DOM對象(如窗口對象)上的事件,也要小心,看看爲什麼在http://stackoverflow.com/a/4331226/352672 – Nelson 2012-10-24 16:04:34

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

+0

@downvoter - 它有助於解釋你認爲不正確的東西。如果你有能夠改善未來觀衆的答案的知識,最好分享它。 – 2010-07-22 14:29:01