DOM daraxti tushunchasi, elementlarni tanlash metodlari, NodeList vs HTMLCollection vs Array farqi, textContent vs innerHTML xavfsizligi hamda Document va Window obyektlari.
PART 5 (DOM & Browser) boshlanadi. Bu qismda JavaScript'ni veb-sahifalar bilan bog'laydigan asosiy vosita — DOMni o'rganamiz.
DOM (Document Object Model) — brauzer HTML sahifani JavaScript tushunadigan object'lar daraxti shaklida taqdim etadigan tizim.
HTML — statik matn fayli, u o'zi hech narsani o'zgartira olmaydi. DOM orqali JavaScript HTML elementlarini "ko'radi", o'zgartiradi, qo'shadi yoki o'chiradi — shu orqali sahifa dinamik bo'ladi.
🌳 DOM'ni oilaviy daraxtga o'xshating: har bir HTML element (<div>, <p>, <button>) — daraxtdagi bir "shoxcha" yoki "barg". JavaScript ushbu daraxt bo'ylab yurib, istalgan "shoxcha"ni topib, uni o'zgartirishi mumkin.
index.htmlHTML<!DOCTYPE html><html><body><h1>Sarlavha</h1><p>Matn</p></body></html>
code.textTEXTdocument│└── html│└── body│├── h1 → "Sarlavha"│└── p → "Matn"
💡 Key Idea
document — DOM daraxtining "ildizi", JavaScript'dan DOM'ga kirishning boshlang'ich nuqtasi.
| Metod | Vazifasi | Qaytaradi |
|---|---|---|
document.getElementById(id) | ID orqali qidiradi | Bitta element |
document.querySelector(selector) | CSS selector orqali, birinchi mosini | Bitta element |
document.querySelectorAll(selector) | CSS selector orqali, barcha mosini | NodeList |
document.getElementsByClassName(name) | Class nomi orqali | HTMLCollection |
document.getElementsByTagName(tag) | Tag nomi orqali | HTMLCollection |
index.htmlHTML<div id="header">Sarlavha</div><p class="text">Birinchi paragraf</p><p class="text">Ikkinchi paragraf</p>
script.jsJavaScriptlet header = document.getElementById("header");console.log(header.textContent); // "Sarlavha"let firstText = document.querySelector(".text");console.log(firstText.textContent); // "Birinchi paragraf"let allTexts = document.querySelectorAll(".text");console.log(allTexts.length); // 2
🔥 Important
querySelector/querySelectorAll — zamonaviy va eng ko'p tavsiya etiladigan usul, chunki ular istalgan CSS selectorni (masalan, "#header .text:first-child") qo'llab-quvvatlaydi, getElementById/getElementsByClassNamedan farqli.
querySelectorAll() — NodeList, getElementsByClassName() — HTMLCollection qaytaradi. Ikkalasi ham array'ga o'xshaydi, lekin haqiqiy array emas — bu ko'plab yangi boshlovchilarni chalg'itadi.
| Xususiyat | NodeList | HTMLCollection | Array |
|---|---|---|---|
| length | ✅ | ✅ | ✅ |
| forEach() | ✅ (zamonaviy brauzerlarda) | ❌ | ✅ |
| map(), filter() | ❌ | ❌ | ✅ |
| "Live" (avtomatik yangilanadimi) | ❌ (odatda statik) | ✅ (live) | — |
script.jsJavaScriptlet items = document.getElementsByClassName("item");items.map(item => item.textContent); // ❌ TypeError: items.map is not a function
script.jsJavaScriptlet items = document.getElementsByClassName("item");let itemsArray = Array.from(items);// yoki: let itemsArray = [...items];itemsArray.map(item => item.textContent); // ✅ ishlaydi
Array.from() yoki spread operator (Chapter 16) — NodeList/HTMLCollection'ni haqiqiy array'ga aylantiradi, shundan keyingina barcha array metodlari (Chapter 14-15) ishlatilishi mumkin bo'ladi.
⚠️ Common Mistake
getElementsByClassName() — "live" collection qaytaradi, ya'ni agar siz keyinchalik DOM'ga yangi element qo'shsangiz, bu collection avtomatik yangilanadi. Bu ba'zida kutilmagan xatti-harakatga (masalan, loop ichida elementlar sonining o'zgarib turishiga) olib kelishi mumkin. querySelectorAll() esa "statik" — bir marta olingandan keyin o'zgarmaydi.
| Property | Vazifasi |
|---|---|
textContent | Elementning matnini o'qish/yozish (HTML teglarisiz) |
innerHTML | Elementning ichidagi HTML kodini o'qish/yozish |
value | Input, textarea kabi elementlarning qiymati |
id, className | Element atributlari |
index.htmlHTML<div id="box"><b>Qalin</b> matn</div>
script.jsJavaScriptlet box = document.getElementById("box");console.log(box.textContent); // "Qalin matn" (teglarsiz)console.log(box.innerHTML); // "<b>Qalin</b> matn" (teglar bilan)
⚠️ Common Mistake
innerHTML orqali foydalanuvchidan kelgan ma'lumotni to'g'ridan-to'g'ri joylashtirish — XSS (Cross-Site Scripting) xavfsizlik zaifligiga olib kelishi mumkin (Chapter 17.5'da bu haqda gaplashgan edik). Foydalanuvchi ma'lumoti uchun har doim textContent afzalroq.
document — HTML sahifaning o'zini ifodalaydi.window — butun brauzer oynasini ifodalaydi, document — windowning bir qismi.script.jsJavaScriptconsole.log(window.innerWidth); // brauzer oynasining kengligiconsole.log(document.title); // sahifa sarlavhasi (<title> tegi)console.log(document.URL); // joriy sahifa manzili
🔗 Connection
Chapter 26-30'da ko'rgan setTimeout, setInterval — aslida window.setTimeout, window.setInterval deb yozilishi ham mumkin, chunki ular window obyektining metodlari, biz shunchaki window.ni yozmasdan qisqartirib ishlatgan edik.
Task:
<h1 id="title">Salom</h1> elementini getElementById orqali tanlab, uning matnini konsolga chiqaring.
Required Concepts:
getElementByIdtextContentdocument.getElementById("title").textContentTask:
querySelectorAll(".card") orqali barcha .card class'iga ega elementlarni tanlang, ularni array'ga aylantiring va har birining textContentini konsolga chiqaring.
Required Concepts:
querySelectorAllArray.fromforEachArray.from(document.querySelectorAll(".card")).forEach(...)Task:
Sahifadagi barcha <p> elementlarini tanlang, ularning matnlarini filter() yordamida faqat 10 belgidan uzunlarini saralang, keyin map() bilan har birining uzunligini array qilib chiqaring.
Required Concepts:
querySelectorAllArray.fromfilter, map (Chapter 14-15)script.jsJavaScriptlet items = document.getElementsByClassName("item");console.log(typeof items.forEach);console.log(typeof items.map);
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> undefined undefinedWhy?
getElementsByClassName() — HTMLCollection qaytaradi, u haqiqiy array emas va na forEach, na map metodlariga ega. Bu metodlarni ishlatish uchun avval Array.from() orqali haqiqiy array'ga aylantirish kerak.
Quyidagi kodda muammo bor:
script.jsJavaScriptlet paragraphs = document.querySelectorAll("p");let texts = paragraphs.map(p => p.textContent);console.log(texts);
Your Task:
Yechim:
</details>script.jsJavaScriptlet paragraphs = document.querySelectorAll("p");let texts = Array.from(paragraphs).map(p => p.textContent);// yoki: [...paragraphs].map(p => p.textContent);console.log(texts);
getElementById, querySelector, querySelectorAll — elementlarni tanlash uchun asosiy metodlar.Array.from() kerak.textContent — xavfsiz matn, innerHTML — HTML kod bilan ishlaydi (XSS xavfi bor).querySelector/querySelectorAll — eng moslashuvchan va tavsiya etiladigan tanlash usuli.Array.from() yoki spread kerak.innerHTML o'rniga textContent xavfsizroq.getElementsByClassName — "live" collection, querySelectorAll — statik.document — sahifaning o'zi, window — butun brauzer oynasi.script.jsJavaScriptdocument.getElementById("id");document.querySelector(".class");document.querySelectorAll("p");element.textContent; // xavfsiz matnelement.innerHTML; // HTML kod bilanArray.from(nodeList); // haqiqiy array'ga aylantirish
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: