DOM — getElementById, querySelector, querySelectorAll
Muammodan boshlaylik
Siz tugma yozdingiz. Foydalanuvchi bosganida rang o'zgarishi kerak. JavaScript da buni qilish uchun avval o'sha tugmani topish kerak — keyin o'zgartirish.
Lekin HTML da o'nlab, yuzlab elementlar bo'lishi mumkin. Qaysi biri kerakligini JavaScript qanday biladi? Qanday aytamiz: "mana o'sha tugma, boshqalari emas"?
Buning uchun DOM ni qidirish metodlari kerak.
DOM nima? Qisqacha eslatma
Brauzer HTML ni o'qigach, uni daraxt ko'rinishida xotirada saqlaydi. Bu daraxt — DOM (Document Object Model). Har bir HTML teg — daraxtdagi bir tugun.
JavaScript bu daraxtga document ob'ekti orqali kiradi. Elementlarni topish, o'zgartirish, qo'shish, o'chirish — hammasi document orqali.
getElementById — ID bo'yicha topish
Har bir HTML elementga id atributi berilishi mumkin. ID — sahifada yagona bo'lishi kerak. Ikki element bir xil id ga ega bo'lsa — bu xato.
<button id="yuborish-tugma">Yuborish</button>
const tugma = document.getElementById("yuborish-tugma");
Hayotiy o'xshatma
Pasport raqami. Har bir fuqaroning o'ziga xos raqami bor — ikki kishi bir xil raqamga ega bo'lmaydi. "12345678 raqamli fuqaroni toping" — yagona natija. getElementById — xuddi shunday. id sahifada yagona, shuning uchun natija ham yagona.
Element topilmasa — null qaytaradi. Shuning uchun topilganini tekshirish kerak:
const tugma = document.getElementById("yuborish-tugma");
if (!tugma) {
console.warn("Tugma topilmadi");
return;
}
tugma.style.color = "red";
querySelector — CSS selector bo'yicha topish
querySelector — CSS da yozganday selektor berish, birinchi mos elementni olish.
Hayotiy o'xshatma
Kutubxona katalogi. "Biologiya bo'limidagi birinchi kitobni bering" — katalogga selektor berasiz, birinchi natija keladi. querySelector — o'sha katalog. CSS selektor tizimini bilsangiz — querySelector da ham ishlata olasiz.
<ul class="menu">
<li class="faol">Bosh sahifa</li>
<li>Haqida</li>
<li>Bog'lanish</li>
</ul>
// CSS da qanday yozilsa — querySelector da ham shunday
const faolPunkt = document.querySelector(".menu .faol");
const birinchi = document.querySelector("ul li");
const havolalar = document.querySelector("a[href]");
querySelector — birinchi mos elementni qaytaradi. Topilmasa — null.
querySelector vs getElementById
getElementById faqat id bo'yicha qidiradi. querySelector esa istalgan CSS selektor: sinf, teg, atribut, ichma-ich kombinatsiya.
// Bu ikkisi bir xil natija beradi:
document.getElementById("bosh-menu");
document.querySelector("#bosh-menu");
// Lekin querySelector ko'proq narsa qila oladi:
document.querySelector(".menu > li:first-child");
document.querySelector("input[type='email']");
document.querySelector("article p.kirish");
Qoida: faqat id kerak bo'lsa — getElementById tezroq va aniqroq. Murakkab selektor kerak bo'lsa — querySelector.
querySelectorAll — hammasini topish
querySelector birinchisini topadi. querySelectorAll — selectorga mos barcha elementlarni topadi.
<ul>
<li class="mahsulot">Noutbuk</li>
<li class="mahsulot">Telefon</li>
<li class="mahsulot">Quloqlik</li>
</ul>
const mahsulotlar = document.querySelectorAll(".mahsulot");
console.log(mahsulotlar.length); // 3
querySelectorAll — NodeList qaytaradi, Array emas
Bu muhim farq. querySelectorAll — Array emas, NodeList qaytaradi. Ko'rinishi o'xshash, lekin Array metodlari — map, filter, reduce — NodeList da ishlamaydi.
const elementlar = document.querySelectorAll(".mahsulot");
elementlar.forEach(el => console.log(el.textContent)); // ✅ forEach ishlaydi
elementlar.map(el => el.textContent); // ❌ map ishlamaydi — NodeList da yo'q
Array metodlari kerak bo'lsa — NodeList ni Array ga o'girish kerak:
const elementlar = document.querySelectorAll(".mahsulot");
// Array ga o'girish
const massiv = Array.from(elementlar);
// yoki
const massiv = [...elementlar];
massiv.map(el => el.textContent); // ✅ endi map ishlaydi
Nima uchun NodeList, Array emas?
NodeList — "tirik" yoki "muzlatilgan" bo'lishi mumkin. querySelectorAll — muzlatilgan NodeList qaytaradi: sahifada yangi element qo'shilsa, NodeList o'zgarmaydi. Bu ko'p hollarda xavfsizroq. Array — oddiy JavaScript massivi, DOM bilan aloqasi yo'q.
Qidiruv doirasini toraytirish
document — butun sahifani qidiradi. Lekin ma'lum bir element ichidan ham qidirish mumkin:
const forma = document.querySelector(".login-forma");
// Faqat forma ichidagi inputlarni topish
const inputlar = forma.querySelectorAll("input");
// Faqat forma ichidagi birinchi tugmani topish
const tugma = forma.querySelector("button");
Nima uchun doirani toraytirish kerak?
Sahifada bir xil sinfli elementlar turli joylarda bo'lishi mumkin. document.querySelector(".tugma") — sahifadagi istalgan .tugma ni topadi. forma.querySelector(".tugma") — faqat forma ichidagisini topadi. Aniqlik va xatosizlik uchun.
Tez-tez uchraydigan xatolar
Topilmagan elementga murojaat:
querySelector va getElementById topilmasa null qaytaradi. Null ga xususiyat murojaat qilsangiz — xato.
const tugma = document.querySelector("#yoq-element");
tugma.addEventListener("click", fn); // ❌ TypeError: Cannot read properties of null
// ✅ — avval tekshirish
if (tugma) {
tugma.addEventListener("click", fn);
}
NodeList da Array metodlarini ishlatish:
const elementlar = document.querySelectorAll("li");
// ❌ — NodeList da map yo'q
const matnlar = elementlar.map(el => el.textContent);
// ✅
const matnlar = [...elementlar].map(el => el.textContent);
ID ni # bilan getElementById ga berish:
// ❌ — getElementById faqat ID nomini oladi, # emas
document.getElementById("#mening-id"); // null qaytaradi
// ✅
document.getElementById("mening-id");
// querySelector da esa # kerak:
document.querySelector("#mening-id"); // ✅
Xulosa
getElementById("id") — ID bo'yicha bitta element. Eng tez. Topilmasa — null.
querySelector("selektor") — CSS selektor bo'yicha birinchi element. Har qanday selektor. Topilmasa — null.
querySelectorAll("selektor") — CSS selektor bo'yicha barcha elementlar. NodeList qaytaradi. Array metodlari kerak bo'lsa — [...elementlar] bilan Array ga o'girish.
Doirani toraytirish — document o'rniga ma'lum element ichidan qidirish. Aniqlik va xatosizlik uchun.
Keyingi dars
44-dars: DOM — createElement, appendChild, innerHTML, textContent