Brauzerning standart harakatlari
Ko'p hodisalar avtomatik ravishda brauzerning standart harakatiga (default action) olib keladi. Masalan, havolaga bosish yangi manzilga o'tkazadi, forma tugmasi ma'lumotni yuboradi. Ba'zan bu harakatni to'xtatib, o'zimiz JavaScript bilan boshqarmoqchi bo'lamiz.
Standart harakatlar
Brauzerning standart harakatlariga misollar:
- Havolaga (
<a>) bosish โhrefdagi URL manziliga o'tishga olib keladi; - Forma yuborish tugmasini bosish โ serverga so'rov yuborishni boshlaydi;
- Matn ustida sichqonchani bosib sudrash โ matn belgilanadi (selection);
<input>da o'ng tugma bosish โ kontekst menyusini ochadi.
Ba'zan bu harakatlar kerak emas โ biz o'z mantig'imizni ishlatmoqchimiz. Standart harakatni to'xtatish mumkin.
event.preventDefault()
Brauzer harakatini to'xtatishning asosiy usuli โ hodisa obyektidagi event.preventDefault() metodini chaqirish. Masalan, havolani "harakatsiz" qilamiz:
<a href="/" onclick="event.preventDefault()">Bu yerga bosing</a>
Endi havolaga bossak, brauzer / manziliga o'tmaydi โ standart harakat bekor qilinadi. addEventListener orqali ham xuddi shunday:
menuLink.addEventListener('click', function(event) {
event.preventDefault();
// o'rniga o'z mantig'imizni bajaramiz:
showCustomMenu();
});
preventDefault() chaqirilsa, standart harakat butunlay to'xtaydi โ hatto ko'tarilish davomida boshqa ishlovchilar bo'lsa ham.onclick uchun return false
HTML atributi yoki DOM xossasi (on<hodisa>) orqali biriktirilgan ishlovchida standart harakatni to'xtatishning yana bir usuli โ false qaytarish:
<a href="/" onclick="return false">Bu yerga bosing</a>
<!-- yoki funksiyada: -->
<a href="/" onclick="handler()">havola</a>
<script>
function handler() {
alert('...');
return false; // brauzer / ga o'tmaydi
}
</script>
on<hodisa> ishlovchisidan false qaytarilsa, bu event.preventDefault() chaqirilgandek ta'sir qiladi โ standart harakat to'xtaydi.
return false faqat on<hodisa> (atribut yoki DOM xossasi) ishlovchilarida ishlaydi. addEventListener bilan biriktirilgan ishlovchida return falsening hech qanday ta'siri yo'q โ u shunchaki e'tiborsiz qoldiriladi. addEventListenerda doim event.preventDefault() ishlating.on<hodisa> ishlovchisidan qaytarilgan false. Boshqa har qanday qiymat (jumladan true, undefined) hech narsaga ta'sir qilmaydi.event.defaultPrevented
Standart harakat to'xtatilganini tekshirish uchun event.defaultPrevented xossasi bor. Agar preventDefault() chaqirilgan bo'lsa, u true bo'ladi:
elem.oncontextmenu = function(event) {
event.preventDefault();
alert('Elementning o'z menyusi');
};
Bu xossa bir hodisaga bir necha darajada ishlov berilganda foydali. Masalan, ichki element o'z kontekst menyusini ko'rsatib, standart menyuni to'xtatgan bo'lsin. Tashqi element (yoki document) buni bilib, o'z ishini o'tkazib yuborishi mumkin:
document.oncontextmenu = function(event) {
// agar quyi darajadagi ishlovchi allaqachon preventDefault qilgan bo'lsa,
// biz o'z menyumizni ko'rsatmaymiz
if (event.defaultPrevented) return;
event.preventDefault();
alert('Hujjatning umumiy menyusi');
};
event.defaultPrevented ba'zan event.stopPropagation()ga muqobil bo'la oladi. stopPropagation() ko'tarilishni butunlay to'xtatib, boshqa ishlovchilarga "bu yerda hech narsa bo'lmagan" degandek ko'rsatadi va "o'lik zonalar" yaratishi mumkin. defaultPrevented esa hodisani to'xtatmasdan, boshqa ishlovchilarga "standart harakat allaqachon boshqa joyda qayta ishlangan" degan xabarni beradi โ bu ko'pincha xavfsizroq yondashuv.passive ishlovchilar
addEventListenerning passive: true opsiyasi brauzerga ishlovchi preventDefault()ni chaqirmasligini oldindan aytadi.
Nega bu kerak? Mobil qurilmalarda touchmove kabi hodisalar bor (barmoq ekranda harakatlanganda) โ ular sahifani aylantirishga (scroll) olib keladi. Odatda brauzer aylantirishni boshlashdan avval ishlovchi preventDefault() chaqiradimi-yo'qmi, kutishi kerak. Bu kutish sahifa aylanishida sezilarli kechikish (lag) beradi.
elem.addEventListener('touchmove', function(event) {
// aylantirishni to'xtatib bo'lmaydi (preventDefault e'tiborsiz)
}, { passive: true });
passive: true bilan brauzer bilib turadiki, aylantirish to'xtatilmaydi โ shuning uchun u darhol silliq aylantiradi, ishlovchini kutmaydi. Natijada sahifa ravon ishlaydi.
touchstart va touchmove hodisalari uchun passive standart bo'yicha true. Ya'ni bunday ishlovchida preventDefault() chaqirsangiz, u ishlamaydi (ba'zan konsolda ogohlantirish chiqadi). Agar rostdan preventDefault() kerak bo'lsa, aniq { passive: false } bering.Muhim: qaysi hodisalar to'xtatiladi?
Standart harakati bor hodisalarni to'xtatish mumkin, lekin hodisaning o'zi baribir sodir bo'ladi. Masalan, havolaga bosganda click hodisasi ishlaydi, biz faqat navigatsiyani (o'tishni) to'xtatamiz.
preventDefault()ga tayanadi.Xulosa
- Ko'p hodisalarning standart brauzer harakati bor: havola o'tishi, forma yuborilishi va hokazo;
- Standart harakatni to'xtatish uchun
event.preventDefault()chaqiriladi; on<hodisa>ishlovchisidareturn falseham xuddi shunday ishlaydi (lekinaddEventListenerda emas!);event.defaultPreventedโ standart harakat to'xtatilgan-to'xtatilmaganini bildiradi (true/false);passive: trueโ brauzerga ishlovchipreventDefault()chaqirmasligini bildiradi, aylantirish (scroll) ravonligini oshiradi.