Foydalanuvchi hodisalari (Events), addEventListener va removeEventListener, Event obyekti va event.target, preventDefault() hamda listenerlarda this va arrow function qoidalari.
Bu bobda foydalanuvchi harakatlariga (bosish, yozish, sichqoncha harakati va h.k.) JavaScript qanday "javob berishini" o'rganamiz.
Event (hodisa) — sahifada yuz beradigan har qanday "voqea": tugma bosilishi, sahifa yuklanishi, klaviaturada tugma bosilishi va h.k.
🔔 Event'larni eshik qo'ng'irog'iga o'xshating: kimdir qo'ng'iroqni bossa (event yuz beradi), siz (JavaScript) buni "eshitib" (listen qilib), tegishli harakatni (function chaqirish) bajarasiz.
addEventListener(eventType, callback) — elementga "tinglovchi" (listener) qo'shadi, ma'lum hodisa yuz berganda berilgan function ishga tushadi.
index.htmlHTML<button id="myButton">Bosing</button>
script.jsJavaScriptlet button = document.getElementById("myButton");button.addEventListener("click", function () {console.log("Tugma bosildi!");});
| Hodisa | Qachon yuz beradi |
|---|---|
click | Element bosilganda |
mouseover | Sichqoncha element ustiga kelganda |
mouseout | Sichqoncha elementdan chiqqanda |
keydown | Klaviatura tugmasi bosilganda |
submit | Forma yuborilganda |
input | Input maydoniga matn kiritilganda |
load | Sahifa to'liq yuklanganda |
Har bir event handler (callback) — avtomatik ravishda event objectni argument sifatida oladi, u hodisa haqida batafsil ma'lumotga ega.
script.jsJavaScriptbutton.addEventListener("click", function (event) {console.log(event.type); // "click"console.log(event.target); // hodisa yuz bergan elementconsole.log(event.clientX); // sichqoncha X koordinatasi});
script.jsJavaScriptlet input = document.getElementById("myInput");input.addEventListener("input", function (event) {console.log("Yozilgan matn: " + event.target.value);});
💡 Key Idea
event.target — hodisa aynan qaysi elementda yuz berganini ko'rsatadi. Bu, ayniqsa, bir nechta o'xshash elementlarga bitta umumiy handler yozilganda juda foydali (Chapter 34'da chuqurroq ko'ramiz).
Ba'zi HTML elementlari o'zining "standart" xatti-harakatiga ega (masalan, forma yuborilganda sahifa qayta yuklanadi, link bosilganda boshqa sahifaga o'tiladi). preventDefault() — bu standart xatti-harakatni to'xtatadi.
index.htmlHTML<form id="myForm"><input type="text" id="username"><button type="submit">Yuborish</button></form>
script.jsJavaScriptlet form = document.getElementById("myForm");form.addEventListener("submit", function (event) {event.preventDefault(); // sahifa qayta yuklanishini to'xtatadilet username = document.getElementById("username").value;console.log("Forma ma'lumoti: " + username);});
preventDefault()siz, forma yuborilganda brauzer avtomatik ravishda sahifani qayta yuklaydi (yoki boshqa sahifaga o'tadi), bu esa JavaScript orqali ma'lumotni qayta ishlash imkoniyatini yo'qqa chiqaradi.
⚠️ Common Mistake
preventDefault()ni unutish — formalar bilan ishlashda eng ko'p uchraydigan xatolardan biri, chunki sahifa "kutilmaganda" qayta yuklanib, JavaScript orqali qilingan barcha ishlar yo'qoladi.
Bu — Chapter 13'da o'rgangan this mavzusining event handler'lardagi qo'llanilishi, va u yerda o'rgangan qoidalar bu yerda ham amal qiladi, lekin bitta muhim nyuans bilan.
script.jsJavaScriptbutton.addEventListener("click", function () {console.log(this); // <button> elementning o'zithis.style.color = "red"; // bosilgan tugmani qizil qiladi});
Explanation
Oddiy (regular) function addEventListenerga berilganda, this — hodisa yuz bergan elementning o'ziga ishora qiladi. Bu — maxsus qoida, addEventListener buni avtomatik ta'minlaydi.
script.jsJavaScriptbutton.addEventListener("click", () => {console.log(this); // ❌ button emas, tashqi scope'ning this'i (Chapter 13, Holat 4)});
Explanation
Chapter 13'da o'rganganimizdek, arrow function o'zining thisiga ega emas — u tashqi scope'dan meros oladi. Shuning uchun event listener ichida arrow function ishlatilsa, this — bosilgan elementga emas, balki arrow function yozilgan joydagi tashqi thisga ishora qiladi.
🔗 Connection
Bu — Chapter 13.2 (Holat 4)da o'rgangan bilimning to'g'ridan-to'g'ri amaliy natijasi: agar sizga this orqali elementga murojaat qilish kerak bo'lsa, oddiy function ishlating; agar sizga tashqi (masalan, class instance) thisni saqlab qolish kerak bo'lsa, arrow function ishlating.
script.jsJavaScriptclass Counter {constructor() {this.count = 0;this.button = document.getElementById("incrementBtn");// Arrow function — class'ning this'ini saqlab qoladithis.button.addEventListener("click", () => {this.count++;console.log(this.count);});}}
Explanation
Bu yerda arrow function ataylab ishlatilgan, chunki bizga this.count — Counter class instance'iga ishora qilishi kerak, tugmaning o'ziga emas. Agar oddiy function ishlatilganda, this.count xato bo'lardi (this — tugmaga ishora qilardi, unda count yo'q).
Qo'shilgan event listener'ni olib tashlash uchun ishlatiladi.
script.jsJavaScriptfunction handleClick() {console.log("Bosildi");}button.addEventListener("click", handleClick);// Keyinroq:button.removeEventListener("click", handleClick);
⚠️ Common Mistake
removeEventListener() — faqat aynan bir xil function havolasi bilan ishlaydi. Anonim function (function(){...} to'g'ridan-to'g'ri addEventListenerga yozilgan) qo'shilgan bo'lsa, uni keyinchalik olib tashlab bo'lmaydi, chunki har safar yangi function "havolasi" yaratiladi.
Task:
<button id="btn"> elementiga click hodisasi uchun listener qo'shing, u bosilganda konsolga "Bosildi!" chiqarsin.
Required Concepts:
addEventListenerbtn.addEventListener("click", () => console.log("Bosildi!"));Task:
<input id="nameInput"> elementiga input hodisasi uchun listener qo'shing, foydalanuvchi yozgan sari, uning yozgan matnini <p id="output"> elementiga chiqarib boring.
Required Concepts:
input eventevent.target.valuetextContentevent.target.valueni output.textContentga tenglashtiring.Task:
Oddiy forma yarating (email input va submit tugmasi bilan). submit hodisasida preventDefault() chaqiring, email formatini tekshiring (includes("@") bilan), agar noto'g'ri bo'lsa xatolik xabarini <p> elementiga chiqaring, to'g'ri bo'lsa "Muvaffaqiyatli yuborildi" deb ko'rsating.
Required Concepts:
submit eventpreventDefaultscript.jsJavaScriptlet btn = document.getElementById("btn");btn.addEventListener("click", function () {console.log(this.tagName);});btn.addEventListener("click", () => {console.log(this);});
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> Birinchi listener: "BUTTON" (agar btn — <button> elementi bo'lsa) Ikkinchi listener: tashqi scope'ning thisi (masalan, brauzerda modul bo'lmasa — window, yoki undefined strict mode'da)Why?
Oddiy function ichida this — elementning o'ziga ishora qiladi (addEventListenerning maxsus xatti-harakati). Arrow function esa o'zining thisiga ega emas, u yozilgan joydagi tashqi thisni meros oladi — bu holatda global scope.
Quyidagi kodda muammo bor:
index.htmlHTML<form id="myForm"><input type="text"><button type="submit">Yuborish</button></form>
script.jsJavaScriptdocument.getElementById("myForm").addEventListener("submit", function () {console.log("Forma yuborildi");// Lekin sahifa har safar qayta yuklanadi va konsol tozalanadi});
Your Task:
Yechim:
</details>script.jsJavaScriptdocument.getElementById("myForm").addEventListener("submit", function (event) {event.preventDefault();console.log("Forma yuborildi");});
addEventListener(type, callback) — hodisaga "tinglovchi" qo'shadi.event.target — hodisa yuz bergan aniq elementni ko'rsatadi.preventDefault() — elementning standart xatti-harakatini to'xtatadi.this — elementga ishora qiladi, arrow function'da esa tashqi scope'dan meros olinadi.preventDefault() — formalar va linklar bilan ishlashda deyarli har doim kerak bo'ladi.this orqali murojaat qilish kerak bo'lsa — oddiy function, tashqi thisni saqlash kerak bo'lsa — arrow function ishlating.removeEventListener() faqat nomlangan (anonim bo'lmagan) function bilan ishlaydi.event.target — bir nechta elementga umumiy handler yozishda muhim rol o'ynaydi (Chapter 34).input hodisasi — real vaqtda foydalanuvchi kiritayotgan ma'lumotni kuzatish uchun ishlatiladi.script.jsJavaScriptelement.addEventListener("click", function (event) {console.log(event.target);event.preventDefault();});element.removeEventListener("click", namedFunction);// this — elementga ishora qiladi (oddiy function)element.addEventListener("click", function () {this.classList.toggle("active");});
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: