UI hodisalari

Sichqoncha hodisalari

Sichqoncha hodisalari nafaqat haqiqiy sichqoncha (mouse) uchun, balki sensorli ekranlar va planshetlar uchun ham ishlaydi โ€” u yerda ular moslashtirilgan tarzda emulyatsiya qilinadi. Ushbu darsda sichqonchaning asosiy hodisalarini, ular qaysi tartibda yuzaga kelishini va har birida qanday ma'lumot borligini chuqur o'rganamiz.

Diqqat: bu bo'limdagi UI/DOM hodisalari kurs sahifasidagi interaktiv maydonchada (playground) ishlamaydi. Sabab: bu yerda haqiqiy DOM va brauzer oynasi yo'q. Shuning uchun quyidagi barcha misollar statik โ€” ularni o'zingizning HTML faylingizda sinab ko'rishingiz kerak.

Sichqonchaning asosiy hodisalari

Sichqoncha bilan bog'liq eng ko'p ishlatiladigan hodisalarni ikki guruhga bo'lish mumkin.

Oddiy hodisalar

Bu hodisalar orasida ikkitasi โ€” click va dblclick โ€” murakkab (composite) hodisalar, ya'ni ular boshqa oddiy hodisalar ketma-ketligidan tashkil topadi.

Hodisalar tartibi

Bir amal bir nechta hodisani yuzaga keltirishi mumkin. Masalan, chap tugmani bosish avval mousedownni (tugma pastga tushganda), so'ng mouseup va clickni (tugma yuqoriga qaytganda) chaqiradi.

Bitta amaldan bir nechta hodisa kelib chiqsa, ularning tartibi qat'iy belgilangan. Ya'ni ishlov beruvchilar (handler) quyidagi tartibda chaqiriladi: mousedown โ†’ mouseup โ†’ click.

Har bir hodisa alohida ishlov beruvchida qayta ishlanadi, lekin ularning ketma-ketligi barqaror. Shu sabab, agar tugmani bosish jarayonini kuzatmoqchi bo'lsangiz, mousedown va mouseupni ishlating; "bosildi" degan yakuniy amal uchun esa clickni afzal ko'ring.

Qaysi tugma bosildi: button

Sichqoncha bilan bog'liq hodisalarda qaysi tugma bosilganini bilish uchun event.button xossasi ishlatiladi. Odatda bu bizga click va contextmenu uchun kerak bo'lmaydi โ€” chunki chap tugma clickni, o'ng tugma esa contextmenuni chaqiradi. Lekin mousedown va mouseup ishlov beruvchilarida bu zarur bo'lishi mumkin.

event.button ning mumkin bo'lgan qiymatlari:

Aksariyat sichqonchalarda faqat chap, o'ng va o'rta tugmalar mavjud, shuning uchun amalda 0, 1 va 2 qiymatlari eng ko'p ishlatiladi.

