5.1 ํ๊ทธ <template>
HTML์ <template>
ํ๊ทธ๋ ํ์ด์ง ๋ก๋ ์ ํ์๋์ง ์์ง๋ง, JavaScript๋ฅผ ํตํด ๋์ค์ ์ฌ์ฉํ ์ ์๋ HTML ์ฝ๋ ์กฐ๊ฐ์ ์ ์ํ ์ ์๊ฒ ํด์ค. ์ด๊ฑด ๋์ ์ปจํ
์ธ ์์ฑ ๋ฐ ์ฝ์
, ์๋ฅผ ๋ค์ด ๋ฆฌ์คํธ ํญ๋ชฉ์ด๋ ์ ํ ์นด๋, ๋ค๋ฅธ ๋ฐ๋ณต์ ๊ตฌ์กฐ๋ค์ ํนํ ์ ์ฉํด.
<template>
์์๋ HTML ์ฝ๋๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ผ, ์ด ์ฝ๋๋ ํ์ด์ง์ ์ฆ์ ํ์๋์ง ์์. <template>
์์ ๋ด์ฉ์ ํ์ด์ง ๋ก๋ ์ ๋ธ๋ผ์ฐ์ ์ ์ํด ๋ ๋๋ง๋์ง ์์ง๋ง, DOM (Document Object Model)์ ํตํด ์ ๊ทผ ๊ฐ๋ฅํ๊ณ , JavaScript๋ก ๋ณต์ ํ๊ณ ๋ฌธ์์ ์ฝ์
๋ ์ ์์ด.
๋ฌธ๋ฒ:
<template>
<!-- ํ
ํ๋ฆฟ ๋ด์ฉ -->
</template>
<template> ํ๊ทธ์ ์ฃผ์ ํน์ง
- ๋ด์ฉ ์จ๊น:
<template>
ํ๊ทธ์ ๋ด์ฉ์ ํ์ด์ง ๋ก๋ ์ ํ์๋์ง ์์. - JavaScript ์ฌ์ฉ:
<template>
ํ๊ทธ์ ๋ด์ฉ์ JavaScript๋ก ๋ณต์ ํ๊ณ DOM์ ์ฝ์ ํ ์ ์์ด. - ์ง์ฐ ๋ก๋: ํ์์ ๋ฐ๋ผ ๋ด์ฉ ๋ก๋ ๋ฐ ํ์๋ฅผ ํ์ฉํด ํ์ด์ง ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ด.
<template> ํ๊ทธ ์ฌ์ฉ ์์
์ด ์์์์๋ "Add Item" ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์๋ก์ด ๋ฆฌ์คํธ ํญ๋ชฉ์ด ๋ง๋ค์ด์ง๋ฉฐ <ul>
๋ฆฌ์คํธ์ ์ถ๊ฐ๋ผ. ์๋ก์ด ๋ฆฌ์คํธ ํญ๋ชฉ์ ํ
ํ๋ฆฟ์ <template>
ํ๊ทธ ์์ ์ ์๋ผ ์์ด.
<button id="addButton">Add Item</button>
<ul id="itemList"></ul>
<template id="itemTemplate">
<li class="item">This is a new item</li>
</template>
// DOM์์ ์ฌ์ฉํ ์์์ ๋ํ ์ฐธ์กฐ ์ป๊ธฐ
const addButton = document.getElementById('addButton'); // "์ถ๊ฐ" ๋ฒํผ
const itemList = document.getElementById('itemList'); // ํญ๋ชฉ์ ์ถ๊ฐํ ๋ฆฌ์คํธ
const itemTemplate = document.getElementById('itemTemplate'); // ๋ฆฌ์คํธ ํญ๋ชฉ์ ํ
ํ๋ฆฟ
// "์ถ๊ฐ" ๋ฒํผ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ถ๊ฐํ๊ธฐ
addButton.addEventListener('click', () => {
// ๋ฆฌ์คํธ ํญ๋ชฉ ํ
ํ๋ฆฟ ๋ด์ฉ ๋ณต์ ํ๊ธฐ
const newItem = itemTemplate.content.cloneNode(true); // true๋ ๋ชจ๋ ์์ ์์๋ฅผ ํฌํจํ ๊น์ ๋ณต์ ๋ฅผ ์๋ฏธํด
// ์๋ก์ด ํญ๋ชฉ์ ๋ฆฌ์คํธ์ ์ถ๊ฐํ๊ธฐ
itemList.appendChild(newItem);
});
5.2 ์์: ์ํ ์นด๋ ์์ฑ
<template>
์ JavaScript๋ฅผ ์ฌ์ฉํด์, ์๋ฅผ ๋ค์ด ์ํ ์นด๋๋ฅผ ํฌํจํ ์์ ๋ชฉ๋ก์ ์์ฑํ ์ ์์ด.
<template> ํ๊ทธ ์ฌ์ฉ ์์:
<h1>์ํ ๋ชฉ๋ก</h1>
<div id="productList"></div>
<template id="productTemplate">
<div class="item">
<h2 class="title"></h2>
<p class="description"></p>
<span class="price"></span>
</div>
</template>
// ์คํฌ๋ฆฝํธ ์คํ ์ ์ DOM์ด ์์ ํ ๋ก๋๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆผ
document.addEventListener('DOMContentLoaded', () => {
// ์ํ์ ๋ํ ๋ฐ์ดํฐ ๋ฐฐ์ด
const products = [
{ title: '์ํ 1', description: '์ํ 1 ์ค๋ช
', price: '100 ๋ฌ๋ฌ' },
{ title: '์ํ 2', description: '์ํ 2 ์ค๋ช
', price: '200 ๋ฌ๋ฌ' },
{ title: '์ํ 3', description: '์ํ 3 ์ค๋ช
', price: '300 ๋ฌ๋ฌ' },
];
// DOM ์์์ ๋ํ ์ฐธ์กฐ ์ป๊ธฐ
const productList = document.getElementById('productList'); // ์ ํ ๋ฆฌ์คํธ ์ปจํ
์ด๋
const template = document.getElementById('productTemplate').content; // ์ ํ ์์ ํ
ํ๋ฆฟ
// ์ ํ ๋ฐฐ์ด์ ๋ฐ๋ณตํ๋ฉฐ ๊ฐ๊ฐ์ ์์๋ฅผ ๋ฆฌ์คํธ์ ์์ฑ
products.forEach(product => {
// ์ ํ ํ
ํ๋ฆฟ ๋ณต์ ํ๊ธฐ
const clone = document.importNode(template, true); // true - ๊น์ ๋ณต์
// ๋ณต์ ๋ ํ
ํ๋ฆฟ์ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ๊ธฐ
clone.querySelector('.title').textContent = product.title;
clone.querySelector('.description').textContent = product.description;
clone.querySelector('.price').textContent = product.price;
// ๋ฆฌ์คํธ์ ์ฑ์์ง ํ
ํ๋ฆฟ ์ถ๊ฐํ๊ธฐ
productList.appendChild(clone);
});
});
์ค๋ช
<template>
ํ๊ทธ: ํ์ด์ง ๋ก๋ ์ ํ์๋์ง ์๋ HTML ์ฝ๋๋ฅผ ํฌํจํ๊ณ ์์ด.document.importNode(template, true)
๋ฉ์๋: ํ ํ๋ฆฟ ๋ด์ฉ์ ๋ณต์ ํด.querySelector
์textContent
๋ฉ์๋: ๋ฌธ์์ ์ฝ์ ํ๊ธฐ ์ ์ ๋ณต์ ๋ ํ ํ๋ฆฟ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ ๋ฐ ์ฌ์ฉ๋ผ.
5.3 <template> ํ๊ทธ์ ์ฅ์
์ฑ๋ฅ ํฅ์
ํ ํ๋ฆฟ์ ์ฌ์ฉํ๋ฉด ๋์ค์ ์ฌ์ฉํ HTML ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ํ ์ ์์ด. ์ด๋ ํ์ด์ง ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ด, ์๋ํ๋ฉด ํ ํ๋ฆฟ์ ๋ด์ฉ์ด ๋ ๋๋ง๋์ง ์๊ณ ์ด๊ธฐ ํ์ด์ง ๋ก๋์ ์ํฅ์ ๋ฏธ์น์ง ์๊ธฐ ๋๋ฌธ์ด์ผ.
๋์ ์ปจํ ์ธ ๊ฐ์ํ
ํ ํ๋ฆฟ์ ๋์ ์ปจํ ์ธ ์์ฑ ๊ณผ์ ์ ๊ฐ์ํํด. JavaScript๋ฅผ ์ฌ์ฉํด ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก HTML ์ฝ๋๋ฅผ ์์ฑํ๋ ๋์ , ๋ฏธ๋ฆฌ ์ค๋น๋ ํ ํ๋ฆฟ์ ๋ณต์ ํ๊ณ ์์ ํ ์ ์์ด.
ํธ๋ฆฌ์ฑ๊ณผ ๊ฐ๋ ์ฑ
ํ ํ๋ฆฟ์ ์ฝ๋๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ๊ตฌ์กฐํ๋๊ฒ ๋ง๋ค์ด์ค, ๋ฐ๋ณต๋๋ ์์์ฉ HTML ์ฝ๋๋ฅผ JavaScript์ ํฌํจ์ํค์ง ์๊ณ ๋ณ๋๋ก ๋ณด๊ดํ ์ ์๊ธฐ ๋๋ฌธ์ด์ผ.
์กฐ๊ฑด๋ถ ์ปจํ ์ธ ํ์ ์์:
<h1>์์
๊ฒฐ๊ณผ</h1>
<div id="messageContainer"></div>
<template id="messageTemplate">
<div class="message">
<p class="content"></p>
</div>
</template>
document.addEventListener('DOMContentLoaded', () => {
// DOM ์์์ ๋ํ ์ฐธ์กฐ ์ป๊ธฐ
const messageContainer = document.getElementById('messageContainer'); // ๋ฉ์์ง ์ปจํ
์ด๋
const template = document.getElementById('messageTemplate').content; // ๋ฉ์์ง ํ
ํ๋ฆฟ
// ๋ฉ์์ง๋ฅผ ํ์ํ๊ธฐ ์ํ ํจ์
function showMessage(type, text) {
// ๋ฉ์์ง ํ
ํ๋ฆฟ ๋ณต์ ํ๊ธฐ
const clone = document.importNode(template, true); // true - ๊น์ ๋ณต์
// ๋ณต์ ๋ณธ ๋ด๋ถ์ ๋ฉ์์ง ์์์ ๋ํ ์ฐธ์กฐ ์ป๊ธฐ
const messageDiv = clone.querySelector('.message');
// ๋ฉ์์ง ์ ํ์ ํด๋นํ๋ ํด๋์ค ์ถ๊ฐํ๊ธฐ (success ๋๋ error)
messageDiv.classList.add(type);
// ๋ฉ์์ง ํ
์คํธ ์ค์ ํ๊ธฐ
messageDiv.querySelector('.content').textContent = text;
// ๋ฉ์์ง๋ฅผ ์ปจํ
์ด๋์ ์ถ๊ฐํ๊ธฐ
messageContainer.appendChild(clone);
}
// ๋ฉ์์ง๋ฅผ ํ์ํ๊ธฐ ์ํด ํจ์ ํธ์ถํ๊ธฐ
showMessage('success', '์์
์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์์ต๋๋ค!');
showMessage('error', '์์
์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.');
});
์ค๋ช :
showMessage()
ํจ์: ๋ฉ์์ง ์ ํ (์ฑ๊ณต ๋๋ ์ค๋ฅ)๊ณผ ๋ฉ์์ง ํ ์คํธ๋ฅผ ์๋ฝํ๊ณ , ํ ํ๋ฆฟ์ ๋ณต์ ํ์ฌ ๋ฉ์์ง ์ปจํ ์ด๋์ ์ถ๊ฐํด..success
๋ฐ.error
ํด๋์ค: ๋ฉ์์ง ์ ํ์ ๋ฐ๋ผ ๋ณต์ ๋ ํ ํ๋ฆฟ์ ์คํ์ผ๋ง์ ์ํด ์ ์ฉ๋ผ.
GO TO FULL VERSION