Inilah masalah saya: apakah mungkin entah bagaimana untuk memeriksa keberadaan event listener yang dilampirkan secara dinamis? Atau bagaimana cara memeriksa status properti "onclick" (?) Di DOM? Saya telah mencari di internet seperti Stack Overflow untuk mendapatkan solusi, tetapi tidak berhasil. Ini html saya:
<a id="link1" onclick="linkclick(event)"> link 1 </a>
<a id="link2"> link 2 </a> <!-- without inline onclick handler -->
Kemudian di Javascript saya lampirkan event listener yang dibuat secara dinamis ke link ke-2:
document.getElementById('link2').addEventListener('click', linkclick, false);
Kode berjalan dengan baik, tetapi semua upaya saya untuk mendeteksi pendengar yang terlampir gagal:
// test for #link2 - dynamically created eventlistener
alert(elem.onclick); // null
alert(elem.hasAttribute('onclick')); // false
alert(elem.click); // function click(){[native code]} // btw, what's this?
jsFiddle ada di sini . Jika Anda mengklik "Add onclick for 2" dan kemudian "[link 2]", peristiwa akan berjalan dengan baik, tetapi "Test link 2" selalu melaporkan false. Adakah yang bisa membantu?
Jawaban:
Tidak ada cara untuk memeriksa apakah event listener yang dilampirkan secara dinamis ada atau tidak.
Satu-satunya cara untuk melihat apakah pemroses acara dilampirkan adalah dengan melampirkan pemroses acara seperti ini:
Anda kemudian dapat menguji apakah pemroses acara dilampirkan
onclick
dengan kembali!!elem.onclick
(atau yang serupa).sumber
Saya melakukan sesuatu seperti itu:
Membuat atribut khusus untuk elemen saat pemroses dilampirkan, lalu memeriksa apakah ada.
sumber
Apa yang akan saya lakukan adalah membuat Boolean di luar fungsi Anda yang dimulai sebagai FALSE dan disetel ke TRUE ketika Anda melampirkan acara tersebut. Ini akan berfungsi sebagai semacam panji untuk Anda sebelum Anda melampirkan acara lagi. Berikut contoh idenya.
sumber
Kemungkinan duplikat: Periksa apakah elemen memiliki event listener di dalamnya. Tidak ada jQuery Tolong temukan jawaban saya di sana.
Pada dasarnya inilah trik untuk browser Chromium (Chrome):
sumber
tl; dr : Tidak, Anda tidak dapat melakukan ini dengan cara yang didukung secara native.
Satu-satunya cara yang saya tahu untuk mencapai ini adalah dengan membuat objek penyimpanan khusus tempat Anda menyimpan catatan pendengar yang ditambahkan. Sesuatu di sepanjang baris berikut:
Langkah 1: Pertama, Anda akan memerlukan fungsi yang dapat melintasi objek penyimpanan dan mengembalikan rekaman elemen yang diberi elemen (atau false).
Langkah 2: Kemudian, Anda memerlukan fungsi yang dapat menambahkan pendengar acara, tetapi juga memasukkan pendengar ke objek penyimpanan.
Langkah 3: Berkenaan dengan persyaratan sebenarnya dari pertanyaan Anda, Anda memerlukan fungsi berikut untuk memeriksa apakah sebuah elemen telah ditambahkan pendengar acara untuk acara tertentu.
Langkah 4: Terakhir, Anda memerlukan fungsi yang dapat menghapus pendengar dari objek penyimpanan.
Potongan:
Tampilkan cuplikan kode
Meskipun lebih dari 5 tahun telah berlalu sejak OP memposting pertanyaan, saya yakin orang-orang yang tersandung di masa depan akan mendapat manfaat dari jawaban ini, jadi silakan memberikan saran atau perbaikan. 😊
sumber
Anda selalu dapat memeriksa secara manual apakah EventListener Anda ada menggunakan inspektur Chrome misalnya. Di tab Elemen Anda memiliki subtab "Gaya" tradisional dan dekat dengan subtab lain: "Pemroses Acara". Yang akan memberi Anda daftar semua EventListeners dengan elemen tertautnya.
sumber
Tampaknya aneh bahwa metode ini tidak ada. Apakah sudah waktunya untuk menambahkannya akhirnya?
Jika Anda ingin, Anda dapat melakukan sesuatu seperti berikut:
sumber
Berikut skrip yang saya gunakan untuk memeriksa keberadaan event listener yang dilampirkan secara dinamis. Saya menggunakan jQuery untuk melampirkan event handler ke sebuah elemen, kemudian memicu event tersebut (dalam hal ini event 'click'). Dengan cara ini saya bisa mengambil dan menangkap properti acara yang hanya akan ada jika pengendali acara terpasang.
sumber
Tampaknya tidak ada fungsi lintas browser yang mencari acara yang terdaftar di bawah elemen tertentu.
Namun, dimungkinkan untuk melihat fungsi panggilan balik untuk elemen di beberapa browser menggunakan alat pengembangannya. Ini dapat berguna ketika mencoba untuk menentukan bagaimana sebuah halaman web berfungsi atau untuk kode debug.
Firefox
Pertama, lihat elemen di tab Inspector di dalam alat pengembang. Ini bisa dilakukan:
Jika ada event yang didaftarkan ke elemen, Anda akan melihat tombol yang berisi kata Event di samping elemen. Mengkliknya akan memungkinkan Anda untuk melihat event yang telah terdaftar dengan elemen tersebut. Mengklik panah di samping acara memungkinkan Anda untuk melihat fungsi panggilan balik untuk itu.
Chrome
Pertama, lihat elemen di tab Elemen dalam alat pengembang. Ini bisa dilakukan:
Di dekat bagian jendela yang menunjukkan pohon yang berisi elemen halaman web, seharusnya ada bagian lain dengan tab berjudul "Event Listeners". Pilih untuk melihat acara yang telah didaftarkan ke elemen tersebut. Untuk melihat kode acara tertentu, klik link di sebelah kanannya.
Di Chrome, kejadian untuk elemen juga dapat ditemukan menggunakan fungsi getEventListeners . Namun, berdasarkan pengujian saya, fungsi getEventListeners tidak mencantumkan peristiwa ketika beberapa elemen diteruskan ke sana. Jika Anda ingin menemukan semua elemen di halaman yang memiliki listener dan melihat fungsi callback untuk listener tersebut, Anda dapat menggunakan kode berikut di konsol untuk melakukannya:
Harap edit jawaban ini jika Anda mengetahui cara melakukan ini di browser yang diberikan atau di browser lain.
sumber
Saya baru mengetahuinya dengan mencoba melihat apakah acara saya dilampirkan ....
jika kamu melakukan :
itu akan mengembalikan "null"
tetapi jika Anda melakukannya:
maka itu adalah "BENAR"
jadi saya pikir ketika Anda menggunakan "addEventListener" untuk menambahkan event handler, satu-satunya cara untuk mengaksesnya adalah melalui "hasOwnProperty". Saya berharap saya tahu mengapa atau bagaimana tetapi sayangnya, setelah meneliti, saya belum menemukan penjelasan.
sumber
onclick
terpisah dari.addEventListener
- itu mempengaruhi atribut sementara.addEventListener
tidakJika saya mengerti dengan baik, Anda hanya dapat memeriksa apakah pendengar telah diperiksa tetapi tidak pendengar mana yang menjadi penyaji secara khusus.
Jadi beberapa kode ad hoc akan mengisi celah untuk menangani alur pengkodean Anda. Metode praktis akan membuat
state
variabel menggunakan. Misalnya, lampirkan pemeriksa pendengar sebagai berikut:maka jika Anda menyetel pendengar cukup ubah nilainya:
kemudian di dalam callback eventListener Anda, Anda dapat menetapkan fungsionalitas tertentu di dalam dan dengan cara yang sama, mendistribusikan akses ke fungsionalitas bergantung pada beberapa status sebagai variabel misalnya:
sumber
Hapus saja acara tersebut sebelum menambahkannya:
sumber
Saya baru saja menulis skrip yang memungkinkan Anda mencapai ini. Ini memberi Anda dua fungsi global:
hasEvent(Node elm, String event)
dangetEvents(Node elm)
yang dapat Anda manfaatkan. Ketahuilah bahwa ini memodifikasiEventTarget
metode prototipeadd/RemoveEventListener
, dan tidak berfungsi untuk acara yang ditambahkan melalui markup HTML atau sintaks javascriptelm.on_event = ...
Info selengkapnya di GitHub
Demo Langsung
Naskah:
sumber
Anda bisa secara teori piggyback addEventListener dan removeEventListener untuk menambahkan menghapus bendera ke objek 'ini'. Jelek dan saya belum menguji ...
sumber