Element foydalanuvchi unga bosganda yoki klaviaturada Tab tugmasidan foydalanganda fokusni oladi. Shuningdek, sahifa yuklanganda sukut bo’yicha elementga fokus qo’yadigan autofocus HTML atributi va fokusni olishning boshqa usullari ham mavjud.
Elementga fokus qilish odatda “bu yerda ma’lumot qabul qilishga tayyorlaning” degan ma’noni anglatadi, shuning uchun kerakli funksionallikni ishga tushirish uchun kodni ishlatish momenti shu paytdir.
Fokusni yo’qotish (“blur”) momenti yanada muhim bo’lishi mumkin. Bu foydalanuvchi boshqa joyga bosganda yoki keyingi forma maydoniga o’tish uchun Tab tugmasini bosganda yoki boshqa usullar ham mavjud.
Fokusni yo’qotish odatda “ma’lumot kiritilgan” degan ma’noni anglatadi, shuning uchun uni tekshirish yoki hatto serverga saqlash uchun kodni ishga tushirishimiz mumkin.
Fokus hodisalari bilan ishlashda muhim xususiyatlar mavjud. Ularni keyinroq eng yaxshi tarzda ko’rib chiqamiz.
Hodisalar focus/blur
focus hodisasi fokus qilishda chaqiriladi, blur esa element fokusni yo’qotganda.
Ularni input maydonini tekshirish uchun ishlatamiz.
Quyidagi misolda:
blurishlov beruvchi maydon email kiritilganligini tekshiradi va agar yo’q bo’lsa – xatoni ko’rsatadi.focusishlov beruvchi xato xabarini yashiradi (blurda u yana tekshiriladi):
<style>
.invalid { border-color: red; }
#error { color: red }
</style>
Emailingizni kiriting: <input type="email" id="input">
<div id="error"></div>
<script>
input.onblur = function() {
if (!input.value.includes('@')) { // email emas
input.classList.add('invalid');
error.innerHTML = 'Iltimos, to\'g\'ri email kiriting.'
}
};
input.onfocus = function() {
if (this.classList.contains('invalid')) {
// "xato" ko'rsatkichini olib tashlang, chunki foydalanuvchi biror narsani qayta kiritmoqchi
this.classList.remove('invalid');
error.innerHTML = "";
}
};
</script>
Zamonaviy HTML bizga input atributlari yordamida ko’plab tekshiruvlarni amalga oshirish imkonini beradi: required, pattern va boshqalar. Va ba’zan ular aynan bizga kerak bo’lgan narsa. Ko’proq moslashuvchanlikni xohlasak JavaScript dan foydalanish mumkin. Shuningdek, agar qiymat to’g’ri bo’lsa, o’zgartirilgan qiymatni serverga avtomatik yuborishimiz mumkin.
Metodlar focus/blur
elem.focus() va elem.blur() metodlari elementda fokusni o’rnatadi/o’chiradi.
Masalan, agar qiymat noto’g’ri bo’lsa, tashrif buyuruvchining inputni tark etishiga imkon bermaymiz:
<style>
.error {
background: red;
}
</style>
Emailingizni kiriting: <input type="email" id="input">
<input type="text" style="width:220px" placeholder="emailni noto'g'ri qiling va bu yerga fokus qilishga harakat qiling">
<script>
input.onblur = function() {
if (!this.value.includes('@')) { // email emas
// xatoni ko'rsatish
this.classList.add("error");
// ...va fokusni qaytarish
input.focus();
} else {
this.classList.remove("error");
}
};
</script>
Bu Firefox bundan mustasno (xato) barcha brauzerlarda ishlaydi.
Agar biz inputga biror narsa kiritsak va keyin Tab dan foydalanishga harakat qilsak yoki <input> dan uzoqlashsak, onblur fokusni qaytaradi.
Diqqat qiling, onblur da event.preventDefault() ni chaqirish orqali “fokusni yo’qotishning oldini ololmaymiz”, chunki onblur element fokusni yo’qotgandan keyin ishlaydi.
Fokus yo’qolishi ko’p sabablarga ko’ra sodir bo’lishi mumkin.
Ulardan biri tashrif buyuruvchi boshqa joyga bosganda. Lekin JavaScript ning o’zi ham bunga sabab bo’lishi mumkin, masalan:
alertfokusni o’ziga o’tkazadi, shuning uchun u elementda fokus yo’qolishiga sabab bo’ladi (blurhodisasi), vaalertyopilganda, fokus qaytib keladi (focushodisasi).- Agar element DOM dan olib tashlansa, u ham fokus yo’qolishiga sabab bo’ladi. Agar u keyinroq qayta qo’shilsa, fokus qaytmaydi.
Bu xususiyatlar ba’zan focus/blur ishlov beruvchilarining noto’g’ri ishlashiga sabab bo’ladi – kerak bo’lmaganda ishga tushirish.
Eng yaxshi maslahat bu hodisalardan foydalanganda ehtiyot bo’lishdir. Agar biz foydalanuvchi tomonidan boshlangan fokus yo’qolishini kuzatmoqchi bo’lsak, o’zimiz bunga sabab bo’lishdan qochinishimiz kerak.
Har qanday elementga fokus qilishga ruxsat berish: tabindex
Sukut bo’yicha, ko’plab elementlar fokusni qo’llab-quvvatlamaydi.
Ro’yxat brauzerlar o’rtasida biroz farq qiladi, lekin bir narsa doim to’g’ri: tashrif buyuruvchi bilan o’zaro ta’sir qilishi mumkin bo’lgan elementlar uchun focus/blur qo’llab-quvvatlash kafolatlanadi: <button>, <input>, <select>, <a> va boshqalar.
Boshqa tomondan, biror narsani formatlash uchun mavjud bo’lgan elementlar, masalan <div>, <span>, <table> – sukut bo’yicha fokus qilib bo’lmaydi. elem.focus() metodi ularda ishlamaydi va focus/blur hodisalar hech qachon ishga tushmaydi.
Buni tabindex HTML-atributi yordamida o’zgartirish mumkin.
Agar tabindex ga ega bo’lsa, har qanday element fokus qilinadigan bo’ladi. Atributning qiymati ular orasida almashinish uchun Tab (yoki shunga o’xshash narsa) ishlatilganda elementning tartib raqamidir.
Ya’ni: agar bizda ikkita element bo’lsa, birinchisida tabindex="1", ikkinchisida tabindex="2" bo’lsa, birinchi elementda turganida Tab ni bosish – fokusni ikkinchisiga o’tkazadi.
Almashinish tartibi: 1 va undan yuqori tabindex ga ega elementlar birinchi bo’ladi (tabindex tartibida), keyin tabindex siz elementlar (masalan, oddiy <input>).
Mos keladigan tabindex siz elementlar hujjat manba tartibida almashtiriladi (standart tartib).
Ikkita maxsus qiymat mavjud:
-
tabindex="0"elementnitabindexsizlar orasiga qo’yadi. Ya’ni, biz elementlarni almashtirgsak,tabindex=0ga ega elementlartabindex ≥ 1ga ega elementlardan keyin keladi.Odatda element fokus qilinadigan qilish uchun ishlatiladi, lekin standart almashinish tartibini saqlaydi. Elementni
<input>bilan teng darajada formaning bir qismiga aylantirish uchun. -
tabindex="-1"elementga faqat dasturiy fokus qilish imkonini beradi. Tab tugmasi bunday elementlarni e’tiborsiz qoldiradi, lekinelem.focus()metodi ishlaydi.
Masalan, mana ro’yxat. Birinchi elementga bosing va Tab ni bosing:
Birinchi elementga bosing va Tab ni bosing. Tartibni kuzating. Diqqat qiling, keyingi ko'plab Tab lar fokusni misoldagi iframe dan chiqarishi mumkin.
<ul>
<li tabindex="1">Bir</li>
<li tabindex="0">Nol</li>
<li tabindex="2">Ikki</li>
<li tabindex="-1">Minus bir</li>
</ul>
<style>
li { cursor: pointer; }
:focus { outline: 1px dashed green; }
</style>
Tartib bunday: 1 - 2 - 0. Odatda, <li> fokusni qo’llab-quvvatlamaydi, lekin tabindex uni to’liq yoqadi, hodisalar va :focus bilan styling bilan birga.
elem.tabIndex xossasi ham ishlaydiJavaScript dan elem.tabIndex xossasidan foydalanib tabindex qo’shishimiz mumkin. Bu bir xil ta’sirga ega.
Delegatsiya: focusin/focusout
focus va blur hodisalar bubble qilmaydi.
Masalan, uni ajratib ko’rsatish uchun <form> ga onfocus qo’ya olmaymiz:
<!-- formaga fokus qilishda -- sinf qo'shing -->
<form onfocus="this.className='focused'">
<input type="text" name="name" value="Ism">
<input type="text" name="surname" value="Familiya">
</form>
<style> .focused { outline: 1px solid red; } </style>
Yuqoridagi misol ishlamaydi, chunki foydalanuvchi <input> ga fokus qilganda, focus hodisasi faqat o’sha inputda ishga tushadi. U yuqoriga bubble qilmaydi. Shuning uchun form.onfocus hech qachon ishga tushmaydi.
Ikkita yechim mavjud.
Birinchidan, qiziq tarixiy xususiyat bor: focus/blur yuqoriga bubble qilmaydi, lekin capturing fazasida pastga tarqaladi.
Bu ishlaydi:
<form id="form">
<input type="text" name="name" value="Ism">
<input type="text" name="surname" value="Familiya">
</form>
<style> .focused { outline: 1px solid red; } </style>
<script>
// ishlov beruvchini capturing fazasiga qo'ying (oxirgi argument true)
form.addEventListener("focus", () => form.classList.add('focused'), true);
form.addEventListener("blur", () => form.classList.remove('focused'), true);
</script>
Ikkinchidan, focusin va focusout hodisalar mavjud – focus/blur bilan aynan bir xil, lekin ular bubble qiladilar.
Diqqat qiling, ular on<event> emas, elem.addEventListener yordamida tayinlanishi kerak.
Demak, mana yana bir ishlaydigan variant:
<form id="form">
<input type="text" name="name" value="Ism">
<input type="text" name="surname" value="Familiya">
</form>
<style> .focused { outline: 1px solid red; } </style>
<script>
form.addEventListener("focusin", () => form.classList.add('focused'));
form.addEventListener("focusout", () => form.classList.remove('focused'));
</script>
Xulosa
focus va blur hodisalar elementda fokus qilish/fokusni yo’qotishda ishga tushadi.
Ularning xususiyatlari:
- Ular bubble qilmaydi. O’rniga capturing holatini yoki
focusin/focusoutdan foydalanish mumkin. - Ko’pgina elementlar sukut bo’yicha fokusni qo’llab-quvvatlamaydi. Har qanday narsani fokus qilinadigan qilish uchun
tabindexdan foydalaning.
Joriy fokus qilingan element document.activeElement sifatida mavjud.
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepen…)