DOM daraxti
HTML hujjatning asosi โ teglar. DOM (Document Object Model) modeliga ko'ra, har bir HTML tegi obyektga aylanadi. Ichma-ich joylashgan teglar tashqi teglarning "bolalari" bo'ladi. Teg ichidagi matn ham obyekt sanaladi. Bu obyektlarning barchasi bizga JavaScript orqali ochiq bo'lib, ular yordamida sahifani boshqaramiz. Ushbu darsda HTML'dan hosil bo'ladigan DOM daraxtini chuqur o'rganamiz.
Misol DOM daraxti
Keling, oddiy bir hujjatni ko'raylik:
<!DOCTYPE HTML>
<html>
<head>
<title>Bosh sahifa haqida</title>
</head>
<body>
Salom, men bu sahifamanman
</body>
</html>
DOM bu hujjatni tugunlar (nodes) daraxti sifatida ifodalaydi. Har bir teg element tuguni (element node) โ daraxtning asosiy "g'ishtchasi"dir. Ular daraxtni tashkil qiladi: <html> โ ildiz, <head> va <body> uning bolalari, va hokazo.
Elementlar ichidagi matn matn tugunlarini (text nodes) tashkil qiladi. Matn tuguni faqat satr (string) saqlaydi. Uning boshqa bolalari bo'la olmaydi va u har doim daraxtning "bargi" (leaf) hisoblanadi.
Masalan, yuqoridagi hujjatda <title> ichida "Bosh sahifa haqida" matn tuguni bor, <body> ichida esa "Salom, men bu sahifamanman" matn tuguni joylashgan.
Bo'shliqlar va yangi qatorlar
Muhim jihat: matn tugunlarida bo'shliqlar (spaces) va yangi qator (newline) belgilari ham hisobga olinadi. Ular ham to'liq huquqli belgilar bo'lib, matn tugunlarini hosil qiladi va DOM'ning bir qismi bo'ladi.
Masalan, quyidagi HTML'da <head>dan oldin va matn ichida bo'shliq va yangi qatorlar bor โ ular ham DOM'ga tushadi:
<!DOCTYPE HTML>
<html>
<!-- bu yerdagi yangi qator + bo'shliq ham matn tuguni bo'ladi -->
<head>...</head>
...
</html>
Biroq ikkita istisno bor:
- Tarixiy sabablarga ko'ra,
<head>dan oldingi bo'shliqlar va yangi qatorlar e'tiborga olinmaydi (ular tashlab yuboriladi); - Agar biror narsani
</body>dan keyin yozsak, brauzer uni avtomatik ravishdabodyichiga ko'chiradi, chunki HTML spetsifikatsiyasiga ko'ra barcha mazmun<body>ichida bo'lishi kerak. Shuning uchun</body>dan keyin bo'shliq bo'lmaydi.
Avtomatik tuzatish (autocorrection)
Agar brauzer noto'g'ri (buzuq) HTML'ga duch kelsa, DOM'ni hosil qilishda uni avtomatik ravishda tuzatadi. Masalan, yuqoridagi hujjatda ochilish <html> tegi yo'q โ bu muhim emas. Brauzer buni sezib, avtomatik qo'shadi, chunki bu tegga hujjat majburan ega bo'lishi kerak.
Xuddi shunday, agar hujjatda umuman <html>, <head> yoki <body> teglari yozilmagan bo'lsa ham, DOM'da ular baribir mavjud bo'ladi. Brauzer ularni yaratadi:
// hatto matndan iborat oddiy HTML uchun ham
// DOM'da <html>, <head>, <body> teglari mavjud bo'ladi
Jadvallar bilan ishlashda qiziq holat bor. DOM spetsifikatsiyasiga ko'ra, <table> ichida albatta <tbody> bo'lishi kerak. Ammo HTML'da uni yozmasligimiz mumkin. Bunday holda brauzer uni DOM'da avtomatik yaratadi:
<table id="table">
<tr>
<td>1</td>
</tr>
</table>
<!-- DOM'da brauzer <table> va <tr> orasiga
avtomatik <tbody> qo'shadi -->
<table>ning bevosita bolasi <tr> emas, balki <tbody> bo'ladi โ hatto uni HTML'da yozmagan bo'lsak ham. Buni unutmaslik kerak, aks holda tugunlar bo'ylab harakatlanish kutilmagan natija berishi mumkin.Yopilmagan teglar, xato joylashgan atributlar โ bularning hammasini brauzer DOM hosil qilishda "tuzatadi". Shu sababli, HTML' da xatolik bo'lsa ham, brauzer baribir biror-bir daraxt tuzadi.
Boshqa tugun turlari
Elementlar va matn tugunlaridan tashqari yana bir necha tugun turlari bor. Masalan, izohlar (comments):
<!DOCTYPE HTML>
<html>
<body>
Salom
<!-- Bu izoh -->
</body>
</html>
Bu yerda <!-- Bu izoh --> ham DOM'da tugun sifatida ko'rinadi โ izoh tuguni (comment node). Savol tug'ilishi mumkin: nega izoh DOM'ga qo'shiladi? U ekranda hech narsa ko'rsatmaydi-ku?
Buning uchun bir qoida bor: HTML'da nima bo'lsa, DOM'da ham shu bo'ladi. Izohlar ham, hatto <!DOCTYPE...> direktivasi ham DOM tuguni hisoblanadi. Hech narsa e'tibordan chetda qolmaydi.
Umuman olib qaraganda, 12 turdagi tugun mavjud. Amaliyotda biz asosan 4 tasi bilan ishlaymiz:
documentโ DOM'ga "kirish nuqtasi", eng yuqori tugun;- element tugunlari โ HTML teglari, daraxtni tashkil etuvchi asosiy bloklar;
- matn tugunlari โ matnni saqlaydi;
- izohlar โ ekranda ko'rinmaydi, ammo ma'lumot uchun DOM'ga qo'shiladi. Ular orqali JavaScript'ga "ko'rsatma" berish kabi hiylalar ham qilinadi.
nodeType. Bu haqda "Node xossalari" darsida batafsil to'xtalamiz. Hozircha esa asosiy 4 turni eslab qolish kifoya.DevTools'da DOM'ni ko'rish
DOM'ni amaliy o'rganish va u bilan ishlash uchun brauzerning ishlab chiquvchi vositalari (Developer Tools, qisqacha DevTools) juda qulay. Ularni F12 tugmasi bilan ochib, Elements (Elementlar) bo'limiga o'ting. U yerda siz DOM daraxtini interaktiv holda ko'rasiz.
- Istalgan elementga bosib, uni tanlashingiz mumkin;
- Uchburchak (arrow) belgisi bilan tugunlarni yoyish/yig'ish mumkin;
- O'ng tomonda tanlangan elementning uslublari (Styles), o'lchamlari va boshqa ma'lumotlari ko'rsatiladi;
- Elementni ustiga sichqonchani olib borsangiz, u sahifada belgilanadi (highlight).
DevTools va JavaScript konsoli o'rtasida qulay o'zaro bog'lanish bor:
- Elements bo'limida biror elementni tanlang;
- Console'ga o'ting va
$0deb yozing โ u yaqinda tanlangan elementga ishora qiladi; - Aksincha ham: agar konsolda biror tugun (masalan,
document.body) chiqarilgan bo'lsa, uning ustiga o'ng tugmani bosib, Reveal in Elements panel ni tanlab, uni Elements bo'limida ko'rishingiz mumkin.
// Console'da tanlangan elementni tekshirish
inspect($0); // tanlangan elementni Elements'da ko'rsatadi
// $0, $1, $2 ... โ oxirgi tanlangan elementlar tarixi
Xulosa
- HTML hujjat teglardan iborat DOM daraxti sifatida ifodalanadi;
- Teglar โ element tugunlari, ular daraxt tuzilishini hosil qiladi;
- Matn โ matn tugunlari; bo'shliq va yangi qatorlar ham matn tugunlari sifatida hisobga olinadi;
- Izohlar, DOCTYPE va boshqa maxsus ma'lumotlar ham DOM tugunlaridir;
- Buzuq HTML'ni brauzer avtomatik tuzatadi (masalan,
<tbody>ni qo'shadi, yopilmagan teglarni yopadi); - DOM'ni DevTools (Elements bo'limi) orqali interaktiv ko'rish va konsol bilan bog'lash mumkin.