createElement orqali yaratilgan elementlar global serverda qayta yuklanganda ko‘rinmaslik muammosi
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:
onMounted
kabi 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
pre
elementi ichidaCopy
tugmasi 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!