jQueryを使って、ある要素にクリックハンドラーやチェンジハンドラーなどのイベントハンドラーがバインドされているかどうかを判断することはできますか?
また、ある種類のイベントに対して、いくつのクリックハンドラ(または何らかのイベントハンドラ)があり、そのイベントハンドラにはどのような機能があるのかを判断することはできますか?
この情報は、データキャッシュから得ることができます。
例えば、コンソール(firebug, ie8)にログを取る。
console.dir( $('#someElementId').data('events') );
または、それらを反復します。
jQuery.each($('#someElementId').data('events'), function(i, event){
jQuery.each(event, function(i, handler){
console.log( handler.toString() );
});
});
別の方法として、以下のブックマークレットを使用することもできますが、これは明らかに実行時には役に立ちません。
私はhasEventListenerというプラグインを書きましたが、これはまさにそれを行うものです。
http://github.com/sebastien-p/jquery.hasEventListener
参考になれば幸いです。
hasEventListenerプラグインでは、カスタムイベントなどは扱えないと思います。
var obj = {id:'test'};
$(obj).bind('custom', function(){
alert('custom');
}).trigger('custom');
alert($(obj).hasEventListener('custom'));
また、少なくともjQuery 1.5では、$(target).data('events')を使うと、上記のようにオブジェクトにバインドされているイベントの場合は戻り方が異なるので、注意が必要だと思います。
以下のようにする必要があります。
var events = $(target).data("events");
if(typeof events === "function"){
events = events.events;
}
私はこのような方法を使っていて、うまくいっていますが、ちょっとjqueryの内部に翻弄されているような感じがして、本当はやってはいけないことなんです。