UI hodisalari

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).

Bu darsdagi misollar statik โ€” klaviatura hodisalari playground'da ishlamaydi. Ularni haqiqiy sahifada sinang.

keydown va keyup hodisalari

Ikki asosiy hodisa bor:

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.

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
  }
});
Xat/raqam tugmalari uchun kod naqshlari: harflar โ€” KeyA...KeyZ, raqamlar โ€” Digit0...Digit9. Diqqat: event.code katta-kichik harfga sezgir. 'keyZ' emas, aynan 'KeyZ'. Bu tez-tez adashtiradigan xato.
Maxsus tugmalar uchun 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
});
O'yinlarda avto-takror foydali (belgi tinimsiz harakatlanadi). Ammo ba'zi amallarda (masalan, "Enter bosilsa yubor") takrorni e'tiborsiz qoldirish uchun event.repeatni tekshirish kerak bo'ladi.

Standart harakatlar

Ko'p klaviatura amallari brauzerning standart harakatiga bog'langan. Masalan:

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();
  }
});
Ba'zi maxsus tugmalarni 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
  }
});
Bu yerda 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:

Xulosa