Bagaimana menemukan pendengar acara pada simpul DOM saat debugging atau dari kode JavaScript?

841

Saya memiliki halaman di mana beberapa pendengar acara dilampirkan ke kotak input dan pilih kotak. Apakah ada cara untuk mengetahui pendengar acara mana yang mengamati simpul DOM tertentu dan untuk acara apa?

Acara dilampirkan menggunakan:

  1. Prototipe Event.observe ;
  2. DOM addEventListener;
  3. Sebagai atribut elemen element.onclick.
Navneet
sumber
3
Bagaimana acara yang dilampirkan di tempat pertama? Apakah Anda menggunakan perpustakaan (mis. Prototipe, jQuery, dll)?
Crescent Fresh
Penting untuk dicatat bahwa beberapa fungsi panggilan balik dapat dilampirkan untuk jenis acara yang sama melalui element.addEventListener(type, callback, [bubble]), sementara element.onclick = functionakan menimpa setiap kali Anda menetapkan.
Braden Best

Jawaban:

507

Jika Anda hanya perlu memeriksa apa yang terjadi pada halaman, Anda dapat mencoba bookmarklet Peristiwa Visual .

Pembaruan : Visual Event 2 tersedia.

Andrew Hedges
sumber
1
Sempurna! EventBugPlugin Beats Firebug .
Robin Maben
22
Ini menambahkan satu juta elemen ke halaman, banyak di antaranya adalah gambar. Kegunaannya sangat berkurang pada halaman dengan banyak penangan acara (saya punya 17rb dan Visual Event membutuhkan waktu sekitar 3 menit untuk memuat).
Tony R
15
Saya percaya ekstensi Chrome @ssharma yang disebutkan adalah yang tersedia di sini
kmote
1
Acara Visial tidak berfungsi jika halaman merujuk perpustakaan js pihak ketiga. Itu menimbulkan kesalahan: XMLHttpRequest tidak dapat memuat A.com/js/jquery-ui-1.10.3.custom.js?_=1384831682813 . Origin B.com tidak diizinkan oleh Access-Control-Allow-Origin.
hiway
5
Alat Pengembang internal Chrome dan FF (F12) memiliki penampil acara internal! Chrome: pada tab "Elements", pilih dan elemen dan lihat di sebelah kanan ada: Style, Computed, Event Listeners
oriadam
365

Itu tergantung pada bagaimana acara dilampirkan. Sebagai contoh ilustrasi kami memiliki penangan klik berikut:

var handler = function() { alert('clicked!') };

Kami akan melampirkannya ke elemen kami menggunakan metode yang berbeda, beberapa yang memungkinkan inspeksi dan beberapa yang tidak.

Metode A) pengendali kejadian tunggal

element.onclick = handler;
// inspect
alert(element.onclick); // alerts "function() { alert('clicked!') }"

Metode B) beberapa penangan acara

if(element.addEventListener) { // DOM standard
    element.addEventListener('click', handler, false)
} else if(element.attachEvent) { // IE
    element.attachEvent('onclick', handler)
}
// cannot inspect element to find handlers

Metode C): jQuery

$(element).click(handler);
  • 1.3.x

    // inspect
    var clickEvents = $(element).data("events").click;
    jQuery.each(clickEvents, function(key, value) {
        alert(value) // alerts "function() { alert('clicked!') }"
    })
  • 1.4.x (menyimpan pawang di dalam suatu objek)

    // inspect
    var clickEvents = $(element).data("events").click;
    jQuery.each(clickEvents, function(key, handlerObj) {
        alert(handlerObj.handler) // alerts "function() { alert('clicked!') }"
        // also available: handlerObj.type, handlerObj.namespace
    })

(Lihat jQuery.fn.datadan jQuery.data)

Metode D): Prototipe (berantakan)

