Day16 前半のゴール
Day16 では、いよいよ「HTMLをあとから増やす」世界に入ります。
これまでの document.getElementById / textContent は「既にある要素をいじる」だけでしたが、
createElement / appendChild を使うと「新しい要素を自分で生み出して、ページに追加」できます。
前半のゴールはこの2つです。
Day16 前半でつかみたい感覚
createElement=「新しいDOM要素を“工場”で作る」
appendChild=「作った要素を“親要素の子どもとして”画面に参加させる」
この2つを理解すると、
「最初は空っぽの領域に、JavaScriptでどんどん要素を増やす」
という、Webアプリらしい動きが一気に広がります。
DOMを「木」としてイメージし直す
既存の要素をいじるだけから「枝を増やす」へ
DOM は「木構造」として表現される、と前に話しました。
今までは、その木の「葉っぱの文字を変える」ことをしていました。
<p id="message">こんにちは</p>
これを JavaScript で書き換えるのは、
「既にある枝の葉っぱを書き換える」イメージです。
const messageElement = document.getElementById("message");
messageElement.textContent = "こんばんは";
JavaScriptcreateElement / appendChild を使うと、
「新しい枝(要素)を生やして、木にくっつける」ことができます。
createElement とは何か
「タグ名を指定して、新しい要素オブジェクトを作る」
createElement は、document に対してこうお願いする関数です。
「指定したタグ名の要素を、新しく1個作ってください」
const newParagraph = document.createElement("p");
JavaScriptこれで、まだどこにも表示されていない
<p> 要素が1つ、メモリ上に生まれます。
この時点では、
画面には何も変化がありません。
「工場で部品を作っただけ」で、
「まだ組み立てていない」状態です。
作った要素に中身をセットする
作った要素は、他の要素と同じように扱えます。
newParagraph.textContent = "これは新しく作られた段落です。";
JavaScriptここまでで、
<p> 要素を作る
その中の文字を textContent でセットする
というところまで進みました。
でも、まだ画面には出てきません。
「作っただけで、どこにも置いていない」からです。
appendChild とは何か
「親要素の“子ども”として、最後にくっつける」
appendChild は、
「この要素の子どもとして、別の要素を追加してください」
という命令です。
const container = document.getElementById("container");
container.appendChild(newParagraph);
JavaScriptこうすると、
container の「子ども」として newParagraph が追加され、
画面にも表示されるようになります。
流れとしては、
createElement で要素を作る
必要なら textContent や属性を設定する
appendChild で、どこかの親要素にぶら下げる
という三段階です。
createElement + appendChild の基本例
シンプルなサンプル:ボタンを押したら段落を1つ追加
まずは、最小構成の例を見てみます。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Day16 DOM操作② 前半</title>
</head>
<body>
<h1>メモ追加サンプル</h1>
<button id="addButton">メモを追加</button>
<div id="memoContainer"></div>
<script>
const addButtonElement = document.getElementById("addButton");
const memoContainerElement = document.getElementById("memoContainer");
addButtonElement.addEventListener("click", () => {
const p = document.createElement("p");
p.textContent = "新しいメモです。";
memoContainerElement.appendChild(p);
});
</script>
</body>
</html>
動きとしては、
ボタンを押す
→ p 要素を新しく作る
→ textContent をセットする
→ memoContainer の子どもとして追加する
という流れです。
ここで大事なのは、
「createElement しただけでは画面に出ない」
「appendChild された瞬間に DOM ツリーに参加する」
という感覚です。
追加される場所をイメージする
appendChild は「子どもの一番最後」に追加する
appendChild は、
「その親要素の子どもリストの一番最後」に追加します。
例えば、HTML がこうだったとします。
<div id="list">
<p>1つ目</p>
<p>2つ目</p>
</div>
ここに appendChild すると、
const listElement = document.getElementById("list");
const p = document.createElement("p");
p.textContent = "3つ目";
listElement.appendChild(p);
JavaScript結果として、DOM はこうなります。
<div id="list">
<p>1つ目</p>
<p>2つ目</p>
<p>3つ目</p>
</div>
「どこに追加されるか」がイメージできると、
DOM操作が一気に分かりやすくなります。
createElement と textContent の安全な組み合わせ
ユーザー入力を新しい要素として追加する
少しだけ実用的な例を見てみます。
テキストボックスに入力した内容を、
新しい p 要素としてリストに追加するイメージです。
<input id="memoInput" type="text">
<button id="addButton">追加</button>
<div id="memoContainer"></div>
JavaScript はこう書けます。
const memoInputElement = document.getElementById("memoInput");
const addButtonElement = document.getElementById("addButton");
const memoContainerElement = document.getElementById("memoContainer");
addButtonElement.addEventListener("click", () => {
const text = memoInputElement.value;
if (text === "") {
return;
}
const p = document.createElement("p");
p.textContent = text;
memoContainerElement.appendChild(p);
memoInputElement.value = "";
});
JavaScriptここで重要なのは、
ユーザー入力を textContent に入れている点です。
textContent は「文字として扱う」ため、
ユーザーが <script>...</script> のような文字列を入れても、
それはただの文字として表示され、実行されません。
innerHTML を使ってしまうと、
それが「HTMLとして解釈」され、
XSS攻撃の入り口になってしまいます。
createElement + textContent + appendChild
という組み合わせは、
「新しい要素を安全に追加する」ための基本パターンです。
よくあるつまずきポイント
createElement しただけで「出てこない」
初心者がよくやるのが、
createElement だけ書いて満足してしまうパターンです。
const p = document.createElement("p");
p.textContent = "出てこない…";
JavaScriptこれだけでは、画面には何も出ません。
「作っただけで、どこにも置いていない」からです。
必ず、
どの親要素にぶら下げるかを決める
appendChild で追加する
というステップが必要です。
appendChild する親を間違える
例えば、
本当は <div id=”memoContainer”> に追加したいのに、
document.body に appendChild してしまうと、
意図しない場所に表示されます。
document.body.appendChild(p); // 画面の一番下に出てしまう
JavaScript「どの要素の子どもにするか」を
意識して設計することが大事です。
Day16 前半のミニサンプル
「ボタンを押すたびに番号付きのメモを追加する」
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Day16 DOM操作② 前半</title>
</head>
<body>
<h1>メモリスト</h1>
<button id="addButton">メモを追加</button>
<div id="memoContainer"></div>
<script>
const addButtonElement = document.getElementById("addButton");
const memoContainerElement = document.getElementById("memoContainer");
let count = 0;
addButtonElement.addEventListener("click", () => {
count += 1;
const p = document.createElement("p");
p.textContent = `メモ ${count} 件目です。`;
memoContainerElement.appendChild(p);
});
</script>
</body>
</html>
ここでは、
createElement で p 要素を作る
textContent で中身を設定する
appendChild で memoContainer に追加する
count 変数で「何件目か」を管理する
という流れが全部つながっています。
Day16 前半のまとめ
createElement は「新しい要素を作る工場」。
appendChild は「作った要素を、親要素の子どもとしてDOMツリーに参加させる」操作。
前半では、
DOMを「木」としてイメージし直す
createElement で要素を生成する流れ
appendChild でどこに追加されるかを理解する
createElement + textContent + appendChild の安全な組み合わせ
ユーザー入力を新しい要素として追加するイメージ
よくあるつまずき(作っただけで出ない/親を間違える)
までを押さえました。
後半では、
複数の要素を組み合わせたカード風UIを作ったり、
削除やクリアなどの操作も絡めながら、
「動的にDOMを組み立てる」感覚をさらに深めていきます。

