設定されているイベントハンドラを取得する方法


要素に紐付くイベントハンドラを全て取得する方法はあるでしょうか。  
たとえば、

[code]

    <body>
      <button id="button1" onclick="alert('test1');">test</button>
      <script>
        $("#button1").click(function () {
          alert("test2");
        });
        $("#button1").click(function () {
          alert("test3");
        });
        $(document).on("click", "#button1", function () {
          alert("test4");
        });
      </script>
    </body>
    
[/code]

のようなページの場合、#button1のボタンをクリックすると

> test1  
>  test2  
>  test3  
>  test4

の４つのalertが表示されますが、この４つの関数を全て取得したいです。  
ちなみに、

[code]

    var onclick = $("#button1").get(0).onclick;
    
[/code]

という方法では、最初の `test1` に相当する関数しか取得できませんでした。




タグ属性の`onclick`と、`$("#button1").click()`と、`$(document).on("click", "#button1",
...)`では、イベントとしては別物になります。

`onclick`を得るには、試された方法で取得できます。これはネイティブ(？)が発火しています。

対して、`$("#button1").click()`と`$(document).on("click", "#button1",
...)`は、jQueryが発火しています。
違いは、前者がボタンそのものに対するイベントで、後者はdocumentへのイベントをselecter("#button1")で絞り込んで発火しています。

なので、それぞれ。。

[code]

    var onclick = $("#button1").get(0).onclick;
    console.log(onclick);
    
[/code]

とか、

[code]

    var events = $._data($("#button1").get(0)).events
    $.each(events.click,function(){
      console.log(this.handler);
    });
    
[/code]

とか、

[code]

    var events2 = $._data($(document).get(0)).events
    $.each(events2.click,function(){
      if(this.selector === '#button1')
        console.log(this.handler);
    });
    
[/code]

とかで、取得できます。




タグ属性の`onclick`と、`$("#button1").click()`と、`$(document).on("click", "#button1",
...)`では、イベントとしては別物になります。

`onclick`を得るには、試された方法で取得できます。これはネイティブ(？)が発火しています。

対して、`$("#button1").click()`と`$(document).on("click", "#button1",
...)`は、jQueryが発火しています。
違いは、前者がボタンそのものに対するイベントで、後者はdocumentへのイベントをselecter("#button1")で絞り込んで発火しています。

なので、それぞれ。。

[code]

    var onclick = $("#button1").get(0).onclick;
    console.log(onclick);
    
[/code]

とか、

[code]

    var events = $._data($("#button1").get(0)).events
    $.each(events.click,function(){
      console.log(this.handler);
    });
    
[/code]

とか、

[code]

    var events2 = $._data($(document).get(0)).events
    $.each(events2.click,function(){
      if(this.selector === '#button1')
        console.log(this.handler);
    });
    
[/code]

とかで、取得できます。