$(element).observe('click', handler);
  • 1.5.x

    // inspect
    Event.observers.each(function(item) {
        if(item[0] == element) {
            alert(item[2]) // alerts "function() { alert('clicked!') }"
        }
    })
  • 1.6 hingga 1.6.0.3, inklusif (sangat sulit di sini)

    // inspect. "_eventId" is for < 1.6.0.3 while 
    // "_prototypeEventID" was introduced in 1.6.0.3
    var clickEvents = Event.cache[element._eventId || (element._prototypeEventID || [])[0]].click;
    clickEvents.each(function(wrapper){
        alert(wrapper.handler) // alerts "function() { alert('clicked!') }"
    })
  • 1.6.1 (sedikit lebih baik)

    // inspect
    var clickEvents = element.getStorage().get('prototype_event_registry').get('click');
    clickEvents.each(function(wrapper){
        alert(wrapper.handler) // alerts "function() { alert('clicked!') }"
    })
Crescent Fresh
sumber
3
Terima kasih untuk memperbarui ini. Sangat disayangkan bahwa Anda harus beralih melalui setiap jenis penangan.
Keith Bentrup
4
Pada "Metode B" (addEventListener), inilah jawaban mengenai status fasilitas enumerasi untuk penangan yang terdaftar dengan API Acara DOM murni: stackoverflow.com/questions/7810534/…
Nickolay
@ John: terima kasih atas komentarnya. Anda memiliki contoh "JavaScript nyata" untuk mengambil pendengar yang sebelumnya ditambahkan melalui addEventListener?
Crescent Fresh
6
@ Jan, ini sepertinya tidak berfungsi untuk jQuery 1.7.2, apakah ada pendekatan yang berbeda untuk versi itu?
tomdemuyt
14
@tomdemuyt Di jQuery, acara sekarang disimpan dalam array data internal daripada diakses melalui .data('events')seperti sebelumnya. Untuk mengakses data acara internal, gunakan $._data(elem, 'events'). Perhatikan bahwa fungsi ini ditandai "hanya untuk penggunaan internal" di sumber jQuery, jadi tidak ada janji bahwa itu akan selalu bekerja di masa depan, tapi saya percaya itu berfungsi sejak jQuery 1.7 dan masih berfungsi.
Matt Browne
351

Dukungan Chrome, Firefox, Vivaldi dan Safari getEventListeners(domElement)di konsol Alat Pengembang mereka.

Untuk sebagian besar tujuan debugging, ini bisa digunakan.

Di bawah ini adalah referensi yang sangat baik untuk menggunakannya: https://developers.google.com/web/tools/chrome-devtools/console/utilities#geteventlisteners

Raghav
sumber
1
+1. Kode khusus peramban bukan masalah bagi saya, karena saya mencoba mendapatkan halaman yang tidak saya kontrol agar berfungsi dengan baik.
Grault
9
bagus, tetapi hanya berfungsi di baris perintah konsol Chrome :(
gillyspy
5
@Raghav ah terima kasih, penggunaannya BUKAN: seperti yang saya pikirkan pertama kali :)getEventListeners(object) obj getEventListeners()
jave.web
11
Anda bisa menyelamatkan saya 3 jam jika Anda telah menjelaskan cara mendapatkan kode sumber pendaftar acara. "Referensi" itu tidak menjelaskan apa pun. Dalam kasus orang lain adalah pada penurunan di sini caranya: var list = getEventListeners(document.getElementById("YOURIDHERE")); console.log(list["focus"][0]["listener"].toString()). Ubah "fokus" ke acara yang ingin Anda periksa dan nomor jika ada beberapa pendengar di acara yang sama.
doABarrelRoll721
46
TIP: getEventListeners($0)akan membuat pendengar acara untuk elemen yang Anda fokuskan di alat dev Chrome. Saya menggunakan ini sepanjang waktu. Cinta tidak harus menggunakan fungsi querySelector atau get__By_
cacoder
91

