jQueryで要素にバインドされたイベントを見つけることはできますか?


355

このリンクに2つのイベントハンドラーをバインドします。

<a href='#' id='elm'>Show Alert</a>

JavaScript:

$(function()
{
  $('#elm').click(_f);
  $('#elm').mouseover(_m);
});

function _f(){alert('clicked');}
function _m(){alert('mouse over');}

要素にバインドされているすべてのイベントのリストを取得する方法はありますid="elm"か?

回答:


517

jQueryの最新バージョンでは、$._dataメソッドを使用して、jQueryによって問題の要素に関連付けられているイベントを検索します。注:これは内部使用専用の方法です。

// Bind up a couple of event handlers
$("#foo").on({
    click: function(){ alert("Hello") },
    mouseout: function(){ alert("World") }
});

// Lookup events for this particular Element
$._data( $("#foo")[0], "events" );

の結果$._dataは、設定した両方のイベントを含むオブジェクトになります(下の画像はmouseoutプロパティを展開した状態です)。

$ ._のコンソール出力

次に、Chromeでハンドラー関数を右クリックし、[関数定義の表示]をクリックして、コードで定義されている正確な場所を表示できます。


59
これは、jQueryヘルパーを通じてバインドされた要素に対してのみ機能します。
Alex Ciminian、2012

3
@jammypeach私はあなたの解決策を試みていますが、未定義のセレクターが返されます。$( '#elem')。bind( 'click'、function(){});を使用しました。それが違いを生むなら。
Marcus

6
@marcusああ、すごい、見逃しました、すみません:)$._data(element[0], ‘events’);
totallyNotLizards

16
最近は$ ._ data($( '#foo')[0]).eventsを使用する必要があります
Donald Taylor

5
$._data()JQuery内部で使用されます。$.data()ユーザーへのパブリックメソッドです。そして、$.data(element, 'events')うまくいきます。
slideshowp2

73

一般的なケース:

  • ヒットF12して開発ツールを開く
  • Sourcesタブをクリックします
  • 右側で、下にスクロールしてまで移動しEvent Listener Breakpoints、ツリーを展開します
  • 聞きたいイベントをクリックします。
  • ターゲット要素を操作します。それらが起動すると、デバッガーにブレークポイントが表示されます

同様に、次のことができます。

  • ターゲット要素を右クリック->「Inspect element」を選択
  • 開発フレームの右側を下にスクロールしevent listenersます。下部は「」です。
  • ツリーを展開して、要素に関連付けられているイベントを確認します。これがバブリングによって処理されるイベントで機能するかどうかはわかりません(私はそうではないと思います)

3
これは推奨される方法であり、jQueryに依存するのではなく、普遍的な解決策であることに同意します。
deadbabykitten 2015

3
@dead umm ...質問は具体的にjQueryを参照し、添付ファイルの例でjQueryを使用しています-回答はjQuery(?)のコンテキストでのみ有効である必要があります
コードジョッキー

3
他の状況での回答を理解することも役立ちます。誰かが特定の質問をするからといって、彼らが受け取る制約された回答が利用可能な最良のものであるとは限りません。特にjQueryでは、人々はそれを松葉杖として依存する傾向があります。基盤となるアーキテクチャを理解することは重要です。この回答は、jQueryが必ずしも必要ではないことを示しています。質問と例はあいまいすぎて使用法を理解できないため、有効な回答と見なすことができるものを解釈する余地があります。
deadbabykitten

12

後世のためにこれを追加します。さらに多くのJSを記述しない簡単な方法があります。firefox用驚くべきfirebugアドオンを使用して、

  1. 要素を右クリックして、「Firebugで要素を検査」を選択します
  2. サイドバーパネル(スクリーンショットに表示)で、小さな>矢印を使用してイベントタブに移動します。
  3. [イベント]タブには、イベントと各イベントに対応する機能が表示されます
  4. その隣のテキストは、関数の場所を示しています

ここに画像の説明を入力してください


1
これはIE開発ツールでも利用できます。
devlin carnate 2016

9

これで、JavaScript関数getEventListeners()を使用して、オブジェクトにバインドされたイベントリスナーのリストを簡単に取得できます。

たとえば、開発ツールコンソールで次のように入力します。

// Get all event listners bound to the document object
getEventListeners(document);

4
私はそれがネイティブ関数ではないと思うと、次のスクリプト/依存関係を必要とします:github.com/colxi/getEventListenersそれはそう誤解だとしてこれは、答えに追加する必要があります。しかし、その「プラグイン」を紹介してくれてありがとう。いい感じ。:)
Dennis98

6

プラグインjQueryの監査プラグインは、通常のクロム開発ツールを介してこれをやらせる必要があります。完璧ではありませんが、一般的なjQueryハンドラーだけでなく、要素/イベントにバインドされた実際のハンドラーを確認できるはずです。


3

これはjQueryセレクター/オブジェクトに固有のものではありませんが、FireFox Quantum 58.xでは、Devツールを使用して要素のイベントハンドラーを見つけることができます。

  1. 要素を右クリック
  2. コンテキストメニューで、[要素の検査]をクリックします。
  3. 要素(黄色のボックス)の横に「ev」アイコンがある場合は、「ev」アイコンをクリックします。
  4. その要素とイベントハンドラーのすべてのイベントを表示します

FF Quantum開発ツール


1
素晴らしい答え、特にスクリーンショットはそれをはるかに簡単にします。努力をありがとう!
bizi

2

私はこのようなものを使用しましたif($ ._ data($( "a.wine-item-link")[0])。events == null){...何かを実行し、イベントハンドラーを再度バインドします}確認します要素がイベントにバインドされている場合。その要素からすべてのイベントハンドラーの接続を解除した場合でも、未定義(null)と表示されます。それがif式でこれを評価している理由です。


2

イベントは、問題の要素ではなくドキュメント自体に添付される場合があることに注意してください。その場合は、次のように使用します。

$._data( $(document)[0], "events" );

そして、正しいセレクタでイベントを見つけます:

ここに画像の説明を入力してください

次に、ハンドラを確認します> [[FunctionLocation]]

ここに画像の説明を入力してください


0

次のように$ ._ dataに少し複雑なDOMクエリを渡す$._data($('#outerWrap .innerWrap ul li:last a'), 'events')と、ブラウザコンソールでundefinedがスローされます。

したがって$._data($('#outerWrap')[0], 'events')、aのタグのイベントを表示するには、親div:で$ ._ dataを使用する必要がありました。以下は同じもののJSFiddleです:http ://jsfiddle.net/giri_jeedigunta/MLcpT/4/


3
これは、からイベントを委任しているためです$('#outerWrap')。イベントは実際には、個々のアンカーではなくその要素にバインドされます。
Scottux、2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.