DOM ni oâzgartirish âjonliâ sahifalar yaratishning kalitidir.
Bu yerda yangi elementlarni âtezkorlik bilanâ yaratish va mavjud sahifa kontentini oâzgartirish usullarini koârib chiqamiz.
Misol: xabar koârsatish
Bir misol bilan koârsatib beraylik. Biz sahifaga alertdan koâra chiroyliroq koârinadigan xabar qoâshamiz.
Qanday koârinishi:
<style>
.alert {
padding: 15px;
border: 1px solid #d6e9c6;
border-radius: 4px;
color: #3c763d;
background-color: #dff0d8;
}
</style>
<div class="alert">
<strong>Salom!</strong> Siz muhim xabarni o'qidingiz.
</div>
Bu HTML misoli edi. Endi xuddi shunday div ni JavaScript bilan yaratamiz (uslublar HTML/CSS da allaqachon mavjud deb faraz qilib).
Element yaratish
DOM tugunlarini yaratish uchun ikkita usul mavjud:
document.createElement(tag)-
Berilgan teg bilan yangi element tugunini yaratadi:
let div = document.createElement('div'); document.createTextNode(text)-
Berilgan matn bilan yangi matn tugunini yaratadi:
let textNode = document.createTextNode('Mana men shu yerdaman');
Koâpincha bizga xabar uchun div kabi element tugunlarini yaratish kerak.
Xabar yaratish
Xabar div ni yaratish 3 bosqichdan iborat:
// 1. <div> elementini yaratish
let div = document.createElement('div');
// 2. Uning sinfini "alert" ga o'rnatish
div.className = "alert";
// 3. Uni kontent bilan to'ldirish
div.innerHTML = "<strong>Salom!</strong> Siz muhim xabarni o'qidingiz.";
Biz elementni yaratdik. Ammo hozircha u faqat div nomli oâzgaruvchida, sahifada emas. Shuning uchun biz uni koâra olmaymiz.
Qoâyish usullari
div ni koârsatish uchun uni document ning biror joyiga, masalan document.body orqali havola qilingan <body> elementiga qoâyishimiz kerak.
Buning uchun maxsus append usuli mavjud: document.body.append(div).
Mana toâliq kod:
<style>
.alert {
padding: 15px;
border: 1px solid #d6e9c6;
border-radius: 4px;
color: #3c763d;
background-color: #dff0d8;
}
</style>
<script>
let div = document.createElement('div');
div.className = "alert";
div.innerHTML = "<strong>Salom!</strong> Siz muhim xabarni o'qidingiz.";
document.body.append(div);
</script>
Bu yerda biz document.body da append ni chaqirdik, lekin biz append usulini boshqa har qanday elementda ham chaqirib, unga boshqa elementni qoâya olamiz. Masalan, div.append(anotherElement) ni chaqirib <div> ga biror narsa qoâsha olamiz.
Mana boshqa qoâyish usullari, ular qayerga qoâyishning turli joylarini belgilaydi:
node.append(...nodes or strings)â tugunlar yoki satrlarninodening oxiriga qoâshadi,node.prepend(...nodes or strings)â tugunlar yoki satrlarninodening boshiga qoâyadi,node.before(...nodes or strings)â- tugunlar yoki satrlarninodedan oldin qoâyadi,node.after(...nodes or strings)â- tugunlar yoki satrlarninodedan keyin qoâyadi,node.replaceWith(...nodes or strings)â-nodeni berilgan tugunlar yoki satrlar bilan almashtiradi.
Bu usullarning argumentlari qoâyish uchun DOM tugunlarining ixtiyoriy roâyxati yoki matn satrlari (ular avtomatik ravishda matn tugunlariga aylanadi).
Ularni amalda koârib chiqaylik.
Mana ushbu usullardan foydalanib roâyxatga elementlar va uning oldidan/orqasidan matn qoâshish misoli:
<ol id="ol">
<li>0</li>
<li>1</li>
<li>2</li>
</ol>
<script>
ol.before('oldin'); // <ol> dan oldin "oldin" satrini qo'yish
ol.after('keyin'); // <ol> dan keyin "keyin" satrini qo'yish
let liFirst = document.createElement('li');
liFirst.innerHTML = 'prepend';
ol.prepend(liFirst); // liFirst ni <ol> ning boshiga qo'yish
let liLast = document.createElement('li');
liLast.innerHTML = 'append';
ol.append(liLast); // liLast ni <ol> ning oxiriga qo'yish
</script>
Mana usullar nima qilishining vizual tasviri:
Shunday qilib, yakuniy roâyxat quyidagicha boâladi:
oldin
<ol id="ol">
<li>prepend</li>
<li>0</li>
<li>1</li>
<li>2</li>
<li>append</li>
</ol>
keyin
Aytganimizdek, bu usullar bir marta chaqiruvda bir nechta tugunlar va matn qismlarini qoâya oladi.
Masalan, bu yerda satr va element qoâyiladi:
<div id="div"></div>
<script>
div.before('<p>Salom</p>', document.createElement('hr'));
</script>
Eâtibor bering: matn âmatn sifatidaâ qoâyiladi, âHTML sifatidaâ emas, <, > kabi belgilar toâgâri qochib ketiladi.
Shunday qilib, yakuniy HTML:
<p>Salom</p>
<hr>
<div id="div"></div>
Boshqacha qilib aytganda, satrlar elem.textContent kabi xavfsiz tarzda qoâyiladi.
Shunday qilib, bu usullar faqat DOM tugunlari yoki matn qismlarini qoâyish uchun ishlatilishi mumkin.
Ammo agar biz HTML satrni âHTML sifatidaâ qoâyishni, barcha teglar va narsalar elem.innerHTML kabi ishlashini istasak-chi?
insertAdjacentHTML/Text/Element
Buning uchun biz boshqa, juda koâp qirrali usuldan foydalanishimiz mumkin: elem.insertAdjacentHTML(where, html).
Birinchi parametr â elem ga nisbatan qayerga qoâyishni belgilovchi kod soâzi. Quyidagilardan biri boâlishi kerak:
"beforebegin"âhtmlnielemdan darhol oldin qoâyish,"afterbegin"âhtmlnielemichiga, boshiga qoâyish,"beforeend"âhtmlnielemichiga, oxiriga qoâyish,"afterend"âhtmlnielemdan darhol keyin qoâyish.
Ikkinchi parametr â âHTML sifatidaâ qoâyiladigan HTML satr.
Masalan:
<div id="div"></div>
<script>
div.insertAdjacentHTML('beforebegin', '<p>Salom</p>');
div.insertAdjacentHTML('afterend', '<p>Xayr</p>');
</script>
â¦Quyidagiga olib keladi:
<p>Salom</p>
<div id="div"></div>
<p>Xayr</p>
Mana sahifaga ixtiyoriy HTML qoâshish usuli.
Mana qoâyish variantlarining tasviri:
Biz bu bilan oldingi rasm oârtasidagi oâxshashlikni osongina seza olamiz. Qoâyish nuqtalari aslida bir xil, lekin bu usul HTML qoâyadi.
Usulning ikkita ukasi bor:
elem.insertAdjacentText(where, text)â xuddi shunday sintaksis, lekin HTML oârnigatextsatri âmatn sifatidaâ qoâyiladi,elem.insertAdjacentElement(where, elem)â xuddi shunday sintaksis, lekin element qoâyiladi.
Ular asosan sintaksisni âbir xilâ qilish uchun mavjud. Amalda koâpincha faqat insertAdjacentHTML ishlatiladi. Chunki elementlar va matn uchun bizda append/prepend/before/after usullari bor â ularni yozish qisqaroq va ular tugunlar/matn qismlarini qoâya oladi.
Shunday qilib, mana xabar koârsatishning muqobil varianti:
<style>
.alert {
padding: 15px;
border: 1px solid #d6e9c6;
border-radius: 4px;
color: #3c763d;
background-color: #dff0d8;
}
</style>
<script>
document.body.insertAdjacentHTML("afterbegin", `<div class="alert">
<strong>Salom!</strong> Siz muhim xabarni o'qidingiz.
</div>`);
</script>
Tugunni olib tashlash
Tugunni olib tashlash uchun node.remove() usuli mavjud.
Keling, xabarimizni bir soniyadan keyin yoâqolib ketishini taâminlaylik:
<style>
.alert {
padding: 15px;
border: 1px solid #d6e9c6;
border-radius: 4px;
color: #3c763d;
background-color: #dff0d8;
}
</style>
<script>
let div = document.createElement('div');
div.className = "alert";
div.innerHTML = "<strong>Salom!</strong> Siz muhim xabarni o'qidingiz.";
document.body.append(div);
setTimeout(() => div.remove(), 1000);
</script>
Eâtibor bering: agar biz elementni boshqa joyga koâchirmoqchi boâlsak â uni eski joydan olib tashlashning hojati yoâq.
Barcha qoâyish usullari tugunni eski joydan avtomatik ravishda olib tashlaydi.
Masalan, elementlarni almashtiraylik:
<div id="first">Birinchi</div>
<div id="second">Ikkinchi</div>
<script>
// remove ni chaqirishning hojati yo'q
second.after(first); // #second ni olib, uning orqasiga #first ni qo'y
</script>
Tugunlarni klonlash: cloneNode
Yana bitta shunga oâxshash xabar qanday qoâyish mumkin?
Biz funksiya yasab, kodni u yerga qoâyishimiz mumkin. Ammo muqobil usul mavjud div ni klonlash va ichidagi matnni oâzgartirish (kerak boâlsa).
Baâzan katta elementimiz boâlsa, bu tezroq va oddiyroq boâlishi mumkin.
elem.cloneNode(true)chaqiruvi elementning âchuqurâ klonini yaratadi â barcha atributlar va subelementlar bilan. Agar bizelem.cloneNode(false)ni chaqirsak, klon bola elementlarsiz yaratiladi.
Xabarni nusxalash misoli:
<style>
.alert {
padding: 15px;
border: 1px solid #d6e9c6;
border-radius: 4px;
color: #3c763d;
background-color: #dff0d8;
}
</style>
<div class="alert" id="div">
<strong>Salom!</strong> Siz muhim xabarni o'qidingiz.
</div>
<script>
let div2 = div.cloneNode(true); // xabarni klonlash
div2.querySelector('strong').innerHTML = 'Xayr!'; // klonni o'zgartirish
div.after(div2); // mavjud div dan keyin klonni ko'rsatish
</script>
DocumentFragment
DocumentFragment â tugunlar roâyxatini uzatish uchun oâram vazifasini bajaradigan maxsus DOM tugun.
Biz unga boshqa tugunlarni qoâsha olamiz, lekin uni biror joyga qoâyganimizda, uning mazmuni qoâyiladi.
Masalan, quyidagi getListContent <li> elementlari bilan fragment yaratadi, ular keyinroq <ul> ga qoâyiladi:
<ul id="ul"></ul>
<script>
function getListContent() {
let fragment = new DocumentFragment();
for(let i=1; i<=3; i++) {
let li = document.createElement('li');
li.append(i);
fragment.append(li);
}
return fragment;
}
ul.append(getListContent()); // (*)
</script>
Eâtibor bering, oxirgi satrda (*) biz DocumentFragment ni qoâshamiz, lekin u âaralashib ketadiâ, shuning uchun natija tuzilmasi quyidagicha boâladi:
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
DocumentFragment kamdan-kam aniq ishlatiladi. Nima uchun tugunlar massivini qaytarish oârniga maxsus turdagi tugunga qoâshish kerak? Qayta yozilgan misol:
<ul id="ul"></ul>
<script>
function getListContent() {
let result = [];
for(let i=1; i<=3; i++) {
let li = document.createElement('li');
li.append(i);
result.push(li);
}
return result;
}
ul.append(...getListContent()); // append + "..." operatori = do'stlar!
</script>
Biz DocumentFragment ni asosan uning ustida baâzi tushunchalar borligi sababli eslatamiz, masalan keyinchalik koârib chiqadigan template elementi.
Eski uslubdagi qoâyish/olib tashlash usullari
Tarixiy sabablarga koâra mavjud boâlgan âeski uslubdagiâ DOM manipulyatsiya usullari ham mavjud.
Bu usullar haqiqatan ham qadimiy davrlardan keladi. Hozirda ulardan foydalanishning hech qanday sababi yoâq, chunki append, prepend, before, after, remove, replaceWith kabi zamonaviy usullar moslashuvchanroq.
Biz bu usullarni bu yerda sanab oâtishimizning yagona sababi â ularni koâplab eski skriptlarda uchrashingiz mumkin:
parentElem.appendChild(node)-
nodeniparentElemning oxirgi bolasi sifatida qoâshadi.Quyidagi misol
<ol>ning oxiriga yangi<li>qoâshadi:<ol id="list"> <li>0</li> <li>1</li> <li>2</li> </ol> <script> let newLi = document.createElement('li'); newLi.innerHTML = 'Salom, dunyo!'; list.appendChild(newLi); </script> parentElem.insertBefore(node, nextSibling)-
nodeniparentElemichidanextSiblingdan oldin qoâyadi.Quyidagi kod ikkinchi
<li>dan oldin yangi roâyxat elementini qoâyadi:<ol id="list"> <li>0</li> <li>1</li> <li>2</li> </ol> <script> let newLi = document.createElement('li'); newLi.innerHTML = 'Salom, dunyo!'; list.insertBefore(newLi, list.children[1]); </script>newLini birinchi element sifatida qoâyish uchun buni qilishimiz mumkin:list.insertBefore(newLi, list.firstChild); parentElem.replaceChild(node, oldChild)-
parentElembolalari orasidaoldChildninodebilan almashtiradi. parentElem.removeChild(node)-
nodeniparentElemdan olib tashlaydi (nodeuning bolasi deb faraz qilib).Quyidagi misol
<ol>dan birinchi<li>ni olib tashlaydi:<ol id="list"> <li>0</li> <li>1</li> <li>2</li> </ol> <script> let li = list.firstElementChild; list.removeChild(li); </script>
Bu usullarning barchasi qoâyilgan/olib tashlangan tugunni qaytaradi. Boshqacha qilib aytganda, parentElem.appendChild(node) node ni qaytaradi. Ammo odatda qaytarilgan qiymat ishlatilmaydi, biz shunchaki usulni ishga tushiramiz.
âdocument.writeâ haqida bir soâz
Veb-sahifaga biror narsa qoâshishning yana bir juda qadimiy usuli mavjud: document.write.
Sintaksis:
<p>Sahifaning biror joyida...</p>
<script>
document.write('<b>JS dan salom</b>');
</script>
<p>Oxiri</p>
document.write(html) ga chaqiruv html ni sahifaga âaynan shu yerda va hozirâ yozadi. html satri dinamik ravishda yaratilishi mumkin, shuning uchun u qandaydir moslashuvchan. Biz JavaScript dan foydalanib toâliq veb-sahifa yaratib, uni yoza olamiz.
Bu usul DOM, standartlar boâlmagan davrlardan keladi⦠Haqiqatan ham eski zamonlar. U hali ham mavjud, chunki undan foydalanuvchi skriptlar bor.
Zamonaviy skriptlarda biz uni kamdan-kam koâramiz, quyidagi muhim cheklov sababli:
document.write ga chaqiruv faqat sahifa yuklanayotganda ishlaydi.
Agar biz uni keyinroq chaqirsak, mavjud hujjat mazmuni oâchiriladi.
Masalan:
<p>Bir soniyadan keyin ushbu sahifa mazmuni almashtiriladi...</p>
<script>
// 1 soniyadan keyin document.write
// bu sahifa yuklangandan keyin, shuning uchun mavjud kontentni o'chiradi
setTimeout(() => document.write('<b>...Mana bu bilan.</b>'), 1000);
</script>
Shunday qilib, u yuqorida koârib chiqilgan boshqa DOM usullaridan farqli ravishda âyuklangandan keyinâ bosqichida yaroqsiz.
Bu salbiy tomoni.
Ijobiy tomoni ham bor. Texnik jihatdan, document.write brauzer kiruvchi HTML ni oâqiyotganda (âtahlil qilayotgandaâ) chaqirilganda va u biror narsa yozganda, brauzer uni xuddi dastlab HTML matnida boâlgandek qabul qiladi.
Shunday qilib, u juda tez ishlaydi, chunki DOM oâzgartiruvi yoâq. U DOM hali qurilmagan vaqtda toâgâridan-toâgâri sahifa matniga yozadi.
Shunday qilib, agar bizga HTML ga dinamik ravishda koâp matn qoâshish kerak boâlsa va biz sahifa yuklash bosqichidamiz va tezlik muhim boâlsa, u yordam berishi mumkin. Ammo amalda bu talablar kamdan-kam uchraydi. Va odatda biz bu usulni skriptlarda shunchaki eski boâlganligi uchun koâramiz.
Xulosa
-
Yangi tugunlar yaratish usullari:
document.createElement(tag)â berilgan teg bilan element yaratadi,document.createTextNode(value)â matn tugunini yaratadi (kamdan-kam ishlatiladi),elem.cloneNode(deep)â elementni klonlaydi, agardeep==trueboâlsa barcha avlodlar bilan.
-
Qoâyish va olib tashlash:
node.append(...nodes or strings)ânodega, oxiriga qoâyish,node.prepend(...nodes or strings)ânodega, boshiga qoâyish,node.before(...nodes or strings)â-nodedan oldin qoâyish,node.after(...nodes or strings)â-nodedan keyin qoâyish,node.replaceWith(...nodes or strings)â-nodeni almashtirish.node.remove()â-nodeni olib tashlash.
Matn satrlari âmatn sifatidaâ qoâyiladi.
-
âEski uslubdagiâ usullar ham mavjud:
parent.appendChild(node)parent.insertBefore(node, nextSibling)parent.removeChild(node)parent.replaceChild(newElem, node)
Bu usullarning barchasi
nodeni qaytaradi. -
htmldagi HTML berilgan boâlsa,elem.insertAdjacentHTML(where, html)uniwhereqiymatiga qarab qoâyadi:"beforebegin"âhtmlnielemdan oldin qoâyish,"afterbegin"âhtmlnielemichiga, boshiga qoâyish,"beforeend"âhtmlnielemichiga, oxiriga qoâyish,"afterend"âhtmlnielemdan keyin qoâyish.
Shuningdek, oâxshash usullar
elem.insertAdjacentTextvaelem.insertAdjacentElementmavjud, ular matn satrlari va elementlarni qoâyadi, lekin ular kamdan-kam ishlatiladi. -
Sahifa yuklanish tugashidan oldin HTML qoâshish uchun:
document.write(html)
Sahifa yuklangandan keyin bunday chaqiruv hujjatni oâchiradi. Asosan eski skriptlarda koâriladi.
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepenâ¦)