Inspektur WebKit di browser Chrome atau Safari sekarang melakukan ini. Ini akan menampilkan pendengar acara untuk elemen DOM ketika Anda memilihnya di panel Elemen.

Ishan
sumber
9
Saya tidak yakin ini menunjukkan semua penangan acara; hanya penangan event HTML tunggal.
huyz
3
Saya harus menyebutkan plugin EventBug untuk Firebug untuk kelengkapan < softwareishard.com/blog/category/eventbug >
Nickolay
Ini hanya membuat hari saya, beberapa kode prototipe warisan memiliki beberapa fungsi terikat pada acara yang sama pada elemen yang sama dan saya sekarat berusaha melacaknya. Terima kasih banyak Ishan.
siliconrockstar
70

Dimungkinkan untuk membuat daftar semua pendengar acara dalam JavaScript: Tidak sulit; Anda hanya perlu meretas prototypemetode elemen HTML ( sebelum menambahkan pendengar).

function reportIn(e){
    var a = this.lastListenerInfo[this.lastListenerInfo.length-1];
    console.log(a)
}


HTMLAnchorElement.prototype.realAddEventListener = HTMLAnchorElement.prototype.addEventListener;

HTMLAnchorElement.prototype.addEventListener = function(a,b,c){
    this.realAddEventListener(a,reportIn,c); 
    this.realAddEventListener(a,b,c); 
    if(!this.lastListenerInfo){  this.lastListenerInfo = new Array()};
    this.lastListenerInfo.push({a : a, b : b , c : c});
};

Sekarang setiap elemen jangkar ( a) akan memiliki lastListenerInfoproperti yang berisi semua pendengarnya. Dan itu bahkan berfungsi untuk menghilangkan pendengar dengan fungsi anonim.

Ivan Castellanos
sumber
4
Metode ini tidak akan berfungsi jika Anda menulis skrip pengguna atau skrip konten. Tidak hanya kemungkinan sandbox hari ini tetapi bagaimana Anda bisa menjamin urutan eksekusi?
huyz
metode ini bekerja dengan chrome / 19 dan FF / 12. urutan eksekusi dapat dijamin jika Anda mengaitkan ini dengan skrip lain
Tzury Bar Yochay
8
Tidak bisakah Anda memodifikasi Node.prototypesaja? Di situlah HTMLAnchorElementwarisan .addEventListenerdari segalanya. '
Esailija
3
Anda berasumsi bahwa agen pengguna mengimplementasikan pewarisan prototipe untuk objek host DOM dan memungkinkan Anda untuk memodifikasinya. Tak satu pun dari itu adalah ide bagus: jangan memodifikasi objek yang tidak Anda miliki .
RobG
1
Ini sangat tidak berguna - ini menunjukkan apa eventListeners ditambahkan, yang bisa bagus dalam beberapa kasus, tetapi tidak apa yang dihapus. Jadi, jika Anda mencoba men-debug apa yang telah dihapus dan yang tidak, sama sekali tidak mungkin.
Gotofritz
52

Gunakan getEventListeners di Google Chrome :

getEventListeners(document.getElementByID('btnlogin'));
getEventListeners($('#btnlogin'));
Pranay Soni
sumber
1
ReferenceError Uncaught: getEventListeners tidak didefinisikan
Bryan Grace
3
getEventListeners hanya berfungsi di konsol devtools Chrome. Dan ini adalah duplikat dari jawaban yang lebih rumit ini: stackoverflow.com/a/16544813/1026
Nickolay
41

(Menulis ulang jawaban dari pertanyaan ini karena relevan di sini.)

Saat debugging, jika Anda hanya ingin melihat acara, saya sarankan ...

  1. Peristiwa Visual
  2. Bagian Elemen Alat Pengembang Chrome: pilih elemen dan cari "Pendengar Acara" di kanan bawah (serupa di Firefox)

Jika Anda ingin menggunakan acara dalam kode Anda, dan Anda menggunakan jQuery sebelum versi 1.8 , Anda dapat menggunakan:

