DOM要素の添付イベントハンドラーを検査する


107

DOM要素のイベントに関連付けられている関数/コードを表示する方法はありますか?Firebugまたはその他のツールを使用する。


jQueryまたはネイティブDOMを使用してアタッチされますか?
SLaks、

3
@SLaks:いい質問ですね。ANYメカニズムを使用して接続
Claudio Redi 2010

回答:


71

従来のelement.onclick= handlerまたはHTML を使用して接続されたイベントハンドラーは、スクリプトまたはデバッガーのプロパティから<element onclick="handler">簡単に取得できelement.onclickます。

DOM Level 2 Events addEventListenerメソッドとIE を使用して接続されたイベントハンドラーattachEventは、現在スクリプトからまったく取得できません。DOMレベル3はかつてelement.eventListenerListすべてのリスナーを取得することを提案しましたが、これが最終的な仕様になるかどうかは不明です。現在、どのブラウザにも実装されていません。

ブラウザー拡張機能としてのデバッグツールは、この種のリスナーにアクセスできますが、実際にそうするものは知りません。

一部のJSフレームワークは、イベントバインディングのレコードを十分に残して、これまでの状況を把握します。Visual Eventはこのアプローチを採用して、いくつかの一般的なフレームワークを通じて登録されたリスナーを発見します。


7
現在、EventBugと呼ばれるFirebugの拡張機能があり、伝えられるところによると、chrome / safariに同様の機能があります。:私はこの上より人気の議論へのリンクもよstackoverflow.com/questions/446892/...
Nickolay

1
Operaではそのために組み込みのOpera Dragonflyを使用できます。
Norill Tempest

また、HTMLタグが選択された場合のイベント用にFireBug(FireFoxの拡張機能)に組み込まれた部分もあります。
Musa Haidari、2014

EventBugは、バージョン2以降、FireBugに統合されています(現在、[イベント]タブがあります)。
Chris Rae、


76

Google ChromeデベロッパーツールElements Panelには、2011年半ばのChromeのリリース以降、2010年以降のChromeデベロッパーチャンネルのリリース以降、これが含まれています。

また、選択したノードに表示されるイベントリスナー、キャプチャ段階とバブリング段階で発生した順序で表示されます。

ヒットcommand+ option+ iマックOSX上とCtrl+ Shift+ iWindows上ではChromeでこれを発射します

開発ツールのスクリーンショット


5
Chromeの要素パネルはどのようにこれを行いますか?
thunderboltz 2013

1
また、これらを割り当てるコードをどのように見つけることができますか?このUIを使用して疑わしいイベントハンドラーを見つけると、ハンドラーのコードを表示するのに十分な幅のバーがありません...
Steven Lu

このアプローチはかなり混乱します。少なくとも私にとっては。イベントを開くと、jQueryイベントしかありません。その特定の要素のカスタムイベントは表示されません。私はjQueryでアタッチするカスタムイベントに$ ._ dataを使用します。stackoverflow.com/questions/2008592/…を
stack247

2
イベントのwindowように、オブジェクトのイベントを検査することは可能messageですか?
Septagram、2015年

8

Chrome Dev Toolsは最近、JavaScriptイベント監視するためのいくつかの新しいツールを発表しました。

TL; DR

を使用して、特定のタイプのイベントをリッスンしますmonitorEvents()

unmonitorEvents()リスニングを停止するために使用します。

を使用してDOM要素のリスナーを取得しgetEventListeners()ます。

[イベントリスナーインスペクター]パネルを使用して、イベントリスナーに関する情報を取得します。

カスタムイベントの検索

私の必要性として、サードパーティのコードでカスタムJSイベントを発見するために、以下の2つのバージョンgetEventListeners()が驚くほど役に立ちました。

  • getEventListeners(window)
  • getEventListeners(document)

イベントリスナーがアタッチされているDOMノードがわかっている場合は、windowまたはの代わりにそれを渡しますdocument

既知のイベント

監視したいイベントがわかっている場合clickは、たとえばドキュメントの本文で以下を使用できますmonitorEvents(document.body, 'click');

これdocument.bodyで、コンソールに記録されているすべてのクリックイベントが表示されるようになります。


私はこれを試しましたgetEventListeners(document.getElementById( "inputId")); しかし、配列のサイズが1の無効な値を返します
リッチグリーン

6

DOMを確認すると、直接アタッチされたイベント(element.onclick =ハンドラー)を表示できます。FireQueryでFireBugを使用すると、FirefoxでjQueryに接続されたイベントを表示できます。FireBugを使用してaddEventListenerが追加したイベントを確認する方法はないようです。ただし、Chromeデバッガを使用してChromeで表示できます。


6

Allan JardineによるVisual Eventを使用して、ページ上のいくつかの主要なJavaScriptライブラリから現在アタッチされているすべてのイベントハンドラーを検査できます。jQuery、YUI、その他いくつかと連携します。

Visual EventはJavaScriptブックマークレットなので、すべての主要なブラウザーと互換性があります。


1

JavaScript環境を拡張して、イベントリスナーを追跡できます。ネイティブのaddEventListener()メソッドを、それ以降に追加されたイベントリスナーのレコードを保持できるコードでラップ(または「オーバーロード」)します。また、DOMで発生していることを正確に反映するレコードを保持するために、HTMLElement.prototype.removeEventListenerを拡張する必要があります。

説明のために(テストされていないコード)-これは、addEventListenerを「ラップ」して、オブジェクト自体に登録されたイベントリスナーのレコードを作成する方法の例です。

var nativeMethod = HTMLElement.prototype.addEventListener;
HTMLElement.prototype.addEventListener = function (type, listener) {
   var el = e.currentTarget;
   if(!(el.eventListeners instanceof Array)) { el.eventListeners = []}
   el.eventListeners.push({'type':type, 'listener':listener});
   nativeMethod.call(el, type, listener);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.