DOM — addEventListener, removeEventListener, event ob'ekti
Muammodan boshlaylik
Sahifadagi elementlar foydalanuvchi bilan "muloqot" qilishi kerak. Tugma bosildi — biror narsa bo'lsin. Matn maydoniga yozildi — tekshirilsin. Sichqon element ustiga keldi — ko'rinish o'zgarsin.
Bu "muloqot" mexanizmi — hodisalar (events). Foydalanuvchi nima qilsa, brauzer JavaScript ga xabar beradi. JavaScript xabarni eshitib, tegishli ish bajaradi.
addEventListener — hodisani tinglash
addEventListener — elementga "tinglash qulog'i" qo'yish. Hodisa yuz berganda — berilgan funksiya chaqiriladi.
const tugma = document.querySelector("#yuborish");
tugma.addEventListener("click", function() {
console.log("Tugma bosildi!");
});
Hayotiy o'xshatma
Eshik qo'ng'irog'i. Eshikni o'rnatib, qo'ng'iroq ulab qo'ydingiz. Kimdir qo'ng'iroq bosganida — siz eshikka borasiz. Eshik doimo o'sha yerda, qo'ng'iroq esa hodisa eshitilganda signal beradi.
addEventListener — o'sha qo'ng'iroqni o'rnatish. "Bu element da bu hodisa bo'lsa — shu funksiyani chaqir."
Event ob'ekti — hodisa haqida ma'lumot
Hodisa yuz berganda, brauzer funksiyaga event ob'ekti uzatadi. Bu ob'ektda hodisa haqida barcha ma'lumot bor: qaysi element bosildi, qayerda bosildi, qaysi tugma bosildi va hokazo.
tugma.addEventListener("click", function(event) {
console.log(event.type); // "click" — hodisa turi
console.log(event.target); // bosilgan element
});
Klaviatura hodisalarida
const input = document.querySelector("input");
input.addEventListener("keydown", function(event) {
console.log(event.key); // "Enter", "a", "Backspace" — bosilgan tugma
console.log(event.code); // "KeyA", "Enter" — fizik tugma kodi
console.log(event.ctrlKey); // true/false — Ctrl bosilganmi?
console.log(event.shiftKey); // true/false — Shift bosilganmi?
});
Sichqon hodisalarida
document.addEventListener("mousemove", function(event) {
console.log(event.clientX, event.clientY); // sichqon koordinatasi
});
event.target — hodisa qaysi elementda?
event.target — hodisa haqiqatda yuz bergan element. Bu ayniqsa bir nechta elementni tinglashda muhim.
document.querySelector("ul").addEventListener("click", function(event) {
console.log(event.target); // bosilgan li elementi — ul emas
console.log(event.target.textContent); // o'sha li ning matni
});
event.preventDefault — standart xulqni to'xtatish
Ba'zi elementlarning standart xulqi bor:
<a>bosilsa — boshqa sahifaga o'tadi<form>yuborilsa — sahifa yangilanadi<input type="checkbox">bosilsa — belgilanadi/olib tashlanadi
event.preventDefault() — bu standart xulqni to'xtatadi.
Hayotiy o'xshatma
Lift tugmasi. Tugmani bosganingizda lift o'z-o'zidan ketmoqchi. Lekin siz "to'xta, men boshqa qavatga borishni xohlayman" deb to'xtatdingiz — o'z manzilingizni kiritdingiz. preventDefault — o'sha to'xtatish.
const forma = document.querySelector("form");
forma.addEventListener("submit", function(event) {
event.preventDefault(); // ← sahifa yangilanmaydi
const ism = document.querySelector("#ism").value;
if (!ism) {
alert("Ism kiritilmagan!");
return;
}
serverGaYuborish(ism); // ← o'z logikamiz
});
const havola = document.querySelector("a.modal-ochish");
havola.addEventListener("click", function(event) {
event.preventDefault(); // ← boshqa sahifaga o'tmaslik
modalniOchish();
});
removeEventListener — tinglashni to'xtatish
addEventListener bilan qo'shilgan funksiyani olish ham mumkin.
function bosishHandler() {
console.log("Bosildi");
}
tugma.addEventListener("click", bosishHandler);
// Keyinchalik — tinglashni to'xtatish:
tugma.removeEventListener("click", bosishHandler);
Nima uchun funksiya alohida e'lon qilinadi?
removeEventListener — aynan o'sha funksiyani olishi kerak. Arrow function yoki anonim funksiya har safar yangi ob'ekt — ularni olib bo'lmaydi.
// ❌ — arrow function har safar yangi, olib bo'lmaydi
tugma.addEventListener("click", () => console.log("bosildi"));
tugma.removeEventListener("click", () => console.log("bosildi")); // ishlamaydi!
// ✅ — nomlangan funksiya — bir xil reference
function handler() { console.log("bosildi"); }
tugma.addEventListener("click", handler);
tugma.removeEventListener("click", handler); // ✅ ishlaydi
Qachon kerak?
Bitta marta ishlashi kerak bo'lgan hodisa — birinchi marta ishlangach, tinglash to'xtatiladi:
function birMartalik() {
console.log("Faqat bir marta!");
tugma.removeEventListener("click", birMartalik); // o'zini olib tashladi
}
tugma.addEventListener("click", birMartalik);
Yoki { once: true } opsiyasi bilan — avtomatik:
tugma.addEventListener("click", function() {
console.log("Faqat bir marta!");
}, { once: true }); // ← birinchi marta ishlagach, avtomatik olinadi
Ko'p ishlatiladigan hodisalar
| Hodisa | Qachon |
|---|---|
click |
sichqon tugmasi bosilganda |
dblclick |
ikki marta tez bosilganda |
mouseover |
sichqon element ustiga kelganda |
mouseout |
sichqon element dan ketganda |
keydown |
klaviatura tugmasi bosilganda |
keyup |
klaviatura tugmasi qo'yib yuborilganda |
submit |
forma yuborilganda |
change |
input qiymati o'zgarib, focus yo'qolganda |
input |
input ga har harf kiritilganda |
focus |
element fokusga kirganida |
blur |
element fokusdan chiqqanda |
load |
sahifa yoki rasm to'liq yuklanganda |
DOMContentLoaded |
HTML to'liq o'qilganda (rasmlar kutilmay) |
scroll |
sahifa yoki element scroll qilinganda |
resize |
oyna o'lchami o'zgarganda |
Tez-tez uchraydigan xatolar
Anonim funksiya — removeEventListener ishlamaydi:
// ❌ — olib bo'lmaydi
el.addEventListener("click", function() { console.log("x"); });
el.removeEventListener("click", function() { console.log("x"); }); // yangi ob'ekt!
// ✅
const fn = function() { console.log("x"); };
el.addEventListener("click", fn);
el.removeEventListener("click", fn);
this arrow function da yo'qolishi:
const tugma = document.querySelector("button");
// ❌ — arrow function da this = window (yoki undefined)
tugma.addEventListener("click", () => {
console.log(this); // window, tugma emas
});
// ✅ — oddiy funksiyada this = bosilgan element
tugma.addEventListener("click", function() {
console.log(this); // <button> elementi
this.classList.add("bosildi");
});
DOMContentLoaded ni unutish:
JavaScript <head> da bo'lsa va DOM hali yuklanmagan bo'lsa — querySelector null qaytaradi.
// ❌ — script head da, DOM hali yo'q
const tugma = document.querySelector("#tugma"); // null
// ✅ — DOM tayyor bo'lganda ishlash
document.addEventListener("DOMContentLoaded", function() {
const tugma = document.querySelector("#tugma"); // endi mavjud
tugma.addEventListener("click", fn);
});
Xulosa
addEventListener(hodisa, fn) — hodisani tinglash. Hodisa bo'lganda funksiya chaqiriladi.
Event ob'ekti — hodisa haqida ma'lumot: event.type, event.target, event.key, event.clientX/Y.
event.preventDefault() — standart xulqni to'xtatish: forma yuborishni, havolaga o'tishni.
removeEventListener — tinglashni to'xtatish. Faqat nomlangan funksiya bilan ishlaydi.
Keyingi dars
46-dars: DOM — Event Bubbling, Capturing, Delegation