$(selector).data("events")

untuk mendapatkan acara tersebut. Pada versi 1.8, menggunakan .data ("acara") dihentikan (lihat tiket bug ini ). Kamu bisa menggunakan:

$._data(element, "events")

Contoh lain: Tulis semua acara klik pada tautan tertentu ke konsol:

var $myLink = $('a.myClass');
console.log($._data($myLink[0], "events").click);

(lihat http://jsfiddle.net/HmsQC/ untuk contoh kerja)

Sayangnya, menggunakan data $ ._ ini tidak disarankan kecuali untuk debugging karena ini adalah struktur jQuery internal, dan dapat berubah dalam rilis mendatang. Sayangnya saya tahu tidak ada cara lain yang mudah untuk mengakses acara.

Luke
sumber
1
$._data(elem, "events")tampaknya tidak berfungsi dengan jQuery 1.10, setidaknya untuk acara yang terdaftar menggunakan $(elem).on('event', ...). Apakah ada yang tahu cara men-debug itu?
Marius Gedminas
4
Saya tidak positif, tapi saya pikir param pertama $._datamungkin perlu elemen dan bukan objek jQuery. Jadi saya perlu memperbaiki contoh saya di atas menjadiconsole.log($._data($myLink[0], "events").click);
Luke
29

1: Prototype.observemenggunakan Element.addEventListener (lihat kode sumber )

2: Anda dapat mengganti Element.addEventListeneruntuk mengingat pendengar yang ditambahkan (properti praktis EventListenerListtelah dihapus dari proposal spesifikasi DOM3). Jalankan kode ini sebelum acara apa pun dilampirkan:

(function() {
  Element.prototype._addEventListener = Element.prototype.addEventListener;
  Element.prototype.addEventListener = function(a,b,c) {
    this._addEventListener(a,b,c);
    if(!this.eventListenerList) this.eventListenerList = {};
    if(!this.eventListenerList[a]) this.eventListenerList[a] = [];
    this.eventListenerList[a].push(b);
  };
})();

Baca semua acara dengan:

var clicks = someElement.eventListenerList.click;
if(clicks) clicks.forEach(function(f) {
  alert("I listen to this function: "+f.toString());
});

Dan jangan lupa mengganti Element.removeEventListeneruntuk menghapus acara dari kebiasaanElement.eventListenerList .

3: Element.onclickproperti membutuhkan perawatan khusus di sini:

if(someElement.onclick)
  alert("I also listen tho this: "+someElement.onclick.toString());

4: jangan lupa Element.onclickatribut konten: ini adalah dua hal yang berbeda:

someElement.onclick = someHandler; // IDL attribute
someElement.setAttribute("onclick","otherHandler(event)"); // content attribute

Jadi, Anda perlu menanganinya juga:

var click = someElement.getAttribute("onclick");
if(click) alert("I even listen to this: "+click);

Bookmarklet Peristiwa Visual (disebutkan dalam jawaban paling populer) hanya mencuri cache penangan pustaka kustom:

Ternyata tidak ada metode standar yang disediakan oleh antarmuka DOM yang direkomendasikan W3C untuk mencari tahu acara apa yang dilampirkan pendengar ke elemen tertentu. Meskipun ini mungkin kelihatan sebagai suatu kekeliruan, ada proposal untuk menyertakan properti yang disebut eventListenerList ke spesifikasi DOM level 3, tetapi sayangnya telah dihapus dalam konsep selanjutnya. Karena itu kita dipaksa untuk melihat pustaka Javascript individu, yang biasanya memelihara cache dari peristiwa terlampir (sehingga nanti dapat dihapus dan melakukan abstraksi bermanfaat lainnya).

Dengan demikian, agar Visual Event dapat menampilkan acara, itu harus dapat mengurai informasi acara dari perpustakaan Javascript.

Overriding elemen mungkin dipertanyakan (yaitu karena ada beberapa fitur spesifik DOM seperti koleksi hidup, yang tidak dapat dikodekan dalam JS), tetapi memberikan dukungan eventListenerList secara asli dan berfungsi di Chrome, Firefox, dan Opera (tidak berfungsi di IE7 ).

Jan Turoň
sumber
23

Anda dapat membungkus metode DOM asli untuk mengelola pendengar acara dengan meletakkan ini di atas Anda <head>:

<script>
    (function(w){
        var originalAdd = w.addEventListener;
        w.addEventListener = function(){
            // add your own stuff here to debug
            return originalAdd.apply(this, arguments);
        };

        var originalRemove = w.removeEventListener;
        w.removeEventListener = function(){
            // add your own stuff here to debug
            return originalRemove.apply(this, arguments);
        };
    })(window);
</script>

H / T @ les2

Jon z
sumber
Harap perbaiki saya jika saya salah, tetapi bukankah ini hanya untuk pendengar acara yang dilampirkan ke jendela?
Maciej Krawczyk
@MaciejKrawczyk ya, dan gelembung itu
Jon z
18

Alat pengembang Firefox sekarang melakukan ini. Acara ditampilkan dengan mengklik tombol "ev" di sebelah kanan tampilan setiap elemen, termasuk acara jQuery dan DOM .

Cuplikan layar tombol pendengar acara alat pengembang Firefox di tab inspektur

simonzack
sumber
Saya memang melihat salah satu elemen dom pada halaman dimana bookmark Visual Event 2 menunjukkan sebuah acara yang ditransfer, dan saya memang melihat tombol "ev" kecil di sebelah kanan, seperti yang Anda tunjukkan.
Eric
Pendengar acara Firefox dapat mengetahui acara yang didelegasikan jQuery sementara Chrome membutuhkan plugin untuk melakukannya.
Nick Tsai
12

Jika Anda memiliki Firebug , Anda dapat menggunakannya console.dir(object or array)untuk mencetak pohon yang bagus di log konsol dari skalar, array, atau objek JavaScript apa pun.

Mencoba:

console.dir(clickEvents);

atau

console.dir(window);
Michael Butler
sumber
9
Fitur baru di firebug 1.12 getfirebug.com/wiki/index.php/GetEventListeners
Javier Constanzo
10

Solusi yang sepenuhnya berfungsi berdasarkan jawaban Jan Turon - berperilaku seperti getEventListeners()dari konsol:

(Ada sedikit bug dengan duplikat. Lagipula tidak banyak yang rusak.)

(function() {
  Element.prototype._addEventListener = Element.prototype.addEventListener;
  Element.prototype.addEventListener = function(a,b,c) {
    if(c==undefined)
      c=false;
    this._addEventListener(a,b,c);
    if(!this.eventListenerList)
      this.eventListenerList = {};
    if(!this.eventListenerList[a])
      this.eventListenerList[a] = [];
    //this.removeEventListener(a,b,c); // TODO - handle duplicates..
    this.eventListenerList[a].push({listener:b,useCapture:c});
  };

  Element.prototype.getEventListeners = function(a){
    if(!this.eventListenerList)
      this.eventListenerList = {};
    if(a==undefined)
      return this.eventListenerList;
    return this.eventListenerList[a];
  };
  Element.prototype.clearEventListeners = function(a){
    if(!this.eventListenerList)
      this.eventListenerList = {};
    if(a==undefined){
      for(var x in (this.getEventListeners())) this.clearEventListeners(x);
        return;
    }
    var el = this.getEventListeners(a);
    if(el==undefined)
      return;
    for(var i = el.length - 1; i >= 0; --i) {
      var ev = el[i];
      this.removeEventListener(a, ev.listener, ev.useCapture);
    }
  };

  Element.prototype._removeEventListener = Element.prototype.removeEventListener;
  Element.prototype.removeEventListener = function(a,b,c) {
    if(c==undefined)
      c=false;
    this._removeEventListener(a,b,c);
      if(!this.eventListenerList)
        this.eventListenerList = {};
      if(!this.eventListenerList[a])
        this.eventListenerList[a] = [];

      // Find the event in the list
      for(var i=0;i<this.eventListenerList[a].length;i++){
          if(this.eventListenerList[a][i].listener==b, this.eventListenerList[a][i].useCapture==c){ // Hmm..
              this.eventListenerList[a].splice(i, 1);
              break;
          }
      }
    if(this.eventListenerList[a].length==0)
      delete this.eventListenerList[a];
  };
})();

Pemakaian:

someElement.getEventListeners([name]) - Daftar kembali pendengar acara, jika nama diatur array kembali pendengar untuk acara itu

someElement.clearEventListeners([name]) - hapus semua pendengar acara, jika nama disetel hanya hapus pendengar untuk acara itu

n00b
sumber
3
Ini adalah jawaban yang bagus, tetapi saya tidak bisa membuatnya bekerja pada elemen bodydan document.
David Bradshaw
Solusi yang sangat bagus!
Dzhakhar Ukhaev
@Peter Mortensen, mengapa Anda mengubah nama Jan? :)
n00b
1
@ David Bradshaw: karena tubuh, dokumen dan jendela memiliki prototipe sendiri dan bukan prototipe Elemen ...
Stefan Steiger
1
@ n00b: Ada bug. Itu sebabnya hmmm. Anda menggunakan koma-operator di pernyataan if untuk pendengar dan useCaption ... Operator koma mengevaluasi masing-masing operan (dari kiri ke kanan) dan mengembalikan nilai operan terakhir. Jadi, Anda menghapus eventListener pertama yang cocok dengan useCapture, terlepas dari jenis acara ... Itu harus && bukan koma.
Stefan Steiger
8

