DOM manipulyatsiyasi: element yaratish va qo'shish, elementlarni o'chirish (remove), CSS uslublari va classList boshqaruvi, atributlar hamda DocumentFragment va performance.
Chapter 31'da elementlarni tanlashni o'rgandik. Bu bobda ularni o'zgartirish, yaratish va o'chirishni o'rganamiz.
| Metod | Vazifasi |
|---|---|
document.createElement(tag) | Yangi element yaratadi (hali sahifada emas) |
parent.appendChild(child) | Elementni oxiriga qo'shadi |
parent.append(child) | appendChildga o'xshash, lekin string ham qabul qiladi |
parent.prepend(child) | Elementni boshiga qo'shadi |
parent.insertBefore(new, ref) | Ma'lum elementdan oldin qo'shadi |
script.jsJavaScriptlet newParagraph = document.createElement("p");newParagraph.textContent = "Bu yangi paragraf";document.body.appendChild(newParagraph);
createElement("p") — xotirada yangi <p> element yaratadi, lekin u hali sahifada ko'rinmaydi.textContent orqali unga matn beriladi.appendChild() — elementni haqiqiy DOM daraxtiga (document.body ichiga) qo'shadi, shundagina u sahifada ko'rinadi.💡 Key Idea
Element yaratish (createElement) va uni DOM'ga qo'shish (appendChild) — ikkita alohida qadam. Faqat yaratilgan, lekin qo'shilmagan element sahifada hech qachon ko'rinmaydi.
script.jsJavaScriptlet element = document.getElementById("myElement");element.remove(); // zamonaviy, oddiy usul
script.jsJavaScriptelement.parentNode.removeChild(element);
🔗 Connection
remove() — zamonaviy JavaScript'da tavsiya etiladigan usul, removeChild() esa eski, ko'proq "qo'lda" boshqarishni talab qiladigan usul.
Elementning CSS stilini JavaScript orqali o'zgartirish uchun style propertysi ishlatiladi.
script.jsJavaScriptlet box = document.getElementById("box");box.style.backgroundColor = "blue";box.style.width = "200px";box.style.display = "none"; // yashirish
⚠️ Common Mistake
CSS'dagi background-color (chiziqcha bilan) — JavaScript'da backgroundColor (camelCase) shaklida yoziladi, chiziqcha bilan emas.
script.jsJavaScriptlet box = document.getElementById("box");box.classList.add("active"); // klass qo'shishbox.classList.remove("hidden"); // klass olib tashlashbox.classList.toggle("dark"); // bor bo'lsa olib tashlaydi, yo'q bo'lsa qo'shadibox.classList.contains("active"); // true/false
🔥 Important
Ko'p CSS o'zgarishlar uchun, to'g'ridan-to'g'ri style bilan ishlashdan ko'ra, classList orqali oldindan CSS'da tayyorlangan klasslarni qo'shish/olib tashlash — kod tuzilishini ancha toza va boshqarish oson qiladi.
| Metod | Vazifasi |
|---|---|
getAttribute(name) | Atribut qiymatini oladi |
setAttribute(name, value) | Atribut o'rnatadi |
removeAttribute(name) | Atributni olib tashlaydi |
hasAttribute(name) | Atribut mavjudligini tekshiradi |
index.htmlHTML<img id="photo" src="old.jpg" alt="Rasm">
script.jsJavaScriptlet photo = document.getElementById("photo");console.log(photo.getAttribute("src")); // "old.jpg"photo.setAttribute("src", "new.jpg");photo.setAttribute("alt", "Yangi rasm");
Har safar DOM'ga o'zgartirish kiritilganda (masalan, appendChild), brauzer sahifani qayta "chizishi" (reflow/repaint) kerak bo'lishi mumkin — bu qimmat (sekin) amal. Agar loop ichida ko'p marta DOM'ni o'zgartirsangiz, bu jiddiy sekinlikka olib kelishi mumkin.
script.jsJavaScriptlet list = document.getElementById("list");for (let i = 0; i < 1000; i++) {let item = document.createElement("li");item.textContent = "Element " + i;list.appendChild(item); // ❌ Har safar DOM'ga alohida-alohida qo'shilmoqda}
Nima uchun bu sekin?
Har bir appendChild() chaqiruvi — brauzerga "sahifani qayta chizish" haqida signal berishi mumkin. 1000 marta alohida-alohida DOM'ga tegish — 1000 marta potentsial "qayta chizish"ni anglatadi.
script.jsJavaScriptlet list = document.getElementById("list");let fragment = document.createDocumentFragment();for (let i = 0; i < 1000; i++) {let item = document.createElement("li");item.textContent = "Element " + i;fragment.appendChild(item); // fragment — "ko'rinmas" konteyner}list.appendChild(fragment); // ✅ faqat BITTA marta DOM'ga tegilmoqda
DocumentFragment — xotirada "vaqtinchalik" konteyner, u sahifada ko'rinmaydi va DOM'ning bir qismi emas.listga) qo'shiladi.code.textTEXTYomon usul: Yaxshi usul:appendChild() x1000 → DocumentFragment ichiga x1000│ │1000 marta "qayta chizish" 1 marta "qayta chizish"
💡 Key Idea
DocumentFragment — ko'p sonli elementlarni bir vaqtning o'zida DOM'ga qo'shish kerak bo'lganda, unumdorlikni sezilarli darajada oshiradigan texnika.
Task:
Yangi <button> elementi yarating, matnini "Bosing" qiling va document.bodyga qo'shing.
Required Concepts:
createElement, appendChilddocument.createElement("button") dan foydalaning.Task:
<div id="box"> elementiga classList orqali "active" klassini qo'shing, style orqali orqa fon rangini "yellow" qiling.
Required Concepts:
classListstylebox.classList.add("active"); box.style.backgroundColor = "yellow";Task:
DocumentFragment yordamida 100 ta <li> elementini yaratib, ularni bitta <ul> elementiga samarali (bitta DOM operatsiyasi bilan) qo'shing. Har bir <li> matni "Element 1" dan "Element 100"gacha bo'lsin.
Required Concepts:
DocumentFragmentfor loopscript.jsJavaScriptlet div = document.createElement("div");div.textContent = "Salom";console.log(document.body.contains(div));document.body.appendChild(div);console.log(document.body.contains(div));
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> false trueWhy?
createElement() bilan yaratilgan element — xotirada mavjud, lekin hali DOM daraxtiga (document.bodyga) qo'shilmagan, shuning uchun contains() birinchi safar false qaytaradi. appendChild() chaqirilgandan keyingina, element haqiqiy DOM'ning bir qismiga aylanadi.
Quyidagi kodda muammo bor — dasturchi rangni o'zgartirmoqchi, lekin ishlamayapti:
script.jsJavaScriptlet box = document.getElementById("box");box.style.background-color = "red";
Your Task:
Yechim: camelCase formatidan foydalanish kerak:
</details>script.jsJavaScriptbox.style.backgroundColor = "red";
createElement + appendChild — yangi element yaratish va DOM'ga qo'shish.remove() — elementni DOM'dan olib tashlash.style — CSS'ni to'g'ridan-to'g'ri o'zgartirish (camelCase bilan).classList — CSS klasslarini qo'shish/olib tashlashning toza usuli.DocumentFragment — ko'p elementlarni samarali qo'shish uchun.background-color → backgroundColor).classList — ko'p hollarda to'g'ridan-to'g'ri styledan ko'ra afzalroq (CSS'da oldindan tayyorlangan uslublardan foydalanadi).DocumentFragment orqali "guruhlash" — unumdorlikni oshiradi.contains() — element haqiqatan DOM daraxtining bir qismi ekanini tekshirish uchun foydali.script.jsJavaScriptlet el = document.createElement("div");el.textContent = "Matn";parent.appendChild(el);el.remove();el.style.color = "red";el.classList.add("active");el.classList.toggle("hidden");el.setAttribute("data-id", "123");el.getAttribute("data-id");let fragment = document.createDocumentFragment();
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: