Situasinya agak seperti-
var someVar = some_other_function();
someObj.addEventListener("click", function(){
some_function(someVar);
}, false);
Masalahnya adalah bahwa nilai someVar
tidak terlihat di dalam fungsi pendengar addEventListener
, di mana ia mungkin diperlakukan sebagai variabel baru.
javascript
dom
addeventlistener
Abhishek Yadav
sumber
sumber
Jawaban:
Sama sekali tidak ada yang salah dengan kode yang Anda tulis. Keduanya
some_function
dansomeVar
harus dapat diakses, jika tersedia dalam konteks di mana anonimtelah dibuat.
Periksa apakah lansiran memberi Anda nilai yang Anda cari, pastikan lansiran itu dapat diakses dalam lingkup fungsi anonim (kecuali jika Anda memiliki lebih banyak kode yang beroperasi pada
someVar
variabel yang sama di samping panggilan keaddEventListener
)sumber
bound function
menggunakan.bind()
metode ini akan menyelesaikan masalah dengan loop developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Mengapa tidak mendapatkan argumen dari atribut target acara?
Contoh:
JavaScript adalah bahasa berorientasi prototipe, ingat!
sumber
evt.currentTarget.myParam
? Jika ada elemen lain di dalam 'someInput',evt.target
mungkin merujuk ke elemen dalam. ( jsfiddle.net/qp5zguay/1 )this
! Menggunakan metode ini dalam naskah membutuhkan elemen untuk menjadiany
atau membuat sub jenis.addEventListener
untukdocument
,evt.target.myParam
tidak bekerja untuk saya. Saya harus menggunakanevt.currentTarget.myParam
sebagai gantinya.Pertanyaan ini sudah tua tapi saya pikir saya akan menawarkan alternatif menggunakan ESB's .bind () - untuk anak cucu. :)
Perlu diketahui bahwa Anda perlu mengatur fungsi pendengar Anda dengan param pertama sebagai argumen yang Anda lewati untuk mengikat (fungsi Anda yang lain) dan param kedua sekarang adalah acara (bukan yang pertama, seperti seharusnya) .
sumber
Function.prototype.bind()
Anda tidak dapat menghapus pendengar acara , lebih baik menggunakan fungsi kari sebagai gantinya (lihat @ tomcek112 jawaban)some_other_func
adalah variabel, Anda dapat memberikan nilai apa pun yang Anda inginkansome_func
.Anda bisa mengikat semua argumen yang diperlukan dengan 'bind':
Dengan cara ini Anda akan selalu mendapatkan
event
,arg1
dan hal-hal lain diteruskan kemyPrettyHandler
.http://passy.svbtle.com/partial-application-in-javascript-using-bind
sumber
.bind()
tetapi tanpa nol sebagai param pertama. yang tidak berhasil.null
, itu berfungsi dengan baik.bind(event, arg1)
, setidaknya dengan VueJS.Pertanyaan yang cukup lama dan tetapi saya memiliki masalah yang sama hari ini. Solusi terbersih yang saya temukan adalah menggunakan konsep currying.
Kode untuk itu:
Dengan menamai fungsi curried, Anda dapat memanggil Object.removeEventListener untuk membatalkan registrasi eventListener di waktu eksekusi selanjutnya.
sumber
Anda bisa menambah dan menghapus eventlisteners dengan argumen dengan mendeklarasikan fungsi sebagai variabel.
myaudio.addEventListener('ended',funcName=function(){newSrc(myaudio)},false);
newSrc
adalah metode dengan myaudio sebagai parameterfuncName
adalah variabel nama fungsiAnda dapat menghapus pendengar dengan
myaudio.removeEventListener('ended',func,false);
sumber
Anda dapat melewatkan somevar dengan nilai (bukan dengan referensi) melalui fitur javascript yang dikenal sebagai closure :
Atau Anda dapat menulis fungsi wrap umum seperti
wrapEventCallback
:Ini
wrapEventCallback(func,var1,var2)
seperti:sumber
someVar
nilai harus dapat diakses hanya dalamsome_function()
konteks, bukan dari pendengar. Jika Anda ingin memilikinya dalam pendengar, Anda harus melakukan sesuatu seperti:dan gunakan
newVar
saja.Cara lain adalah mengembalikan
someVar
nilai darisome_function()
untuk menggunakannya lebih lanjut di pendengar (sebagai var lokal baru):sumber
Inilah cara lain (Yang ini bekerja di dalam untuk loop):
sumber
Function.prototype.bind () adalah cara untuk mengikat fungsi target ke lingkup tertentu dan secara opsional menentukan
this
objek di dalam fungsi target.Atau untuk menangkap beberapa lingkup leksikal, misalnya dalam satu lingkaran:
Akhirnya, jika
this
parameter tidak diperlukan dalam fungsi target:sumber
Menggunakan
Dan jika Anda ingin memberikan nilai khusus ke fungsi anonim ini, maka cara termudah untuk melakukannya adalah
Bekerja dengan baik di proyek saya. Semoga ini bisa membantu
sumber
for
lingkaran.Ini adalah bagaimana saya melewati acara dengan benar.
sumber
Mengirim argumen ke fungsi callback eventListener membutuhkan pembuatan fungsi yang terisolasi dan meneruskan argumen ke fungsi yang terisolasi itu.
Inilah fungsi pembantu kecil yang bagus yang dapat Anda gunakan. Berdasarkan contoh "halo dunia" di atas.)
Satu hal yang juga dibutuhkan adalah mempertahankan referensi ke fungsi tersebut sehingga kita dapat menghapus pendengar dengan bersih.
sumber
storeFunc
harus menjadi variabel referensi Anda. Letakkan penghapusan pendengar Anda dalam pengaruh yang efektif seperti ini dan Anda baik untuk pergi:useEffect(() => { return () => { window.removeEventListener('scroll', storeFunc, false); } }, [storeFunc])
Salah satu caranya adalah melakukan ini dengan fungsi luar :
Metode membungkus fungsi anonim dalam tanda kurung dan segera memanggilnya disebut IIFE (Ekspresi Fungsi yang Segera Diminta)
Anda dapat memeriksa contoh dengan dua parameter di http://codepen.io/froucher/pen/BoWwgz .
sumber
Jika saya tidak salah menggunakan fungsi panggil
bind
sebenarnya menciptakan fungsi baru yang dikembalikan olehbind
metode. Ini akan menyebabkan masalah Anda nanti atau jika Anda ingin menghapus pendengar acara, karena pada dasarnya seperti fungsi anonim:Jadi ingatlah itu.
Jika Anda menggunakan ES6, Anda bisa melakukan hal yang sama seperti yang disarankan tetapi sedikit lebih bersih:
sumber
alternatif satu baris yang bagus
sumber
Coba juga ini (IE8 + Chrome. Saya tidak tahu untuk FF):
Semoga tidak ada kesalahan ketik :-)
sumber
Saya terjebak dalam hal ini karena saya menggunakannya dalam satu lingkaran untuk menemukan elemen dan menambahkan listner ke dalamnya. Jika Anda menggunakannya dalam satu lingkaran, maka ini akan bekerja dengan sempurna
sumber
Pada 2019, banyak api berubah, jawaban terbaik tidak lagi berfungsi, tanpa memperbaiki bug.
bagikan beberapa kode kerja.
Terinspirasi oleh semua jawaban di atas.
sumber
Ada variabel khusus di dalam semua fungsi: argumen . Anda dapat melewatkan parameter Anda sebagai parameter anonim dan mengaksesnya (berdasarkan pesanan) melalui variabel argumen .
Contoh:
sumber
sumber
Pendekatan berikut bekerja dengan baik untuk saya. Dimodifikasi dari sini .
sumber
Jawaban berikut ini benar tetapi kode di bawah ini tidak berfungsi di IE8 jika Anda mengompres file js menggunakan yuicompressor. (Bahkan, masih sebagian besar orang AS menggunakan IE8)
Jadi, kita dapat memperbaiki masalah di atas sebagai berikut dan berfungsi dengan baik di semua browser
Semoga bermanfaat bagi seseorang yang mengompres file js di lingkungan produksi.
Semoga berhasil!!
sumber
Kode berikut ini berfungsi dengan baik untuk saya (firefox):
Keluaran:
sumber
Anda membutuhkan:
sumber
Mungkin tidak optimal, tetapi cukup sederhana bagi mereka yang tidak paham js. Masukkan fungsi yang memanggil addEventListener ke dalam fungsinya sendiri. Dengan begitu nilai fungsi apa pun yang diteruskan ke dalamnya mempertahankan ruang lingkupnya sendiri dan Anda dapat mengulangi fungsi tersebut sebanyak yang Anda inginkan.
Contoh saya bekerja dengan membaca file karena saya perlu untuk menangkap dan membuat pratinjau gambar dan nama file. Butuh beberapa saat untuk menghindari masalah asinkron ketika menggunakan jenis unggah banyak file. Saya tidak sengaja akan melihat 'nama' yang sama pada semua render meskipun mengunggah file yang berbeda.
Awalnya, semua fungsi readFile () berada dalam fungsi readFiles (). Ini menyebabkan masalah pelingkupan asinkron.
sumber
hanya ingin menambahkan. jika ada yang menambahkan fungsi yang memperbarui kotak centang ke pendengar acara, Anda harus menggunakan
event.target
alih-alihthis
memperbarui kotak centang.sumber
Saya memiliki pendekatan yang sangat sederhana. Ini mungkin bekerja untuk orang lain karena itu membantu saya. Itu adalah ... Ketika Anda memiliki beberapa elemen / variabel yang ditugaskan fungsi yang sama dan Anda ingin memberikan referensi, solusi paling sederhana adalah ...
Itu dia. Ini berhasil untuk saya. Sangat sederhana.
sumber
Alternatif lain, mungkin tidak seanggun penggunaan bind, tetapi valid untuk acara dalam satu lingkaran
Ini telah diuji untuk ekstensi google chrome dan mungkin e.srcElement harus diganti oleh e.source di browser lain
Saya menemukan solusi ini menggunakan komentar yang diposting oleh Imatoria tetapi saya tidak dapat menandainya sebagai berguna karena saya tidak memiliki reputasi yang cukup: D
sumber
Solusi ini mungkin bagus untuk dicari
atau bind bali juga akan baik
sumber