Opera 12 (bukan yang berbasis mesin Chrome Webkit terbaru) Dragonfly telah memiliki ini untuk sementara waktu dan jelas ditampilkan dalam struktur DOM. Menurut pendapat saya ini adalah debugger yang unggul dan merupakan satu-satunya alasan yang tersisa mengapa saya masih menggunakan versi berbasis Opera 12 (tidak ada v13, versi v14 dan berbasis Webkit v15 tidak memiliki Dragonfly)

masukkan deskripsi gambar di sini

Daniel Sokolowski
sumber
4

Prototipe 1.7.1 cara

function get_element_registry(element) {
    var cache = Event.cache;
    if(element === window) return 0;
    if(typeof element._prototypeUID === 'undefined') {
        element._prototypeUID = Element.Storage.UID++;
    }
    var uid =  element._prototypeUID;           
    if(!cache[uid]) cache[uid] = {element: element};
    return cache[uid];
}
Ronald
sumber
4

Saya baru-baru ini bekerja dengan acara dan ingin melihat / mengontrol semua acara di halaman. Setelah melihat kemungkinan solusi, saya telah memutuskan untuk menempuh jalan saya sendiri dan membuat sistem khusus untuk memantau acara. Jadi, saya melakukan tiga hal.

Pertama, saya membutuhkan wadah untuk semua pendengar acara di halaman: itulah EventListenerstujuannya. Ini memiliki tiga metode yang berguna: add(), remove(), dan get().

