Klaviatura: keydown va keyup
Klaviatura hodisalari foydalanuvchi tugmalarni bosganda kuzatiladi. Zamonaviy qurilmalarda matn kiritishning boshqa usullari ham bor (ovoz orqali kiritish, nusxa-joylashtirish), shuning uchun "matn kiritishini kuzatish" istasangiz, input hodisasi ko'pincha afzalroq. Klaviatura hodisalari esa aynan jismoniy tugmalar bilan ishlash kerak bo'lganda ishlatiladi โ masalan, o'yin boshqaruvi yoki tez tugmalar (hotkey).
keydown va keyup hodisalari
Ikki asosiy hodisa bor:
keydownโ tugma bosilganda (pastga tushganda).keyupโ tugma qo'yib yuborilganda (yuqoriga qaytganda).
document.addEventListener('keydown', function(event) {
console.log('Bosildi. key: ' + event.key + ', code: ' + event.code);
});
document.addEventListener('keyup', function(event) {
console.log('Qo'yib yuborildi');
});
event.key va event.code: asosiy farq
Har bir klaviatura hodisasida ikkita muhim xossa bor: event.key va event.code. Ularning farqini tushunish klaviatura bilan ishlashning asosidir.
event.keyโ bu belgi (character)ning o'zi, ya'ni bosilgan natijada nima chiqishi. U tildan/registrdan/modifikatorlardan qat'i o'zgaradi.event.codeโ bu fizik tugma kodi, ya'ni klaviaturada qaysi jismoniy tugma bosilgani. U qaysi belgi chiqishidan qat'i nazar bir xil bo'lib qoladi.
Masalan, Z tugmasini bosganda:
// z tugmasi (kichik harf): key = 'z', code = 'KeyZ'
// Shift+Z (katta harf): key = 'Z', code = 'KeyZ'
// Boshqa til (masalan, rus tili) yoqilganda:
// key = boshqa harf, code = 'KeyZ'
Ko'rib turganingizdek, event.code aynan qaysi jismoniy tugmaga bog'liq va til/registrdan mustaqil. Shuning uchun "aynan shu tugma" muhim bo'lganda (masalan, o'yinda W A S D harakat tugmalari) event.code ishlatiladi. Aksincha, "foydalanuvchi qaysi harfni yozdi" muhim bo'lganda event.key ishlatiladi.
document.addEventListener('keydown', function(event) {
// O'yinda 'W' tugmasi (klaviatura tilidan qat'i nazar)
if (event.code === 'KeyW') {
// oldinga harakat
}
});
KeyA...KeyZ, raqamlar โ Digit0...Digit9. Diqqat: event.code katta-kichik harfga sezgir. 'keyZ' emas, aynan 'KeyZ'. Bu tez-tez adashtiradigan xato.event.key tavsiflovchi nom qaytaradi: 'Enter', 'Escape', 'Backspace', 'Shift', 'ArrowLeft', 'Tab', 'F1' va h.k. Bu holatda key va code ko'pincha o'xshash bo'ladi (masalan, key='Tab', code='Tab'), lekin har doim emas.Avto-takror (auto-repeat)
Agar tugma uzoq bosib turilsa, avto-takror ishga tushadi: keydown hodisasi qayta-qayta chaqiriladi. Va nihoyat tugma qo'yib yuborilganda bitta keyup keladi.
Shunday holatda event.repeat xossasi true bo'ladi โ bu bizga takroriy hodisalarni birinchi bosishdan ajratish imkonini beradi:
document.addEventListener('keydown', function(event) {
if (event.repeat) {
// Bu avto-takror (tugma bosib turibdi)
return;
}
// Bu birinchi bosish
});
event.repeatni tekshirish kerak bo'ladi.Standart harakatlar
Ko'p klaviatura amallari brauzerning standart harakatiga bog'langan. Masalan:
- Belgi tugmasi bosilsa โ matn maydoniga belgi chiqadi.
Deletebosilsa โ belgi o'chiriladi.PageDownbosilsa โ sahifa pastga skroll qilinadi.Ctrl+Sbosilsa โ brauzer sahifani saqlash oynasini ochadi.
Bu standart harakatlarni event.preventDefault() bilan bekor qilish mumkin. Masalan, matn maydonini faqat raqamlar qabul qiladigan qilib cheklashda:
input.addEventListener('keydown', function(event) {
// Faqat raqamlar va boshqaruv tugmalariga ruxsat
if (!checkPhoneKey(event.key)) {
event.preventDefault();
}
});
preventDefault() bilan to'xtatib bo'lmaydi โ ular operatsion tizim darajasida ishlaydi. Masalan, ko'p brauzerlarda F5 (yangilash), Ctrl+Tab (yorliqlar orasida o'tish) yoki Alt+F4 (oynani yopish) JavaScript'ga bo'ysunmaydi. Bu foydalanuvchi xavfsizligi uchun ataylab shunday qilingan.Qiyosiy amaliy misol: hotkey
Amaliy misol โ Ctrl+B (yoki Mac'da Cmd+B) tez tugmasini ushlash. Modifikatorlar uchun (dars 1'da ko'rganimizdek) mos xossalar bor:
document.addEventListener('keydown', function(event) {
// Windows/Linux'da Ctrl, Mac'da Cmd (metaKey)
if ((event.ctrlKey || event.metaKey) && event.code === 'KeyB') {
event.preventDefault(); // brauzer standartini to'xtatamiz
// o'zimizning amalimiz, masalan matnni qalinlashtirish
}
});
event.code === 'KeyB' ishlatildi (fizik tugma), chunki hotkey odatda klaviatura tilidan mustaqil bo'lishi kerak. Agar event.key === 'b' ishlatsangiz, boshqa til yoqilganda hotkey ishlamay qolishi mumkin.Eskirgan xossalar
Eski kodda quyidagi xossalarni uchratasiz โ ularni ishlatmang:
event.keyCode,event.charCode,event.whichโ hammasi eskirgan (deprecated). Ularning o'rnigaevent.keyvaevent.codeishlating.
Xulosa
keydowntugma bosilganda,keyupqo'yib yuborilganda ishga tushadi.event.keyโ belgining o'zi (til/registrga bog'liq);event.codeโ fizik tugma kodi (mustaqil).- "Aynan shu tugma" kerak bo'lsa
event.code, "qaysi harf" kerak bo'lsaevent.keyishlating. - Tugma bosib turilsa
keydowntakrorlanadi,event.repeatbilan buni aniqlash mumkin. - Standart harakatni
event.preventDefault()bekor qiladi, ammo ba'zi OT-darajasidagi tugmalar bunga bo'ysunmaydi.