// this e works
document.getElementById("p").oncontextmenu = function(e) {
e = e || window.event;
var target = e.target || e.srcElement;
console.log(target);
};
// this e is undefined
function doSomething(e) {
e = e || window.event;
var target = e.target || e.srcElement;
console.log(target);
}
<p id="p" onclick="doSomething(e)">
<a href="#">foo</a>
<span>bar</span>
</p>
Ada beberapa pertanyaan serupa yang telah ditanyakan.
Namun dalam kode saya, saya mencoba mendapatkan elemen anak yang telah diklik, suka a
atauspan
.
Jadi, apa cara yang benar untuk mengirimkan event
sebagai argumen ke pengendali kejadian, atau bagaimana cara memasukkan kejadian ke dalam pengendali tanpa memberikan argumen?
edit
Saya mengetahui addEventListener
dan jQuery
, berikan solusi untuk meneruskan acara ke inline
penangan acara.
javascript
events
inline
argument-passing
pengguna1643156
sumber
sumber
Jawaban:
untuk melewati
event
objek:untuk mendapatkan turunan yang diklik
element
(harus digunakan denganevent
parameter:untuk lulus
element
sendiri (DOMElement):lihat contoh langsung di jsFiddle
sumber
event
objek global . Itu karena konteks di mana handler DOM0 dipanggil memilikievent
objek , meskipun [pada beberapa browser] ini bukan global.)this
mengacu padap
, tapi saya mencoba untuk mendapatkana
atauspan
Karena kejadian sebaris dijalankan sebagai fungsi, Anda cukup menggunakan argumen .
dan
'Peristiwa' yang disebutkan dalam jawaban yang diterima sebenarnya adalah nama argumen yang diteruskan ke fungsi tersebut. Ini tidak ada hubungannya dengan acara global.
sumber
call()
danapply()
akan terbukti penting dalam meniru kemampuan pengikatan data yang tersedia dalam kerangka js arus utama. Satu trik tambahan adalah melakukan sesuatu yang mirip denganObject.assign(this.querySelector('my-btn'), this)
di dalam komponen web dan voila, data binding. Anda dapat mengakses metode apa pun dari kelas komponen web induk dari acara inlineonclick="toggleBtnActive.call(this, true)"
.Anda tidak perlu melewatkan
this
, sudah adaevent
objek yang diteruskan secara otomatis secara default, yang berisi darievent.target
mana objek asalnya. Anda dapat meringankan sintaks Anda:Ini:
Akan bekerja dengan ini:
Anda tidak perlu membuat instance
event
objek, itu sudah ada. Cobalah. Danevent.target
akan berisi seluruh objek yang memanggilnya, yang sebelumnya Anda rujuk sebagai "ini".Sekarang jika Anda secara dinamis memicu doSomething () dari suatu tempat di kode Anda, Anda akan melihat bahwa
event
tidak ditentukan. Ini karena tidak dipicu dari peristiwa mengklik. Jadi jika Anda masih ingin memicu peristiwa secara artifisial, cukup gunakandispatchEvent
:Kemudian
doSomething()
akan melihatevent
danevent.target
seperti biasa!Tidak perlu melewati
this
kemana - mana, dan Anda dapat menjaga agar tanda tangan fungsi Anda bebas dari informasi kabel dan menyederhanakan banyak hal.sumber