Berikutnya, saya membuat sebuah EventListenerobjek untuk memegang informasi yang diperlukan untuk acara tersebut, yaitu: target, type, callback, options, useCapture, wantsUntrusted, dan menambahkan metode remove()untuk menghapus pendengar.

Terakhir, saya memperluas yang asli addEventListener()dan removeEventListener()metode untuk membuatnya bekerja dengan objek yang saya buat ( EventListenerdan EventListeners).

Pemakaian:

var bodyClickEvent = document.body.addEventListener("click", function () {
    console.log("body click");
});

// bodyClickEvent.remove();

addEventListener()membuat EventListenerobjek, menambahkannya ke EventListenersdan mengembalikan EventListenerobjek, sehingga dapat dihapus nanti.

EventListeners.get()dapat digunakan untuk melihat pendengar di halaman. Ia menerima sebuah EventTargetatau string (tipe acara).

// EventListeners.get(document.body);
// EventListeners.get("click");

Demo

Katakanlah kita ingin mengetahui setiap pendengar acara di halaman ini. Kami dapat melakukannya (dengan asumsi Anda menggunakan ekstensi pengelola skrip, Tampermonkey dalam kasus ini). Script berikut melakukan ini:

// ==UserScript==
// @name         New Userscript
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @include      https://stackoverflow.com/*
// @grant        none
// ==/UserScript==

