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.


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.


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


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


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.


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.


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.


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);
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.