Firebugまたは同様のツールを使用してJavaScript / jQueryイベントバインディングをデバッグする方法


609

かなり複雑で面倒なDOM操作を行うために、jQueryを使用するWebアプリケーションをデバッグする必要があります。ある時点で、特定の要素にバインドされた一部のイベントは発生せず、単に動作を停止します。

アプリケーションのソースを編集する機能がある場合は、ドリルダウンして一連のFirebug console.log()ステートメントとコメント/コメント解除コードを追加して、問題を特定します。しかし、アプリケーションコードを編集できず、Firebugまたは同様のツールを使用してFirefoxで完全に作業する必要があると仮定します。

Firebugは、DOMをナビゲートして操作するのに非常に優れています。しかし、これまでのところ、Firebugでイベントのデバッグを行う方法を理解できていません。具体的には、(Firebug JavaScriptブレークポイントを使用して変更をトレースする)特定の時点で特定の要素にバインドされているイベントハンドラーのリストを表示したいだけです。しかし、Firebugにはバインドされたイベントを表示する機能がないか、私が愚かすぎてそれを見つけることができません。:-)

何か提案やアイデアはありますか?理想的には、今日のDOMの編集方法と同様に、要素にバインドされたイベントを表示して編集したいだけです。

回答:


355

DOMノードでイベントリスナーを見つける方法をご覧ください。

簡単に言えば、ある時点でイベントハンドラーが要素に接続されていると想定します(例): $('#foo').click(function() { console.log('clicked!') });

次のように検査します。

  • jQuery 1.3.x

    var clickEvents = $('#foo').data("events").click;
    jQuery.each(clickEvents, function(key, value) {
      console.log(value) // prints "function() { console.log('clicked!') }"
    })
    
  • jQuery 1.4.x

    var clickEvents = $('#foo').data("events").click;
    jQuery.each(clickEvents, function(key, handlerObj) {
      console.log(handlerObj.handler) // prints "function() { console.log('clicked!') }"
    })
    

jQuery.fn.data(jQueryがハンドラーを内部的に格納する場所)を参照してください。

  • jQuery 1.8.x

    var clickEvents = $._data($('#foo')[0], "events").click;
    jQuery.each(clickEvents, function(key, handlerObj) {
      console.log(handlerObj.handler) // prints "function() { console.log('clicked!') }"
    })
    

21
参考:jQueryに関連付けられていないイベントは表示されません
Juan Mendes

10
console.log()については完全に同意しますif (window.console)が、コードに残って(alert()を使用するよりもはるかに簡単)、IEが壊れた場合などに対処する必要があります。
ピア2012年

14
@thepeer個人的には、ファイルの先頭でコンソールのチェックを行うことを好みます。コンソールが存在しない場合は、ダミーオブジェクトを作成します。
Andrew

