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:
- Prototipe
Event.observe
; - DOM
addEventListener
; - Sebagai atribut elemen
element.onclick
.
javascript
events
dom
Navneet
sumber
sumber
element.addEventListener(type, callback, [bubble])
, sementaraelement.onclick = function
akan menimpa setiap kali Anda menetapkan.Jawaban:
Jika Anda hanya perlu memeriksa apa yang terjadi pada halaman, Anda dapat mencoba bookmarklet Peristiwa Visual .
Pembaruan : Visual Event 2 tersedia.
sumber
EventBug
Plugin Beats Firebug .Itu tergantung pada bagaimana acara dilampirkan. Sebagai contoh ilustrasi kami memiliki penangan klik berikut:
Kami akan melampirkannya ke elemen kami menggunakan metode yang berbeda, beberapa yang memungkinkan inspeksi dan beberapa yang tidak.
Metode A) pengendali kejadian tunggal
Metode B) beberapa penangan acara
Metode C): jQuery
1.3.x
1.4.x (menyimpan pawang di dalam suatu objek)
(Lihat
jQuery.fn.data
danjQuery.data
)Metode D): Prototipe (berantakan)
1.5.x
1.6 hingga 1.6.0.3, inklusif (sangat sulit di sini)
1.6.1 (sedikit lebih baik)
sumber
addEventListener
?.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.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
sumber
getEventListeners(object)
obj getEventListeners()
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.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_Inspektur WebKit di browser Chrome atau Safari sekarang melakukan ini. Ini akan menampilkan pendengar acara untuk elemen DOM ketika Anda memilihnya di panel Elemen.
sumber
Dimungkinkan untuk membuat daftar semua pendengar acara dalam JavaScript: Tidak sulit; Anda hanya perlu meretas
prototype
metode elemen HTML ( sebelum menambahkan pendengar).Sekarang setiap elemen jangkar (
a
) akan memilikilastListenerInfo
properti yang berisi semua pendengarnya. Dan itu bahkan berfungsi untuk menghilangkan pendengar dengan fungsi anonim.sumber
Node.prototype
saja? Di situlahHTMLAnchorElement
warisan.addEventListener
dari segalanya. 'Gunakan getEventListeners di Google Chrome :
sumber
(Menulis ulang jawaban dari pertanyaan ini karena relevan di sini.)
Saat debugging, jika Anda hanya ingin melihat acara, saya sarankan ...
Jika Anda ingin menggunakan acara dalam kode Anda, dan Anda menggunakan jQuery sebelum versi 1.8 , Anda dapat menggunakan:
untuk mendapatkan acara tersebut. Pada versi 1.8, menggunakan .data ("acara") dihentikan (lihat tiket bug ini ). Kamu bisa menggunakan:
Contoh lain: Tulis semua acara klik pada tautan tertentu ke konsol:
(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.
sumber
$._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?$._data
mungkin perlu elemen dan bukan objek jQuery. Jadi saya perlu memperbaiki contoh saya di atas menjadiconsole.log($._data($myLink[0], "events").click);
1:
Prototype.observe
menggunakan Element.addEventListener (lihat kode sumber )2: Anda dapat mengganti
Element.addEventListener
untuk mengingat pendengar yang ditambahkan (properti praktisEventListenerList
telah dihapus dari proposal spesifikasi DOM3). Jalankan kode ini sebelum acara apa pun dilampirkan:Baca semua acara dengan:
Dan jangan lupa mengganti
Element.removeEventListener
untuk menghapus acara dari kebiasaanElement.eventListenerList
.3:
Element.onclick
properti membutuhkan perawatan khusus di sini:4: jangan lupa
Element.onclick
atribut konten: ini adalah dua hal yang berbeda:Jadi, Anda perlu menanganinya juga:
Bookmarklet Peristiwa Visual (disebutkan dalam jawaban paling populer) hanya mencuri cache penangan pustaka kustom:
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 ).
sumber
Anda dapat membungkus metode DOM asli untuk mengelola pendengar acara dengan meletakkan ini di atas Anda
<head>
:H / T @ les2
sumber
Alat pengembang Firefox sekarang melakukan ini. Acara ditampilkan dengan mengklik tombol "ev" di sebelah kanan tampilan setiap elemen, termasuk acara jQuery dan DOM .
sumber
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:
atau
sumber
Solusi yang sepenuhnya berfungsi berdasarkan jawaban Jan Turon - berperilaku seperti
getEventListeners()
dari konsol:(Ada sedikit bug dengan duplikat. Lagipula tidak banyak yang rusak.)
Pemakaian:
someElement.getEventListeners([name])
- Daftar kembali pendengar acara, jika nama diatur array kembali pendengar untuk acara itusomeElement.clearEventListeners([name])
- hapus semua pendengar acara, jika nama disetel hanya hapus pendengar untuk acara itusumber
body
dandocument
.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)
sumber
Prototipe 1.7.1 cara
sumber
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
EventListeners
tujuannya. Ini memiliki tiga metode yang berguna:add()
,remove()
, danget()
.Berikutnya, saya membuat sebuah
EventListener
objek untuk memegang informasi yang diperlukan untuk acara tersebut, yaitu:target
,type
,callback
,options
,useCapture
,wantsUntrusted
, dan menambahkan metoderemove()
untuk menghapus pendengar.Terakhir, saya memperluas yang asli
addEventListener()
danremoveEventListener()
metode untuk membuatnya bekerja dengan objek yang saya buat (EventListener
danEventListeners
).Pemakaian:
addEventListener()
membuatEventListener
objek, menambahkannya keEventListeners
dan mengembalikanEventListener
objek, sehingga dapat dihapus nanti.EventListeners.get()
dapat digunakan untuk melihat pendengar di halaman. Ia menerima sebuahEventTarget
atau string (tipe acara).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:
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.
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
Saya percaya ini milik jQuery, dan bukan panggilan balik yang sebenarnya. jQuery menyimpan panggilan balik aktual di properti TargetTarget:
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.sumber
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:
sumber
Ada ekstensi Acara jQuery yang bagus :
( sumber topik )
sumber
mengubah fungsi-fungsi ini akan memungkinkan Anda untuk mencatat pendengar yang ditambahkan:
baca sisa pendengar dengan
sumber