Apa perbedaan antara ketiga acara ini? Setelah googling saya menemukan bahwa:
- The
onKeyDown
event dipicu ketika pengguna menekan tombol.- The
onKeyUp
event dipicu ketika user melepaskan tombol.- The
onKeyPress
event dipicu ketika pengguna menekan & rilis kunci (onKeyDown
diikuti olehonKeyUp
).
Saya mengerti dua yang pertama, tetapi tidak onKeyPress
sama dengan onKeyUp
? Apakah mungkin untuk melepaskan kunci ( onKeyUp
) tanpa menekannya ( onKeyDown
)?
Ini agak membingungkan, dapatkah seseorang membersihkan ini untuk saya?
javascript
dom
dom-events
instantsetsuna
sumber
sumber
Jawaban:
Periksa di sini untuk tautan yang diarsipkan yang awalnya digunakan dalam jawaban ini.
Dari tautan itu:
sumber
KeyPress
,KeyUp
DanKeyDown
analog dengan masing-masing:Click
,MouseUp,
danMouseDown
.Down
terjadi duluPress
terjadi kedua (ketika teks dimasukkan)Up
terjadi terakhir (ketika input teks selesai).Pengecualiannya adalah webkit , yang memiliki acara ekstra di sana:
Di bawah ini adalah cuplikan yang dapat Anda gunakan untuk melihat sendiri ketika acara dipecat:
sumber
keypress
dankeydown
peristiwa secara harfiah mendapatkan nilai yang sama.timeStamp
, yang akurat untuk interval 5 mikrodetik, tapi itu sebenarnya bukan maksud saya. Maksud saya adalah bahwaclick
acara tidak menyala sampai Anda melepaskan tombol mouse, jadi mengatakan itukeypress
adalah versi keyboardclick
membuatnya sepertikeypress
juga tidak akan menyala sampai Anda melepaskan kunci. Faktanya, bukan itu masalahnya: ia menyala ketika kuncinya ditekan, sepertikeydown
halnya. Jadikeypress
sebenarnya tidak analogclick
sama sekali.keypress
,keyup
, dankeydown
analog denganclick
,mouseup
, danmousedown
. Bagi saya, interpretasi alami dari hal itu adalah bahwakeypress
api pada saat yang sama sepertikeyup
(seperticlick
danmouseup
). Apa yang tidak Anda maksud, jika tidak itu?Sebagian besar jawaban di sini lebih berfokus pada teori daripada hal-hal praktis dan ada beberapa perbedaan besar antara
keyup
dankeypress
karena berkaitan dengan nilai-nilai bidang input, setidaknya di Firefox (diuji di 43).Jika pengguna mengetik
1
ke elemen input kosong:Nilai elemen input akan berupa string kosong (nilai lama) di dalam
keypress
handlerNilai elemen input akan menjadi
1
(nilai baru) di dalamkeyup
handler.Ini sangat penting jika Anda melakukan sesuatu yang bergantung pada mengetahui nilai baru setelah input daripada nilai saat ini seperti validasi inline atau tab otomatis.
Skenario:
12345
ke elemen input.12345
.A
.Ketika
keypress
acara diaktifkan setelah memasukkan suratA
, kotak teks sekarang hanya berisi suratA
.Tapi:
12345
.5
Jadi sepertinya peramban (Firefox 43) menghapus pilihan pengguna, lalu menyalakan
keypress
acara, lalu memperbarui konten bidang, lalu memecatkeyup
.sumber
onkeydown
ditembakkan ketika kunci turun (seperti dalam pintasan; misalnya, dalamCtrl+A
,Ctrl
ditekan 'bawah'.onkeyup
dipecat ketika kunci dilepaskan (termasuk kunci pengubah / dll)onkeypress
dipecat sebagai kombinasi darionkeydown
danonkeyup
, atau tergantung pada pengulangan keyboard (saatonkeyup
tidak diaktifkan). (Perilaku berulang ini adalah sesuatu yang belum saya uji. Jika Anda melakukan tes, tambahkan komentar!)textInput
(hanya webkit) dipecat ketika beberapa teks dimasukkan (misalnya,Shift+A
akan memasukkan huruf besar 'A', tetapiCtrl+A
akan memilih teks dan tidak memasukkan input teks apa pun. Dalam hal ini, semua acara lainnya dipecat)sumber
Pertama, mereka memiliki arti berbeda: mereka menembak:
Kedua, beberapa kunci menembakkan beberapa peristiwa ini dan tidak memecat orang lain . Misalnya,
Juga, Anda harus ingat bahwa
event.keyCode
(danevent.which
) biasanya memiliki nilai yang sama untuk KeyDown dan KeyUp tetapi berbeda untuk KeyPress. Coba taman bermain yang saya buat. Ngomong-ngomong, saya perhatikan cukup aneh: di Chrome, ketika saya menekan ctrl+ adaninput
/textarea
kosong, untuk KeyPress menyala denganevent.keyCode
(danevent.which
) sama dengan1
! (ketika input tidak kosong, itu tidak menyala sama sekali).Akhirnya, ada beberapa pragmatik :
textarea
, baik KeyPress dan KeyDown menyala beberapa kali (Chrome 71), saya akan menggunakan KeyDown jika saya membutuhkan acara yang menyala beberapa kali dan KeyUp untuk pelepasan kunci tunggal.input
s dantextarea
s di browser yang berbeda (kebanyakan karena kehilangan fokus)Saya telah menggunakan ketiganya dalam proyek saya tetapi sayangnya mungkin telah melupakan beberapa pragmatik. (untuk dicatat: ada juga
input
danchange
acara)sumber
Ini artikel oleh Jan Wolter adalah bagian terbaik yang saya telah datang di, Anda dapat menemukan salinan arsip di sini jika link sudah mati.
Ini menjelaskan semua acara kunci browser dengan sangat baik,
sumber
Tampaknya onkeypress dan onkeydown melakukan hal yang sama (isi perbedaan kecil tombol pintas yang telah disebutkan di atas).
Anda dapat mencoba ini:
Dan Anda akan melihat bahwa peristiwa onkeypress dan onkeydown keduanya dipicu saat tombol ditekan dan tidak ketika tombol ditekan.
Perbedaannya adalah bahwa acara tersebut dipicu tidak hanya sekali tetapi berkali-kali (selama Anda menahan tombolnya). Waspadai hal itu dan tangani mereka dengan tepat.
sumber
keypress
lain yang tidak mengetik sesuatu tidak menyebabkan suatu peristiwa, tetapi mereka selalu memicu akeydown
.Acara onkeypress bekerja untuk semua kunci kecuali ALT, CTRL, SHIFT, ESC di semua browser di mana acara onkeydown bekerja untuk semua kunci. Berarti acara onkeydown menangkap semua kunci.
sumber
Hanya ingin berbagi rasa ingin tahu:
saat menggunakan acara onkeydown untuk mengaktifkan metode JS, charcode untuk acara itu TIDAK sama dengan yang Anda dapatkan dengan onkeypress!
Misalnya tombol numpad akan mengembalikan kode yang sama dengan tombol angka di atas tombol huruf saat menggunakan onkeypress, tetapi BUKAN saat menggunakan onkeydown!
Butuh beberapa detik untuk mencari tahu mengapa skrip saya yang memeriksa beberapa kode gagal saat menggunakan onkeydown!
Demo: https://www.w3schools.com/code/tryit.asp?filename=FMMBXKZLP1MK
dan ya. Saya tahu definisi metode berbeda .. tetapi hal yang sangat membingungkan adalah bahwa dalam kedua metode hasil acara diambil menggunakan event.keyCode .. tetapi mereka tidak mengembalikan nilai yang sama .. tidak terlalu implementasi deklaratif.
sumber
0123456789
)Pada dasarnya, peristiwa ini bertindak berbeda pada jenis dan versi peramban yang berbeda, saya membuat tes jsBin kecil dan Anda dapat memeriksa konsol untuk mengetahui bagaimana perilaku peristiwa ini untuk lingkungan yang ditargetkan, harap bantuan ini. http://jsbin.com/zipivadu/10/edit
sumber
Jawaban yang Diperbarui:
KeyDown
Tekan tombol
KeyUp
Ini adalah perilaku di keduanya
addEventListener
danjQuery
.https://jsbin.com/vebaholamu/1/edit?js,console,output <- coba contoh
(jawaban telah diedit dengan respons, tangkapan layar & contoh yang benar)
sumber
Beberapa fakta praktis yang mungkin berguna untuk memutuskan acara mana yang akan ditangani (jalankan skrip di bawah ini dan fokus pada kotak input):
Mendesak:
kunci tidak memasukkan / mengetik (mis. Shift, Ctrl) tidak akan memicu a
keypress
. Tekan Ctrldan lepaskan:kunci dari keyboard yang menerapkan transformasi karakter ke karakter lain dapat menyebabkan Mati dan menduplikasi "kunci" (mis. ~, ´) pada
keydown
. Tekan ´dan lepaskan untuk menampilkan ganda´´
:Selain itu, input yang tidak diketik (mis. Rentang
<input type="range">
) masih akan memicu semua kejadian keyup, keydown dan penekanan tombol sesuai dengan tombol yang ditekan.sumber