Saya memiliki objek yang memiliki metode di dalamnya. Metode ini dimasukkan ke dalam objek di dalam fungsi anonim. Ini terlihat seperti ini:
var t = {};
window.document.addEventListener("keydown", function(e) {
t.scroll = function(x, y) {
window.scrollBy(x, y);
};
t.scrollTo = function(x, y) {
window.scrollTo(x, y);
};
});
(ada lebih banyak kode, tapi ini cukup untuk menunjukkan masalahnya)
Sekarang saya ingin menghentikan pendengar acara dalam beberapa kasus. Oleh karena itu saya mencoba melakukan removeEventListener tetapi saya tidak tahu bagaimana melakukan ini. Saya telah membaca di pertanyaan lain bahwa tidak mungkin memanggil removeEventListener pada fungsi anonim, tetapi apakah ini juga yang terjadi dalam situasi ini?
Saya memiliki metode yang dibuat di dalam fungsi anonim dan oleh karena itu saya pikir itu mungkin. Terlihat seperti ini:
t.disable = function() {
window.document.removeEventListener("keydown", this, false);
}
Mengapa saya tidak bisa melakukan ini?
Apakah ada cara lain (baik) untuk melakukan ini?
Info bonus; ini hanya harus bekerja di Safari, maka dukungan IE hilang.
(Elem.setUserData('eventListener', function(e){console.log('Event fired.');}, null);
lalu lakukan Elem.addEventListener ('event', Elem.getUserData ('eventListener'), false); ... dan sama untuk removeEventListener. Semoga Anda bisa melihat ini dengan baik.Jawaban:
Saya percaya itu adalah inti dari fungsi anonim, tidak memiliki nama atau cara untuk merujuknya.
Jika saya jadi Anda, saya hanya akan membuat fungsi bernama, atau memasukkannya ke dalam variabel sehingga Anda memiliki referensi ke sana.
Anda kemudian dapat menghapusnya dengan
sumber
this
kunci bisa membingungkan. Tempat yang baik untuk membacanya adalah quirksmode.org/js/this.htmlthis
mengacu pada elemen yang ditambahkan pendengar, bukan kejadian itu sendiri (yang akan menjadi parametere
). Karena ituthis === e.currentTarget
. baca developer.mozilla.org/en-US/docs/Web/API/EventTarget/…jika Anda berada di dalam fungsi sebenarnya, Anda bisa menggunakan arguments.callee sebagai referensi ke fungsi tersebut. seperti dalam:
EDIT: Ini tidak akan berfungsi jika Anda bekerja dalam mode ketat (
"use strict";
)sumber
button.addEventListener('click', function handler() { this.removeEventListener('click', handler); });
Sebuah versi solusi Otto Nascarella yang bekerja dalam mode ketat adalah:
sumber
Mungkin ada beberapa fungsi anonim, keydown 1
Peringatan: hanya berfungsi di
Chrome Dev Tools
& tidak dapat digunakan dalam kode : tautansumber
getEventListeners
tampaknya menjadi bagian dari Alat Pengembang Chrome, jadi tidak benar-benar dapat digunakan untuk apa pun selain debugging.di peramban modern, Anda dapat melakukan hal berikut ...
https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Parameters
sumber
Pilihan yang tidak begitu anonim
Sejak menerima umpan balik dari Andy ( benar, tetapi seperti banyak contoh lainnya, saya ingin menunjukkan perluasan kontekstual dari gagasan tersebut ), berikut adalah eksposisi yang tidak terlalu rumit :
Hal ini memungkinkan struktur fungsi anonim yang efektif, menghindari penggunaan callee yang praktis tidak digunakan lagi , dan memungkinkan penghapusan dengan mudah.
Kebetulan : Penghapusan elemen skrip segera setelah menyetel pendengar adalah trik lucu untuk menyembunyikan kode yang lebih disukai tidak terlalu jelas bagi mata yang mengintip ( akan merusak kejutan ;-)
Jadi metodenya ( lebih sederhana ) adalah:
sumber
Ini tidak ideal karena menghapus semua, tetapi mungkin berhasil untuk kebutuhan Anda:
Node.cloneNode ()
sumber
JavaScript : metode addEventListener mendaftarkan listener yang ditentukan pada EventTarget (Element | document | Window) tempat pemanggilannya.
EventTarget. addEventListener ( event_type , handler_function, Bubbling | Capturing );
Mouse, uji Contoh acara Keyboard di WebConsole:
Metode removeEventListener menghapus event listener yang sebelumnya terdaftar dengan EventTarget.addEventListener ().
caniuse
sumber
Untuk memberikan pendekatan yang lebih mutakhir untuk ini:
sumber
Saya telah menemukan masalah yang sama dan ini adalah solusi terbaik yang bisa saya dapatkan:
Harap diingat bahwa saya hanya menguji ini untuk
window
elemen dan'mousemove'
acara, jadi mungkin ada beberapa masalah dengan pendekatan ini.sumber
Mungkin bukan solusi terbaik dalam hal apa yang Anda minta. Saya masih belum menentukan metode yang efisien untuk menghapus fungsi anonim yang dideklarasikan sejalan dengan pemanggilan event listener.
Saya pribadi menggunakan variabel untuk menyimpan
<target>
dan mendeklarasikan fungsi di luar pemanggilan event listener misalnya:const target = document.querySelector('<identifier>');
function myFunc(event) {
function code;
}
target.addEventListener('click', myFunc);
Kemudian untuk menghapus pendengar:
target.removeEventListener('click', myFunc);
Bukan rekomendasi teratas yang akan Anda terima tetapi untuk menghapus fungsi anonim, satu-satunya solusi yang menurut saya berguna adalah menghapus lalu mengganti elemen HTML. Saya yakin pasti ada metode JS vanilla yang lebih baik tetapi saya belum melihatnya.
sumber
Saya tahu ini adalah utas yang cukup lama, tetapi saya pikir saya mungkin akan memasukkan dua sen saya untuk mereka yang merasa berguna.
Skrip (maaf tentang nama metode yang tidak kreatif):
Dan Anda bisa menggunakannya seperti ini:
sumber
sumber
addEventListener
.