(function() {
    fetch("https://raw.githubusercontent.com/akinuri/js-lib/master/EventListener.js")
        .then(function (response) {
            return response.text();
        })
        .then(function (text) {
            eval(text);
            window.EventListeners = EventListeners;
        });
})(window);

Dan ketika kami daftar semua pendengar, dikatakan ada 299 pendengar acara. "Sepertinya" ada beberapa duplikat, tapi saya tidak tahu apakah mereka benar-benar duplikat. Tidak semua jenis acara digandakan, jadi semua "duplikat" itu mungkin adalah pendengar individu.

tangkapan layar konsol yang mencantumkan semua pendengar acara di halaman ini

Kode dapat ditemukan di repositori saya . Saya tidak ingin mempostingnya di sini karena agak panjang.


Pembaruan: Ini sepertinya tidak berfungsi dengan jQuery. Ketika saya memeriksa EventListener, saya melihat bahwa panggilan baliknya

function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}

Saya percaya ini milik jQuery, dan bukan panggilan balik yang sebenarnya. jQuery menyimpan panggilan balik aktual di properti TargetTarget:

$(document.body).click(function () {
    console.log("jquery click");
});

masukkan deskripsi gambar di sini

Untuk menghapus pendengar acara, panggilan balik yang sebenarnya perlu diteruskan ke removeEventListener()metode. Jadi untuk membuat ini berfungsi dengan jQuery, perlu modifikasi lebih lanjut. Saya mungkin memperbaikinya di masa depan.

akinuri
sumber
Bagus sekali! Terima kasih
mt025
3

Saya mencoba melakukannya di jQuery 2.1, dan dengan metode " $().click() -> $(element).data("events").click;" itu tidak berfungsi.

Saya menyadari bahwa hanya fungsi $ ._ data () yang berfungsi dalam kasus saya:

	$(document).ready(function(){

		var node = $('body');
		
        // Bind 3 events to body click
		node.click(function(e) { alert('hello');  })
			.click(function(e) { alert('bye');  })
			.click(fun_1);

        // Inspect the events of body
		var events = $._data(node[0], "events").click;
		var ev1 = events[0].handler // -> function(e) { alert('hello')
		var ev2 = events[1].handler // -> function(e) { alert('bye')
		var ev3 = events[2].handler // -> function fun_1()
        
		$('body')
			.append('<p> Event1 = ' + eval(ev1).toString() + '</p>')
			.append('<p> Event2 = ' + eval(ev2).toString() + '</p>')
			.append('<p> Event3 = ' + eval(ev3).toString() + '</p>');        
	
	});

	function fun_1() {
		var txt = 'text del missatge';	 
		alert(txt);
	}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<body>
</body>

Joel Barba
sumber
1

mengubah fungsi-fungsi ini akan memungkinkan Anda untuk mencatat pendengar yang ditambahkan:

EventTarget.prototype.addEventListener
EventTarget.prototype.attachEvent
EventTarget.prototype.removeEventListener
EventTarget.prototype.detachEvent

baca sisa pendengar dengan

console.log(someElement.onclick);
console.log(someElement.getAttribute("onclick"));
Aiden Waterman
sumber