以下は、(書式設定の不足を言い訳してください)すべてのイベントをデバッグするための同様の抜粋です:$('#foo').click(function(event) { var events = $(this).data('events'); $.each(events, function(event, handlers) { $.each(handlers, function(key, handlerObj) { console.log("--------------------------------------"); console.log(event+"["+key+"] | "+handlerObj.handler) ; }); });
コーリーO.

3
@ BrainSlugs83:この回答のリンクされた回答を参照してください。(tl; dr:できません)。
クレセントフレッシュ

162

要素に関連付けられたすべてのイベントを表示できるVisual Eventと呼ばれる便利なブックマークレットがあります。さまざまなタイプのイベント(マウス、キーボードなど)の色分けされたハイライトがあります。それらにカーソルを合わせると、イベントハンドラーの本体、接続方法、およびファイル/行番号(WebKitおよびOpera上)が表示されます。イベントを手動でトリガーすることもできます。

要素にアタッチされているイベントハンドラーを検索する標準的な方法がないため、すべてのイベントを見つけることができませんが、jQuery、Prototype、MooTools、YUIなどの一般的なライブラリで動作します。


8
これはコンテンツJavaScriptで実行されるため、JavaScriptライブラリにクエリを実行してデータを取得することに注意してください。したがって、サポートされているライブラリ(jQueryを含む)で追加されたイベントのみが表示されます。
Matthew Flaschen、2009

41

FireQueryを使用できます。Firebugの[HTML]タブのDOM要素に関連付けられているイベントが表示されます。また、を介して要素にアタッチされたデータも表示されます$.data


1
そのプラグインには1つの大きな欠点があります。デバッグしているときに、jqueryコレクションを含む変数の値を検査する場合、コードが一時停止していると値を検査できません。これはfirebugの原因ではありません。アンインストールする理由。単独
Maarten Kieft

1
FireQueryは添付されたイベントをもう表示しないようです:(
Matty J

26

以下は、特定の要素/イベントのすべてのイベントハンドラーをリストできるプラグインです。

$.fn.listHandlers = function(events, outputFunction) {
    return this.each(function(i){
        var elem = this,
            dEvents = $(this).data('events');
        if (!dEvents) {return;}
        $.each(dEvents, function(name, handler){
            if((new RegExp('^(' + (events === '*' ? '.+' : events.replace(',','|').replace(/^on/i,'')) + ')$' ,'i')).test(name)) {
               $.each(handler, function(i,handler){
                   outputFunction(elem, '\n' + i + ': [' + name + '] : ' + handler );
               });
           }
        });
    });
};

次のように使用します。

// List all onclick handlers of all anchor elements:
$('a').listHandlers('onclick', console.info);

// List all handlers for all events of all elements:
$('*').listHandlers('*', console.info);

// Write a custom output function:
$('#whatever').listHandlers('click',function(element,data){
    $('body').prepend('<br />' + element.nodeName + ': <br /><pre>' + data + '<\/pre>');
});

Src:(私のブログ)-> http://james.padolsey.com/javascript/debug-jquery-events-with-listhandlers/



11

$._data(htmlElement, "events")jquery 1.7以降で使用します。

例:

$._data(document, "events") または $._data($('.class_name').get(0), "events")


8

同僚が示唆したように、console.log>アラート:

var clickEvents = $('#foo').data("events").click;
jQuery.each(clickEvents, function(key, value) {
    console.log(value);
})

6

jQueryは次の場所にイベントを格納します。

$("a#somefoo").data("events")

を実行するconsole.log($("a#somefoo").data("events"))と、その要素に関連付けられているイベントが一覧表示されます。


5

最新のChrome(v29)でDevToolsを使用するこれらの2つのヒントは、イベントのデバッグに非常に役立ちます。

  1. 最後に選択されたDOM要素の jQueryイベントのリスト

    • ページの要素を検査する
    • コンソールで次のように入力します。

      $ ._ data($ 0、 "events")// jQuery 1.7+を想定

    • 関連付けられているすべてのjQueryイベントオブジェクトを一覧表示し、対象のイベントを展開して、「handler」プロパティの関数を右クリックし、[Show function definition]を選択します。指定した関数を含むファイルを開きます。

  2. monitorEvents()コマンドの利用


4

FireBugのクルーがEventBugの拡張に取り組んでいるようです。FireBug-Eventsに別のパネルを追加します。

「イベントパネルには、ページ上のすべてのイベントハンドラがイベントタイプ別にグループ化されて表示されます。各イベントタイプを開くと、リスナーがバインドされている要素と関数ソースの概要を確認できます。」EventBug Rising

いつリリースされるかは現時点ではわかりませんが。


2
この機能がリリースされ、FireBug 2.0.1に組み込まれました。ページ上のHTML要素を検査すると、新しい「イベント」パネルがあり、添付されたイベントとそのハンドラーを確認できます。
derloopkat 2014

4

ChromeストアでもjQueryデバッガーを見つけました。domアイテムをクリックすると、それにバインドされているすべてのイベントとコールバック関数が表示されます。イベントが適切に削除されていないアプリケーションをデバッグしていたため、数分でそれを追跡できました。もちろん、これはFirefoxではなくChrome用です。


4

ev 要素の横のアイコン

Firefox開発ツールのインスペクタパネル内には、要素にバインドされたすべてのイベントが一覧表示されます。

最初にCtrl+ Shift+ Cで要素を選択します(例:Stack Overflowの上向き矢印)。

ev要素の右側にあるアイコンをクリックすると、ダイアログが開きます。

イベントツールチップ

||目的のイベントの一時停止記号をクリックすると、ハンドラーの行にデバッガーが開きます。

行の左マージンをクリックすることにより、デバッガーで通常どおりにそこにブレークポイントを配置できます。

これについては、https//developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Examine_event_listenersで言及されています

残念ながら、私はこれがprettyficationでうまく機能する方法を見つけることができませんでした。縮小された行で開かれているようです。Firefox / FirebugでJavaScriptとCSSを美化する方法は?

Firefox 42でテスト済み。


残念ながら、これは継承されたリスナーを見つけるためにはうまく機能しません。
chukko 16

3

このスレッドによると、Firebugには、DOM要素のリスナーにアタッチされているイベントを表示する方法はありません。

あなたができる最善のことは、tj111が示唆すること、またはHTMLビューアで要素を右クリックして[イベントのログ]をクリックすることで、特定のDOM要素に対して発生しているイベントを確認できるようです。私は、特定の関数を発火させることができるイベントを確認するためにそれを行うことができると思います。


2

バージョン2.0では、Firebugはイベントパネルを導入しました。このパネルには、HTMLパネル内で現在選択されている要素のすべてのイベントが一覧表示されます。

Firebugの*イベント*サイドパネル

また、[ ラップされたリスナーを表示 ]オプションがチェックされている場合は、jQueryイベントバインディングにラップされたイベントリスナーを表示できます。このオプションは、[ イベント ]パネルのオプションメニューからアクセスできます

このパネルを使用すると、イベントハンドラーをデバッグするワークフローは次のようになります。

  1. デバッグするイベントリスナーを持つ要素を選択します
  2. [ イベント]サイドパネル内で、関連するイベントの下の関数を右クリックし、[ ブレークポイントの設定]を選択します
  3. イベントをトリガーする

=>スクリプトの実行はイベントハンドラー関数の最初の行で停止し、ステップデバッグできます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.