template ба slot element
Вэб хуудасны агуулга ихэнх тохиолдолд динамик байдаг — жагсаалтын зүйлс, картын дараалал, мессежийн жагсаалт зэргийг JavaScript-ээр үүсгэж дэлгэцэнд харуулдаг. <template> элемент нь энэ ажлыг цэвэр, хурдан хийх боломж олгодог.
<template> элемент гэж юу вэ?
<template> нь хуудас ачаалагдах үед дэлгэцэнд харагдахгүй боловч JavaScript-ээр хуулж ашиглах боломжтой HTML хэлбэрчлэлийг агуулдаг.
<!-- template нь дэлгэцэнд харагдахгүй -->
<template id="бүтээгдэхүүн-загвар">
<div class="карт">
<img class="зураг" src="" alt="" />
<h3 class="нэр"></h3>
<p class="үнэ"></p>
<button class="сагс-товч">Сагсанд нэмэх</button>
</div>
</template>
<!-- Карт энд гарна -->
<div id="бүтээгдэхүүн-жагсаалт"></div>
<template> доторх HTML нь:
- Дэлгэцэнд харагдахгүй
- Браузерийн зурах (render) процест оролцохгүй
- Script болон style нь гүйцэтгэгдэхгүй
- Хуулж ашиглахад бэлэн загвар болно
JavaScript-ээр клонлох
const загвар = document.getElementById("бүтээгдэхүүн-загвар");
const жагсаалт = document.getElementById("бүтээгдэхүүн-жагсаалт");
// Бүтээгдэхүүний өгөгдөл
const бүтээгдэхүүнүүд = [
{ нэр: "Цүнх", үнэ: "45,000 ₮", зураг: "цүнх.jpg" },
{ нэр: "Малгай", үнэ: "12,000 ₮", зураг: "малгай.jpg" },
{ нэр: "Гутал", үнэ: "78,000 ₮", зураг: "гутал.jpg" },
];
бүтээгдэхүүнүүд.forEach((бүтээгдэхүүн) => {
// content.cloneNode(true) — template-ийн агуулгыг хуулна
const клон = загвар.content.cloneNode(true);
// Клоны дотор элементүүдийг олж утга оруулна
клон.querySelector(".зураг").src = бүтээгдэхүүн.зураг;
клон.querySelector(".зураг").alt = бүтээгдэхүүн.нэр;
клон.querySelector(".нэр").textContent = бүтээгдэхүүн.нэр;
клон.querySelector(".үнэ").textContent = бүтээгдэхүүн.үнэ;
// Дэлгэцэнд нэмнэ
жагсаалт.appendChild(клон);
});
cloneNode(true) нь true параметртэй бол бүх дотоод элементийг хамт хуулна — false бол зөвхөн гаднах элементийг хуулна.
template vs innerHTML
Template ашиглахгүйгээр innerHTML ашигласан бол:
// innerHTML — string-ийн нэгтгэл, XSS аюул, удаан
бүтээгдэхүүнүүд.forEach((б) => {
жагсаалт.innerHTML += `
<div class="карт">
<h3>${б.нэр}</h3>
<p>${б.үнэ}</p>
</div>
`;
});
<template> ашиглах нь дараах давуу талтай:
- Аюулгүй — XSS халдлагад өртөхгүй, учир нь утга string биш DOM property-р оруулна
- Хурдан — DOM-г шууд удирддаг, string parsing байхгүй
- Цэвэр — HTML ба JavaScript тусдаа байна
Хоёр загвар хамт ашиглах жишээ
<!-- Мессежийн загвар -->
<template id="мессеж-загвар">
<li class="мессеж">
<span class="зохиогч"></span>
<p class="текст"></p>
<time class="цаг"></time>
</li>
</template>
<!-- Алдааны мэдэгдлийн загвар -->
<template id="алдаа-загвар">
<div class="алдаа-карт" role="alert">
<strong class="алдаа-гарчиг"></strong>
<p class="алдаа-тайлбар"></p>
</div>
</template>
<ul id="мессеж-жагсаалт"></ul>
<div id="мэдэгдлүүд"></div>
<script>
function мессеж нэмэх(зохиогч, текст) {
const загвар = document.getElementById("мессеж-загвар");
const клон = загвар.content.cloneNode(true);
клон.querySelector(".зохиогч").textContent = зохиогч;
клон.querySelector(".текст").textContent = текст;
клон.querySelector(".цаг").textContent = new Date().toLocaleTimeString("mn-MN");
document.getElementById("мессеж-жагсаалт").appendChild(клон);
}
мессеж нэмэх("Болд", "Сайн байна уу!");
мессеж нэмэх("Дорж", "Сайн, та яаж байна?");
</script>
<slot> ба Shadow DOM — товч танилцуулга
<slot> нь Web Component технологийн нэг хэсэг бөгөөд Shadow DOM-тэй хамт ажилладаг. Shadow DOM нь HTML элементийн дотоод бүтцийг гаднаас тусгаарлах механизм юм.
// Энгийн custom element бүтээх
class МиниКарт extends HTMLElement {
constructor() {
super();
// Shadow root үүсгэнэ
const shadow = this.attachShadow({ mode: "open" });
// Template-г Shadow DOM-д клонлоно
const загвар = document.getElementById("карт-загвар");
shadow.appendChild(загвар.content.cloneNode(true));
}
}
customElements.define("мини-карт", МиниКарт);
<template id="карт-загвар">
<style>
/* Shadow DOM дотрын style гаднаас нөлөөлөхгүй */
:host { display: block; border: 1px solid #1e293b; padding: 16px; }
</style>
<!-- slot нь гаднаас дамжуулсан HTML-г тавих газар -->
<slot name="гарчиг"></slot>
<slot></slot>
</template>
<!-- Custom element ашиглах -->
<мини-карт>
<h3 slot="гарчиг">Бүтээгдэхүүний нэр</h3>
<p>Тайлбар текст энд орно.</p>
</мини-карт>
<slot> болон Shadow DOM-г гүнзгийрүүлэн судлах нь дараагийн хичээлийн сэдэв — Web Components.
Дараагийн хичээлд:
Web Components технологийг судлана — Custom Element, Shadow DOM, Template-г нэгтгэн өөрийн HTML тагийг хэрхэн бүтээх талаар практикаар үзнэ.