createElement orqali yaratilgan elementlar global serverda qayta yuklanganda ko‘rinmaslik muammosi
createElement orqali yaratilgan elementlarning serverda reload qilganda ko'rinmaslik sabablari va bu muammoni qanday hal qilish mumkinligini ko'rib chiqamiz.
Muammo: createElement orqali yaratilgan elementlar sahifani qayta yuklaganda yo'qoladi
Agar siz JavaScript orqali document.createElement funksiyasidan foydalangan bo‘lsangiz, ba’zan lokal muhitda kodingiz yaxshi ishlaydi, lekin serverga yuklanganingizda, sahifani qayta yuklaganingizda yoki dinamik kontent qo‘shganingizda, bu elementlar ko‘rinmasligi mumkin.
Ushbu muammo odatda server tarafidan render qilish (SSR) va DOM manipulatsiyasi bilan bog‘liq.
Nega bu sodir bo‘ladi?
- Server tarafidan render (SSR): Ko‘p frameworklar, masalan, Nuxt.js, dastlab sahifani serverda yuklaydi va foydalanuvchiga statik HTML yuboradi.
- DOM o‘zgarishi:
onMountedkabi lifecycle metodlar faqat dastlabki yuklash vaqtida ishlaydi va agar sahifada yangi kontent dinamik ravishda yuklansa, eski manipulyatsiyalar yo‘qoladi. - Dinamik kontent: Dinamik tarkibni, masalan,
<ContentDoc>komponentidan kelayotgan ma’lumotlarni qayta yuklaganda DOM’da sizning qo‘shimcha yaratilgan elementlaringiz yo‘qoladi.
Oddiy misol: Copy tugmasi
Quyida createElement orqali dinamik yaratilgan elementlar misoli keltirilgan:
onMounted(() => {
document.querySelectorAll("pre").forEach((block) => {
const button = document.createElement("button")
button.innerText = "Copy"
button.className = "copy-btn"
block.appendChild(button)
button.addEventListener("click", () => {
const code = block.querySelector("code")?.innerText || ""
navigator.clipboard.writeText(code).then(() => {
button.innerText = "Copied!"
setTimeout(() => (button.innerText = "Copy"), 2000)
})
})
})
})
Lokal muhitda ushbu kod muvaffaqiyatli ishlaydi. Ammo, sahifani qayta yuklaganingizda, bu tugmalar yo‘q bo‘lib qoladi.
Yechim: MutationObserver’dan foydalanish
Dinamik DOM o‘zgarishlarini kuzatib borish uchun MutationObserver eng yaxshi yechimlardan biri hisoblanadi. Quyida to‘liq yechim keltirilgan:
onMounted(() => {
const observer = new MutationObserver(() => {
document.querySelectorAll("pre").forEach((block) => {
if (!block.querySelector(".copy-btn")) {
const button = document.createElement("button")
button.innerText = "Copy"
button.className = "copy-btn"
block.appendChild(button)
button.addEventListener("click", () => {
const code = block.querySelector("code")?.innerText || ""
navigator.clipboard.writeText(code).then(() => {
button.innerText = "Copied!"
setTimeout(() => (button.innerText = "Copy"), 2000)
})
})
}
})
})
observer.observe(document.body, { childList: true, subtree: true })
})
Nega bu kod ishlaydi?
MutationObserver: DOM’da har qanday yangi o‘zgarishlarni kuzatadi.- Dinamik elementlarni qo‘shish: Agar
preelementi ichidaCopytugmasi bo‘lmasa, u avtomatik ravishda qo‘shiladi. - Qo‘shimcha elementlarning ko‘rinishi: Sahifani qayta yuklaganingizda yoki dinamik tarkib qo‘shilganda, yangi elementlar o‘z vaqtida qo‘shiladi.
Boshqa qo‘llanishlar
Yuqoridagi yechim faqat Copy tugmasi bilan cheklanib qolmaydi. Siz ushbu metodni quyidagi holatlarda ham qo‘llashingiz mumkin:
- Dinamik modal yoki tooltip yaratishda.
- Foydalanuvchi tugmachasini (button) avtomatik qo‘shishda.
- Kod yoki matn snippetlarini avtomatik o‘zgartirishda.
Xulosa
createElement orqali yaratilgan elementlarning ko‘rinmay qolishi muammosi server tarafidan render qilish jarayoni va dinamik DOM manipulyatsiyalari bilan bog‘liq. MutationObserver ushbu muammoni hal qilish uchun eng samarali usullardan biridir.
Agar sizning loyihangizda shu kabi muammo yuzaga kelsa, ushbu maqola yordamida muammoni hal qilishingiz mumkin. Fikrlaringizni yoki savollaringizni izohlarda qoldiring!