Saya perlu menemukan penangan acara mana yang terdaftar atas suatu objek.
Sebagai contoh:
$("#el").click(function() {...});
$("#el").mouseover(function() {...});
$("#el")
telah klik dan mouseover terdaftar.
Apakah ada fungsi untuk mengetahuinya, dan mungkin mengulangi event handler?
Jika tidak mungkin pada objek jQuery melalui metode yang tepat, apakah mungkin pada objek DOM biasa?
var events = (jQuery._data || jQuery.data)(elem, 'events');
Jawaban:
Pada jQuery 1.8, data acara tidak lagi tersedia dari "API publik" untuk data. Baca posting blog jQuery ini . Anda sekarang harus menggunakan ini sebagai gantinya:
elem
harus berupa Elemen HTML, bukan objek jQuery, atau pemilih.Harap dicatat, bahwa ini adalah struktur internal, 'pribadi', dan tidak boleh dimodifikasi. Gunakan ini hanya untuk keperluan debugging.
Di versi jQuery yang lebih lama, Anda mungkin harus menggunakan metode lama yaitu:
sumber
$._data($(elem).get(0), "events")
handler: function () {
di dalam properti klik. Saya harus mengklik dua kali pada bagian fungsi untuk memperluas dan menampilkan isi penuh fungsi.var events = (jQuery._data || jQuery.data)(elem, 'events');
Anda dapat melakukannya dengan merangkak acara (per jQuery 1.8+), seperti ini:
Inilah contoh yang bisa Anda mainkan:
sumber
jQuery._data( jQuery("#el")[0], "events" );
bukan metode 'data publik':jQuery("#el").data("events")
. Theevents
objek belum benar-benar telah disimpan dalam.data()
untuk waktu yang lama, kami dipangkas beberapa byte kode keluar dengan menghapus ini "proxy" dari "API publik"Untuk jQuery 1.8+, ini tidak akan berfungsi lagi karena data internal ditempatkan di objek yang berbeda.
Cara tidak resmi terbaru (tetapi berfungsi di versi sebelumnya juga, setidaknya dalam 1.7.2) untuk melakukannya sekarang adalah -
$._data(element, "events")
Garis bawah ("_") adalah yang membuat perbedaan di sini. Secara internal, ia memanggil
$.data(element, name, null, true)
, parameter (keempat) terakhir adalah internal ("pvt").sumber
jQuery._data( element, "events" )
adalah cara yang 'benar' untuk mendapatkan informasi ini sekarang.Steker yang tidak tahu malu, tetapi Anda dapat menggunakan findHandlerJS
Untuk menggunakannya Anda hanya perlu memasukkan findHandlersJS (atau cukup salin & tempel kode javascript mentah ke jendela konsol chrome) dan tentukan jenis acara dan pemilih jquery untuk elemen yang Anda minati.
Sebagai contoh Anda, Anda dapat dengan cepat menemukan penangan acara yang Anda sebutkan dengan melakukan
Inilah yang dikembalikan:
aktual tempat pengendali event terdaftar
Array dengan informasi tentang penangan acara jquery untuk jenis acara yang menarik bagi kami (mis. klik, ubah, dll.)
Metode event handler aktual yang dapat Anda lihat dengan mengklik kanan dan memilih Tampilkan definisi fungsi
Selector yang disediakan untuk acara yang didelegasikan. Itu akan kosong untuk acara langsung.
Daftar dengan elemen-elemen yang ditargetkan oleh event handler ini. Misalnya, untuk pengendali acara yang didelegasikan yang terdaftar di objek dokumen dan menargetkan semua tombol di halaman, properti ini akan mencantumkan semua tombol di halaman. Anda dapat mengarahkannya dan melihatnya disorot dalam chrome.
Anda bisa mencobanya di sini
sumber
Saya menggunakan plugin EventBug untuk Firebug untuk tujuan ini.
sumber
Saya telah menggabungkan kedua solusi dari @jps ke satu fungsi:
Namun waspadalah, fungsi ini hanya dapat mengembalikan acara yang diatur menggunakan jQuery itu sendiri.
sumber
Pada 1.9, tidak ada cara yang terdokumentasi untuk mengambil kembali acara, selain menggunakan plugin Migrate untuk memulihkan perilaku lama. Anda bisa menggunakan metode _.data () sebagai jps menyebutkan, tetapi itu adalah metode internal. Jadi lakukan saja hal yang benar dan gunakan plugin Migrasi jika Anda memerlukan fungsi ini.
Dari dokumentasi jQuery pada
.data("events")
sumber
jQuery._data( elem, "events" );
...Untuk memeriksa acara pada suatu elemen:
Sebagai contoh:
atau
Contoh Lengkap:
Cara yang lebih lengkap untuk memeriksa, termasuk pendengar dinamis, diinstal dengan $ (dokumen) .on
Contoh penggunaan:
sumber
getEvents
metode adalah overally besar, tetapi hal tersebut, memberikan duplikat entri dalam IE11 (saya tahu, IE lagi, tapi kebutuhan perusahaan itu ...). EDIT: $ ._ data berisi duplikat peristiwa untuk elemen, meskipun pada FF itu tidak mengandung ... Dunia IE aneh. Tetapi penting untuk berhati-hati terhadap kemungkinan memiliki acara duplikat ini.Saya membuat pemilih jQuery khusus yang memeriksa cache kedua penangan kejadian yang ditugaskan jQuery serta elemen yang menggunakan metode asli untuk menambahkannya:
Contoh:
Ini akan mengembalikan elemen yang memiliki penangan klik terpasang padanya.
sumber
Di browser modern dengan ECMAScript 5.1 /
Array.prototype.map
, Anda juga dapat menggunakandi konsol browser Anda, yang akan mencetak sumber dari penangan, dibatasi koma. Berguna untuk melirik apa yang sedang berjalan pada acara tertentu.
sumber
jQuery._data('ct100_ContentPlaceHolder1_lcsSection','events')["EVENT_NAME"].map(function(elem){return elem.handler;});
UnEught TypeError: Tidak dapat membaca properti 'EVENT_NAME' dari undefined di <anonymous>: 1: 62'ct100_ContentPlaceHolder1_lcsSection'
adalah string, bukan Elemen DOM.Acara dapat diambil menggunakan:
atau jQuery 1.8+:
Catatan: Acara yang dibatasi menggunakan
$('selector').live('event', handler)
dapat diambil menggunakan:sumber
Saya harus mengatakan banyak jawaban yang menarik, tetapi baru-baru ini saya memiliki masalah yang sama dan solusinya sangat sederhana dengan menggunakan cara DOM. Ini berbeda karena Anda tidak mengulangi tetapi mengarahkan langsung pada acara yang Anda butuhkan, tetapi di bawah ini saya akan memberikan jawaban yang lebih umum.
Saya memiliki gambar berturut-turut:
Dan gambar itu memiliki pengendali event klik yang melekat padanya:
Tujuan saya adalah untuk memperluas area yang dapat diklik ke seluruh baris, jadi saya pertama kali mendapatkan semua gambar dan baris relatif:
Sekarang di baris anwer yang sebenarnya saya lakukan sebagai berikut, memberikan jawaban untuk pertanyaan awal:
Jadi saya mengambil event handler langsung dari elemen DOM dan memasukkannya ke event handler klik jQuery. Bekerja seperti pesona.
Sekarang, untuk kasus umum. Di masa pra-jQuery dulu, Anda bisa membuat semua acara terlampir pada objek dengan dua fungsi sederhana namun kuat yang diberikan kepada kita manusia oleh Douglas Crockford :
sumber
Coba plugin jquery debugger jika Anda menggunakan chrome: https://chrome.google.com/webstore/detail/jquery-debugger/dbhhnnnpaeobfddmlalhnehgclcmjimi?hl=id
sumber
Cara lain untuk melakukannya adalah dengan hanya menggunakan jQuery untuk mengambil elemen, kemudian pergi melalui Javascript aktual untuk mendapatkan dan mengatur dan bermain dengan penangan acara. Contohnya:
sumber
Saya menggabungkan beberapa jawaban di atas dan membuat skrip yang terlihat gila namun fungsional ini, yang semoga daftar sebagian besar pendengar acara pada elemen yang diberikan. Jangan ragu untuk mengoptimalkannya di sini.
sumber
jQuery tidak membiarkan Anda hanya mengakses acara untuk elemen tertentu. Anda dapat mengaksesnya menggunakan metode internal tidak berdokumen
Tapi itu masih tidak akan memberi Anda semua acara, tepatnya tidak akan menampilkan acara yang ditugaskan kepada Anda
Peristiwa ini disimpan di dalam dokumen, sehingga Anda dapat mengambilnya dengan menelusuri
tapi itu kerja keras, karena ada acara untuk seluruh halaman web.
Tom G di atas menciptakan fungsi yang memfilter dokumen hanya untuk peristiwa elemen yang diberikan dan menggabungkan output dari kedua metode, tetapi memiliki kesalahan duplikasi peristiwa dalam output (dan efektif pada daftar acara internal jQuery elemen yang mengacaukan aplikasi Anda). Saya memperbaiki kekurangan itu dan Anda dapat menemukan kode di bawah ini. Cukup rekatkan ke konsol dev Anda atau ke kode aplikasi Anda dan jalankan ketika diperlukan untuk mendapatkan daftar yang bagus dari semua acara untuk elemen yang diberikan.
Yang penting diperhatikan, elemen sebenarnya HTMLElement, bukan objek jQuery.
sumber