Dalam JavaScript, apa cara terbaik untuk menghapus fungsi yang ditambahkan sebagai pendengar acara menggunakan bind ()?
Contoh
(function(){
// constructor
MyClass = function() {
this.myButton = document.getElementById("myButtonID");
this.myButton.addEventListener("click", this.clickListener.bind(this));
};
MyClass.prototype.clickListener = function(event) {
console.log(this); // must be MyClass
};
// public method
MyClass.prototype.disableButton = function() {
this.myButton.removeEventListener("click", ___________);
};
})();
Satu-satunya cara yang bisa saya pikirkan adalah melacak setiap pendengar yang ditambahkan dengan bind.
Contoh di atas dengan metode ini:
(function(){
// constructor
MyClass = function() {
this.myButton = document.getElementById("myButtonID");
this.clickListenerBind = this.clickListener.bind(this);
this.myButton.addEventListener("click", this.clickListenerBind);
};
MyClass.prototype.clickListener = function(event) {
console.log(this); // must be MyClass
};
// public method
MyClass.prototype.disableButton = function() {
this.myButton.removeEventListener("click", this.clickListenerBind);
};
})();
Apakah ada cara yang lebih baik untuk melakukan ini?
javascript
events
listener
bind
takfuruya
sumber
sumber
this.clickListener = this.clickListener.bind(this);
danthis.myButton.addEventListener("click", this.clickListener);
bindAll
fungsi yang menyederhanakan metode pengikatan. Di dalam penginisialisasi objek Anda, Anda hanya_.bindAll(this)
perlu mengatur setiap metode di objek Anda ke versi terikat. Atau, jika Anda hanya ingin mengikat beberapa metode (yang saya akan merekomendasikan, untuk mencegah kebocoran memori disengaja), Anda dapat memberikan mereka sebagai argumen:_.bindAll(this, "foo", "bar") // this.baz won't be bound
.Jawaban:
Meskipun apa yang dikatakan @machineghost benar, bahwa peristiwa ditambahkan dan dihapus dengan cara yang sama, bagian persamaan yang hilang adalah sebagai berikut:
Lihat Apakah bind () mengubah referensi fungsi? | Bagaimana cara mengatur secara permanen?
Jadi, untuk menambah atau menghapusnya, tetapkan referensi ke variabel:
Ini berfungsi seperti yang diharapkan untuk saya.
sumber
.addEventListener(type, listener)
dan.removeEventListener(type, listener)
untuk menambah dan menghapus acara pada suatu elemen. Untuk keduanya, Anda dapat melewatkan referensi fungsi yang dijelaskan dalam solusi sebagailistener
parameter, dengan"click"
sebagai tipe. developer.mozilla.org/en-US/docs/Web/API/EventTarget/…Bagi mereka yang memiliki masalah ini saat mendaftar / menghapus pendengar komponen Bereaksi ke / dari toko Flux, tambahkan baris di bawah ini ke konstruktor komponen Anda:
sumber
this.onChange = this.onChange.bind(this)
sebenarnya ini yang saya cari. Fungsi ini diikatthis
selamanya :)Tidak masalah apakah Anda menggunakan fungsi terikat atau tidak; Anda menghapusnya dengan cara yang sama seperti pengendali acara lainnya. Jika masalah Anda adalah bahwa versi terikat adalah fungsi uniknya sendiri, Anda dapat melacak versi terikat, atau menggunakan
removeEventListener
tanda tangan yang tidak mengambil penangan tertentu (walaupun tentu saja itu akan menghapus penangan acara lainnya dari jenis yang sama ).(Sebagai catatan,
addEventListener
tidak berfungsi di semua browser; Anda benar-benar harus menggunakan perpustakaan seperti jQuery untuk melakukan hook-up acara Anda dengan cara lintas-browser untuk Anda. Juga, jQuery memiliki konsep acara dengan namespace, yang memungkinkan Anda mengikat "click.foo"; ketika Anda ingin menghapus acara, Anda dapat memberi tahu jQuery "hapus semua acara foo" tanpa harus mengetahui penangan spesifik atau menghapus penangan lainnya.)sumber
off
atauunbind
metode. Untuk menghapus semua pendengar pada suatu elemen Anda harus melacak mereka ketika mereka ditambahkan (yang merupakan sesuatu yang dapat dilakukan jQuery atau perpustakaan lain untuk Anda).solusi jQuery:
sumber
Kami memiliki masalah dengan perpustakaan yang tidak dapat kami ubah. Office Fabric UI, yang berarti kami tidak bisa mengubah cara penangan acara ditambahkan. Cara kita dipecahkan itu untuk menimpa
addEventListener
padaEventTarget
prototipe.Ini akan menambahkan fungsi baru pada objek
element.removeAllEventListers("click")
(pos asli: Hapus handler Klik dari hamparan dialog kain )
sumber
Ini solusinya:
sumber
dapat menggunakan tentang ES7:
sumber
Jika Anda ingin menggunakan 'onclick', seperti yang disarankan di atas, Anda dapat mencoba ini:
Saya harap ini membantu.
sumber
Sudah beberapa saat tetapi MDN memiliki penjelasan super tentang ini. Itu membantu saya lebih daripada hal-hal di sini.
MDN :: EventTarget.addEventListener - Nilai "ini" dalam handler
Ini memberikan alternatif yang bagus untuk fungsi handleEvent.
Ini adalah contoh dengan dan tanpa ikatan:
Masalah dalam contoh di atas adalah bahwa Anda tidak dapat menghapus pendengar dengan bind. Solusi lain adalah menggunakan fungsi khusus yang disebut handleEvent untuk menangkap setiap peristiwa:
sumber