elem.onmousedown = function(event) {
  if (event.button === 0) {
    alert('Chap tugma bosildi');
  }
  if (event.button === 2) {
    alert('O'ng tugma bosildi');
  }
};
Eski qo'llanmalarda event.which xossasini uchratishingiz mumkin: 1 โ€” chap, 2 โ€” o'rta, 3 โ€” o'ng. event.which eskirgan (deprecated) hisoblanadi va endi ishlatilmasligi kerak. Uning o'rniga event.buttondan foydalaning.

buttons xossasi

Bundan tashqari event.buttons xossasi ham bor โ€” u ayni damda bosib turilgan barcha tugmalarni bit-maska (bitmask) sifatida saqlaydi. Chap tugma uchun 1, o'ng uchun 2, o'rta uchun 4. Bir vaqtning o'zida bir nechta tugma bosilsa, ularning yig'indisi qaytadi. Bu kamdan-kam ishlatiladi.

Koordinatalar: clientX/Y, pageX/Y

Barcha sichqoncha hodisalari ikki xil koordinata to'plamini beradi:

Masalan, agar oyna 500x500 o'lchamda bo'lib, kursor chap yuqori burchakda tursa, clientX va clientY ikkalasi ham 0 bo'ladi. Agar kursor markazda bo'lsa, ular 250 ni ko'rsatadi โ€” sahifa qancha skroll qilingan bo'lishidan qat'i nazar.

elem.onmousemove = function(event) {
  console.log('Oynaga nisbatan: ' + event.clientX + ', ' + event.clientY);
  console.log('Hujjatga nisbatan: ' + event.pageX + ', ' + event.pageY);
};
Odatda "suzib yuruvchi" (fixed) elementni kursor yoniga qo'ymoqchi bo'lsangiz โ€” masalan, maslahat oynasini (tooltip) โ€” clientX/Y va position: fixed ishlating. Agar element sahifa bilan birga skroll qilinishi kerak bo'lsa โ€” pageX/Y va position: absolute.

Matn belgilanishini oldini olish

Sichqonchani ikki marta bosish ko'pincha matnni belgilaydi, bu esa interfeysga xalaqit berishi mumkin. Masalan, tugmada dblclick bo'lsa, tugma matni belgilanib qolishi mumkin. Buni oldini olish uchun brauzerning standart harakatini bekor qilamiz.

Muammo shundaki, matn belgilanishi mousedown paytida boshlanadi. Shuning uchun standart harakatni aynan mousedownda bekor qilish kerak:

<b ondblclick="alert('dblclick')" onmousedown="return false">
  Meni ikki marta bosing
</b>

Endi qalin (bold) matn ikki marta bosilganda belgilanmaydi, o'ng tugmani bosish esa CSS orqali ham nazorat qilinishi mumkin (user-select: none). Lekin ba'zan foydalanuvchi baribir matnni nusxalab olishi kerak bo'ladi, shuning uchun bu texnikadan ehtiyotkorlik bilan foydalaning.

Standart harakatni bekor qilish (return false yoki event.preventDefault()) foydalanuvchi tajribasiga ta'sir qilishi mumkin. Faqat haqiqatan zarur bo'lganda ishlating.

Modifikator tugmalar: shift, alt, ctrl, meta

Barcha sichqoncha hodisalari qaysi "modifikator" (o'zgartiruvchi) tugmalari ushlab turilganini aks ettiruvchi mantiqiy (boolean) xossalarni o'z ichiga oladi:

Masalan, quyidagi tugma faqat Alt+Shift+bosish bilan ishlaydi:

button.onclick = function(event) {
  if (event.altKey && event.shiftKey) {
    alert('Yashasin, Alt+Shift+Bosish!');
  }
};
Mac'da odatda Cmd tugmasi Windows'dagi Ctrl o'rnida ishlatiladi. Windows va Linux foydalanuvchilari Ctrl bosgan joyda, Mac foydalanuvchisi Cmd bosishi tabiiy. Shuning uchun barcha platformalarda qulay bo'lishi uchun ko'pincha ctrlKey || metaKey shartini yozadilar:
if (event.ctrlKey || event.metaKey) {
  // Windows/Linux'da Ctrl, Mac'da Cmd
}
Modifikator tugmalarga tayanadigan qulayliklar (shortcut) uchun har doim muqobil yo'l ham qoldiring. Ba'zi foydalanuvchilar sensorli qurilmadan foydalanadi yoki jismoniy imkoniyatlari cheklangan bo'lishi mumkin โ€” ular modifikator+bosishni bajara olmasligi ehtimol.

Xulosa

Sichqoncha hodisalari quyidagi xossalarga ega:

Bir amaldan bir nechta hodisa kelib chiqsa, ular qat'iy tartibda yuzaga keladi: mousedown โ†’ mouseup โ†’ click. Matn belgilanishini oldini olish uchun mousedownda standart harakatni bekor qiling.