Periksa penangan peristiwa terlampir untuk setiap elemen DOM

107

Apakah ada cara untuk melihat fungsi / kode apa yang dilampirkan ke acara apa pun untuk elemen DOM? Menggunakan Firebug atau alat lainnya.

Claudio Redi
sumber
Terlampir menggunakan jQuery atau menggunakan DOM asli?
SLaks
3
@SLaks: Pertanyaan bagus. Terlampir menggunakan mekanisme APAPUN
Claudio Redi

Jawaban:

71

Penangan peristiwa yang dilampirkan menggunakan tradisional element.onclick= handleratau HTML <element onclick="handler">dapat diambil dengan mudah dari element.onclickproperti dari skrip atau dalam-debugger.

Penangan peristiwa yang dilampirkan menggunakan addEventListenermetode Peristiwa Tingkat 2 DOM dan IE attachEventsaat ini tidak dapat diambil dari skrip sama sekali. DOM Level 3 pernah diusulkan element.eventListenerListuntuk mendapatkan semua pendengar, tetapi tidak jelas apakah ini akan mencapai spesifikasi akhir. Tidak ada implementasi di browser mana pun saat ini.

Alat debugging sebagai ekstensi browser bisa mendapatkan akses ke jenis pendengar ini, tetapi saya tidak mengetahui apa pun yang sebenarnya melakukannya.

Beberapa kerangka kerja JS menyisakan cukup banyak rekaman peristiwa yang mengikat untuk mengetahui apa yang telah mereka lakukan. Peristiwa Visual mengambil pendekatan ini untuk menemukan pendengar yang terdaftar melalui beberapa kerangka kerja populer.

bobince
sumber
7
Sekarang ada ekstensi untuk Firebug yang disebut EventBug dan dilaporkan memiliki fitur serupa di chrome / safari. Saya juga akan menautkan ke diskusi yang lebih populer tentang ini: stackoverflow.com/questions/446892/…
Nickolay
1
Di Opera Anda dapat menggunakan Opera Dragonfly bawaan untuk itu.
Norill Tempest
Juga ada bagian bawaan untuk FireBug (Ekstensi untuk FireFox) untuk acara ketika tag HTML dipilih.
Musa Haidari
EventBug diintegrasikan ke dalam FireBug sejak versi 2 (ada tab "Acara" sekarang).
Chris Rae
2
Sejak Firefox 33, penangan acara ditampilkan di inspektur HTML stok .
ivan_pozdeev
76

The Elements Panel di alat Pengembang Google Chrome telah memiliki ini sejak rilis Chrome pada pertengahan 2011 dan Chrome pengembang saluran rilis sejak tahun 2010.

Selain itu, event listener yang ditampilkan untuk node yang dipilih berada dalam urutan saat mereka diaktifkan melalui fase capture dan bubble.

Tekan command+ option+ idi Mac OSX dan Ctrl+ Shift+ idi Windows untuk menjalankannya di Chrome

tangkapan layar alat dev

tuxtitlan.dll
sumber
5
Bagaimana panel elemen di Chrome melakukan ini?
thunderboltz
1
Juga, bagaimana kita bisa menemukan kode yang menetapkan ini? Setelah saya menemukan penangan peristiwa tersangka menggunakan UI ini, bilah tidak cukup lebar bagi saya untuk melihat kode penangan ...
Steven Lu
Menurut saya pendekatan ini agak membingungkan .. setidaknya bagi saya. Ketika saya membuka acara, itu hanya memiliki acara jQuery, acara khusus saya untuk elemen tertentu tidak ditampilkan. Saya menggunakan $ ._ data untuk acara khusus yang saya lampirkan dengan jQuery. Lihat stackoverflow.com/questions/2008592/…
stack247
2
Apakah mungkin untuk memeriksa peristiwa pada windowobjek, seperti messageacara tersebut?
Septagram
8

Alat Pengembang Chrome baru-baru ini mengumumkan beberapa alat baru untuk Memantau Peristiwa JavaScript .

TL; DR

Dengarkan acara dari jenis tertentu menggunakan monitorEvents().

Gunakan unmonitorEvents()untuk berhenti mendengarkan.

Dapatkan listener elemen DOM menggunakan getEventListeners().

Gunakan panel Event Listeners Inspector untuk mendapatkan informasi tentang event listener.

Menemukan Peristiwa Kustom

Untuk kebutuhan saya, menemukan peristiwa JS kustom dalam kode pihak ketiga, dua versi berikut getEventListeners()ini sangat membantu;

  • getEventListeners(window)
  • getEventListeners(document)

Jika Anda tahu apa Node DOM yang dilampirkan event listener, Anda akan meneruskannya, bukan windowatau document.

Acara yang Diketahui

Jika Anda tahu apa acara yang Anda ingin memantau misalnya clickpada tubuh dokumen Anda bisa menggunakan berikut: monitorEvents(document.body, 'click');.

Anda sekarang harus mulai melihat semua peristiwa klik saat document.bodylogin di konsol.

GFargo
sumber
Saya sudah mencoba getEventListeners ini (document.getElementById ("inputId")); tetapi mengembalikan tidak valid, dengan ukuran larik 1
hijau kaya
6

Anda bisa melihat kejadian yang dilampirkan secara langsung (element.onclick = handler) dengan melihat DOM. Anda dapat melihat acara yang terpasang dengan jQuery di Firefox menggunakan FireBug dengan FireQuery. Tampaknya tidak ada cara untuk melihat peristiwa yang ditambahkan addEventListener menggunakan FireBug. Namun, Anda dapat melihatnya di Chrome menggunakan debugger Chrome.

mhenry1384
sumber
6

Anda dapat menggunakan Visual Event oleh Allan Jardine untuk memeriksa semua penangan kejadian yang saat ini dilampirkan dari beberapa perpustakaan JavaScript utama di halaman Anda. Ia bekerja dengan jQuery, YUI dan beberapa lainnya.

Visual Event adalah bookmarklet JavaScript sehingga kompatibel dengan semua browser utama.

Medlock Perlman
sumber
1

Anda dapat memperluas lingkungan javascript untuk melacak event listener. Gabungkan (atau 'overload') metode addEventListener () native dengan beberapa kode yang dapat menyimpan catatan event listener yang ditambahkan sejak saat itu . Anda juga harus memperluas HTMLElement.prototype.removeEventListener untuk menyimpan catatan yang secara akurat mencerminkan apa yang terjadi di DOM.

Hanya untuk ilustrasi (kode yang belum teruji) - ini adalah contoh bagaimana Anda akan 'membungkus' addEventListener untuk memiliki catatan event listener terdaftar pada objek itu sendiri:

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);
}
Rolf
sumber