基礎から学ぶJavaScript入門 90日コース | Webページを操作するDOM - Day 37:要素の追加

JavaScript 90日で身につけるJavaScript
スポンサーリンク
スポンサーリンク
  1. Day 37:要素の追加(前半)
  2. 要素の追加の全体像をイメージする
    1. 「HTMLを書き足す」のではなく「DOMに要素を生やす」
  3. createElement()で“新しい要素の赤ちゃん”を作る
    1. createElement()とは何か
    2. 作った要素に中身を入れる
  4. append()とappendChild()で“親子関係”を作る
    1. 親要素に子要素を追加するという考え方
    2. appendChild()の基本
    3. append()の基本
  5. 実践:リスト追加機能を作る
    1. 目標イメージ
    2. HTML構造を用意する
    3. JavaScriptで「追加の流れ」を作る
    4. 完成コード(コメント付き)
  6. append()とappendChild()の違いを軽く押さえておく
    1. appendChild()の特徴
    2. append()の特徴
  7. セキュリティ・安全性の観点からの補足
  8. Day 37 前半 練習用テンプレート
  9. Day 37 前半のまとめ
  10. Day 37:要素の追加(後半)
  11. 要素追加を“1つの機能”として設計する
    1. ただ書くコードから、“機能としてまとめる”コードへ
  12. createElementで“部品を作る関数”を用意する
    1. リスト項目を作る関数を定義する
  13. appendChildで“リストに追加する処理”を関数にする
    1. 追加処理も関数にまとめる
  14. 実践:関数を使ってリスト追加機能を整理する
    1. 完成コード(関数で整理したバージョン)
    2. 深掘りポイント
  15. appendとappendChildを“意図で使い分ける”
    1. appendを使ったバリエーション
  16. 少し発展:削除ボタン付きのリスト項目を作る
    1. 「追加したものを消せる」ことで、機能として完結する
    2. 削除ボタン付きの<li>を作る関数
    3. 削除機能付きリスト追加の完成コード
    4. 深掘りポイント
  17. セキュリティ・安全性の観点からの補足
  18. Day 37 後半 練習用テンプレート
  19. Day 37 後半のまとめ

Day 37:要素の追加(前半)

「createElementで“新しいタグ”を作り、appendでページに生やす」

Day 37前半では、DOM操作の中でもとてもワクワクする 「要素の追加」 を扱います。 これまでの学習では「既にある要素を取得して操作する」ことが中心でしたが、 ここからは 「新しく要素を作って、ページに追加する」 ことができるようになります。

キーワードは次の3つです。

  • createElement()
  • append()
  • appendChild()

実践テーマは 「リスト追加機能」。 ボタンを押すと、リストに項目が増えていく仕組みを、ステップバイステップで解説していきます。

要素の追加の全体像をイメージする

「HTMLを書き足す」のではなく「DOMに要素を生やす」

ふだんHTMLを書くときは、

<li>りんご</li>
<li>みかん</li>

のように、あらかじめタグを記述します。

しかし、JavaScriptで要素を追加するときは、

「JavaScriptのコードの中で、新しい要素を作り、DOMツリーに追加する」

という流れになります。

このときに使うのが、

  • document.createElement('タグ名')
  • 親要素.append(子要素)
  • 親要素.appendChild(子要素)

です。

createElement()で“新しい要素の赤ちゃん”を作る

createElement()とは何か

createElement() は、

「指定したタグ名の要素を、新しく1つ作る」

ためのメソッドです。

基本形は次の通りです。

const newElement = document.createElement('タグ名');
JavaScript

例えば、リスト項目(<li>)を作りたいなら、

const liElement = document.createElement('li');
JavaScript

と書きます。

この時点では、まだページには表示されません。 「DOMの世界に、まだ親のいない要素が1つ生まれた状態」 だとイメージすると分かりやすいです。

作った要素に中身を入れる

新しく作った要素には、テキストや属性を設定できます。

const liElement = document.createElement('li'); // <li>要素を作る
liElement.textContent = 'りんご';              // 中身のテキストを設定する
JavaScript

これで、 「中身が『りんご』の<li>要素」 が準備できました。

あとは、この要素を「どこにぶら下げるか」を決めて追加していきます。

append()とappendChild()で“親子関係”を作る

親要素に子要素を追加するという考え方

DOMは「木構造(ツリー)」になっていて、

  • <ul> が「親」
  • その中の <li> が「子」

というように、要素同士が親子関係を持っています。

新しく作った要素をページに表示するには、

「どの親要素の子として追加するか」

を決めて、 その親要素に対して append()appendChild() を呼び出します。

appendChild()の基本

appendChild() は、

「指定した子要素を、親要素の一番最後の子として追加する」

メソッドです。

基本形は次の通りです。

親要素.appendChild(子要素);
JavaScript

例えば、<ul><li> を追加するなら、

const ulElement = document.getElementById('myList'); // 親の<ul>を取得
const liElement = document.createElement('li');      // 子の<li>を作る
liElement.textContent = 'りんご';                   // 中身を設定

ulElement.appendChild(liElement);                    // 親に子を追加
JavaScript

これで、ページ上の <ul> の末尾に、新しい <li> が1つ追加されます。

append()の基本

append() は、appendChild() より少し柔軟なメソッドで、

「子要素やテキストを、親要素の末尾に追加できる」

という特徴があります。

基本形は次の通りです。

親要素.append(子要素);
親要素.append('テキスト');
JavaScript

例えば、

ulElement.append(liElement);       // 要素を追加
ulElement.append('テキスト');      // テキストノードを追加
JavaScript

といった使い方ができます。

初心者の方にとっては、

  • 「要素を追加する」 → appendChild()
  • 「要素もテキストもまとめて追加したい」 → append()

というイメージで覚えておくと良いです。

実践:リスト追加機能を作る

目標イメージ

  • 最初は空のリスト、または少しだけ項目がある。
  • テキスト入力欄に「りんご」「みかん」などを入力する。
  • 「追加」ボタンを押すと、その文字列を持つ <li> がリストに追加される。

これを、createElement()appendChild() を使って実装していきます。

HTML構造を用意する

まずは、リストと入力欄、ボタンを用意します。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Day 37 前半:リスト追加機能</title>
</head>
<body>
  <h1>リスト追加機能</h1>

  <!-- ▼ リスト(最初は空でもOK) -->
  <ul id="itemList">
    <!-- ここに<li>が追加されていきます -->
  </ul>

  <!-- ▼ 項目名入力フォーム -->
  <form id="itemForm">
    <label for="itemInput">項目名:</label>
    <input type="text" id="itemInput" placeholder="追加したい項目名を入力してください">
    <button type="submit">追加</button>
  </form>

  <!-- ▼ メッセージ表示エリア -->
  <p id="message"></p>

  <script>
    // ここにJavaScriptを書いていきます
  </script>
</body>
</html>

JavaScriptで「追加の流れ」を作る

次に、JavaScriptで

  1. フォーム送信を受け取る
  2. 入力値を取り出す
  3. <li> 要素を作る
  4. リストに追加する

という流れを作ります。

// ▼ 親の<ul>要素を取得します
const itemListElement = document.getElementById('itemList');

// ▼ フォーム要素を取得します
const itemFormElement = document.getElementById('itemForm');

// ▼ 入力欄の<input>要素を取得します
const itemInputElement = document.getElementById('itemInput');

// ▼ メッセージ表示用の<p>要素を取得します
const messageElement = document.getElementById('message');

// ▼ フォームが送信されたときの処理
itemFormElement.addEventListener('submit', function (event) {
  // 標準の送信動作(ページリロードなど)を止めます
  event.preventDefault();

  // 入力欄に現在入っている値を取得します
  const enteredItem = itemInputElement.value;

  // 前後の空白を取り除いた文字列を作ります
  const trimmedItem = enteredItem.trim();

  // 空チェック
  if (trimmedItem === '') {
    messageElement.textContent = '項目名が空です。文字を入力してください。';
    return; // ここで処理を終了します
  }

  // ▼ 新しい<li>要素を作ります
  const liElement = document.createElement('li');

  // ▼ li要素の中身のテキストを設定します
  liElement.textContent = trimmedItem;

  // ▼ 親の<ul>に<li>を追加します
  itemListElement.appendChild(liElement);

  // ▼ メッセージを更新します
  messageElement.textContent = `「${trimmedItem}」をリストに追加しました。`;

  // ▼ 入力欄をリセットします
  itemInputElement.value = '';
});
JavaScript

完成コード(コメント付き)

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Day 37 前半:リスト追加機能</title>
</head>
<body>
  <h1>リスト追加機能</h1>

  <!-- ▼ リスト -->
  <ul id="itemList">
    <!-- ここに<li>が追加されていきます -->
  </ul>

  <!-- ▼ 項目名入力フォーム -->
  <form id="itemForm">
    <label for="itemInput">項目名:</label>
    <input type="text" id="itemInput" placeholder="追加したい項目名を入力してください">
    <button type="submit">追加</button>
  </form>

  <!-- ▼ メッセージ表示エリア -->
  <p id="message"></p>

  <script>
    // ▼ 親の<ul>要素を取得します
    const itemListElement = document.getElementById('itemList');

    // ▼ フォーム要素を取得します
    const itemFormElement = document.getElementById('itemForm');

    // ▼ 入力欄の<input>要素を取得します
    const itemInputElement = document.getElementById('itemInput');

    // ▼ メッセージ表示用の<p>要素を取得します
    const messageElement = document.getElementById('message');

    // ▼ フォームが送信されたときの処理
    itemFormElement.addEventListener('submit', function (event) {
      // 標準の送信動作(ページリロードなど)を止めます
      event.preventDefault();

      // 入力欄に現在入っている値を取得します
      const enteredItem = itemInputElement.value;

      // 前後の空白を取り除いた文字列を作ります
      const trimmedItem = enteredItem.trim();

      // 空チェック
      if (trimmedItem === '') {
        messageElement.textContent = '項目名が空です。文字を入力してください。';
        return; // ここで処理を終了します
      }

      // ▼ 新しい<li>要素を作ります
      const liElement = document.createElement('li');

      // ▼ li要素の中身のテキストを設定します
      liElement.textContent = trimmedItem;

      // ▼ 親の<ul>に<li>を追加します
      itemListElement.appendChild(liElement);

      // ▼ メッセージを更新します
      messageElement.textContent = `「${trimmedItem}」をリストに追加しました。`;

      // ▼ 入力欄をリセットします
      itemInputElement.value = '';
    });
  </script>
</body>
</html>

append()とappendChild()の違いを軽く押さえておく

appendChild()の特徴

  • 引数に「1つのノード(要素)」しか取れません。
  • テキストを直接渡すことはできません(テキストノードを作れば可能ですが、少し手間)。
parent.appendChild(childElement); // OK
parent.appendChild('テキスト');   // NG(エラー)
JavaScript

append()の特徴

  • 要素もテキストも渡せます。
  • 複数の引数を渡すこともできます。
parent.append(childElement);          // OK
parent.append('テキスト');           // OK
parent.append(childElement, 'テキスト'); // OK
JavaScript

初心者の段階では、

「まずはappendChildで“要素を追加する感覚”を身につける」

→ 慣れてきたら append() も使ってみる、 という順番で覚えていくとスムーズです。

セキュリティ・安全性の観点からの補足

リスト追加機能では、ユーザーが入力した文字列をそのまま画面に表示します。 このとき、

  • textContent を使っている
  • innerHTML を使っていない

という点が重要です。

liElement.textContent = trimmedItem;
JavaScript

とすることで、

  • 入力された文字列がHTMLとして解釈されない
  • <script> などが入力されても、そのまま「文字」として表示される

ため、XSS(クロスサイトスクリプティング)のような攻撃を防ぐ一歩になります。

フォーム+DOM操作の組み合わせは、 セキュリティ的に重要な領域なので、

「ユーザー入力を画面に出すときは、基本的にtextContentを使う」

という習慣を持っておくと安全です。

Day 37 前半 練習用テンプレート

最後に、今日の内容をまとめて練習できるテンプレートを紹介します。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Day 37 前半:要素の追加 練習テンプレート</title>
</head>
<body>
  <h1>Day 37 前半:要素の追加 練習</h1>

  <section>
    <h2>リスト追加機能</h2>

    <ul id="itemList">
      <!-- ここに<li>が追加されていきます -->
    </ul>

    <form id="itemForm">
      <label for="itemInput">項目名:</label>
      <input type="text" id="itemInput" placeholder="追加したい項目名を入力してください">
      <button type="submit">追加</button>
    </form>

    <p id="message"></p>
  </section>

  <script>
    console.log('--- 要素の追加 練習開始 ---');

    const itemListElement = document.getElementById('itemList');
    const itemFormElement = document.getElementById('itemForm');
    const itemInputElement = document.getElementById('itemInput');
    const messageElement = document.getElementById('message');

    itemFormElement.addEventListener('submit', function (event) {
      event.preventDefault();

      const enteredItem = itemInputElement.value;
      const trimmedItem = enteredItem.trim();

      messageElement.textContent = '';

      if (trimmedItem === '') {
        messageElement.textContent = '項目名が空です。文字を入力してください。';
        return;
      }

      const liElement = document.createElement('li');
      liElement.textContent = trimmedItem;

      itemListElement.appendChild(liElement);

      messageElement.textContent = `「${trimmedItem}」をリストに追加しました。`;

      itemInputElement.value = '';

      console.log('リストに追加:', trimmedItem);
    });

    console.log('--- 要素の追加 練習テンプレートの準備が完了しました ---');
  </script>
</body>
</html>

Day 37 前半のまとめ

Day 37前半では、

  • createElement() で「新しい要素の赤ちゃん」を作り、 その中身(textContent など)を設定する流れを学んだこと。
  • appendChild()append() を使って、 親要素に子要素を追加し、DOMツリーに参加させる感覚を身につけたこと。
  • フォーム入力+要素追加を組み合わせて、 「リスト追加機能」という実用的なミニ機能を作ったこと。
  • ユーザー入力を画面に表示するときに、 textContent を使うことで安全性を高めるという視点を持ったこと。

を整理しました。

この「要素を作って追加する」スキルは、 TODOリスト、チャット画面、コメント欄、カード一覧など、 動的なUIを作るうえで欠かせない基礎になります。

今日のコードを何度か書き直しながら、

「どの親に、どんな子を、どんなタイミングで追加するか」

を意識して練習していくことで、 DOMを“自分の手で育てていく”感覚が、どんどん身についていきます。


Day 37:要素の追加(後半)

「createElement+appendで“使えるリスト追加機能”に育てていく」

Day 37後半では、前半で学んだ

  • createElement()
  • append()
  • appendChild()

を、もう一歩踏み込んで「実際に使えるリスト追加機能」に育てていきます。 単に「追加できる」だけでなく、

  • コードの見通しをよくする
  • 再利用しやすい形にする
  • セキュリティと安全性を意識する

という視点で、要素追加を設計していきます。

要素追加を“1つの機能”として設計する

ただ書くコードから、“機能としてまとめる”コードへ

前半では、

  1. 入力値を取得する
  2. <li> を作る
  3. リストに追加する

という流れを、1つのイベント処理の中に書きました。

後半では、これを少し整理して、

  • 「リスト項目を作る処理」
  • 「リストに追加する処理」

を関数として分けて書くことで、 コードの見通しをよくしていきます。

createElementで“部品を作る関数”を用意する

リスト項目を作る関数を定義する

まず、「新しい <li> 要素を作る処理」を関数にまとめます。

function createListItem(text) {
  // 新しい<li>要素を作ります
  const liElement = document.createElement('li');

  // 中身のテキストを設定します
  liElement.textContent = text;

  // 作った<li>要素を返します
  return liElement;
}
JavaScript

この関数は、

「渡されたテキストを中身に持つ<li>要素を1つ作って返す」

という役割を持ちます。

こうしておくと、 イベント処理の中では

const liElement = createListItem(trimmedItem);
itemListElement.appendChild(liElement);
JavaScript

と書くだけで済み、 「何をしているか」が読みやすくなります。

appendChildで“リストに追加する処理”を関数にする

追加処理も関数にまとめる

次に、「リストに項目を追加する処理」も関数にしてみます。

function addItemToList(listElement, text) {
  // テキストが空なら何もしません
  const trimmedText = text.trim();
  if (trimmedText === '') {
    return;
  }

  // 新しい<li>要素を作ります
  const liElement = createListItem(trimmedText);

  // 親の<ul>に<li>を追加します
  listElement.appendChild(liElement);
}
JavaScript

この関数は、

「指定されたリスト(<ul>)に、指定されたテキストを持つ<li>を追加する」

という役割を持ちます。

イベント処理側では、

addItemToList(itemListElement, enteredItem);
JavaScript

と書くだけで、「リストに追加する」という意図がはっきり伝わります。

実践:関数を使ってリスト追加機能を整理する

完成コード(関数で整理したバージョン)

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Day 37 後半:関数で整理したリスト追加機能</title>
</head>
<body>
  <h1>リスト追加機能(関数で整理したバージョン)</h1>

  <!-- ▼ リスト -->
  <ul id="itemList">
    <!-- ここに<li>が追加されていきます -->
  </ul>

  <!-- ▼ 項目名入力フォーム -->
  <form id="itemForm">
    <label for="itemInput">項目名:</label>
    <input type="text" id="itemInput" placeholder="追加したい項目名を入力してください">
    <button type="submit">追加</button>
  </form>

  <!-- ▼ メッセージ表示エリア -->
  <p id="message"></p>

  <script>
    // ▼ 親の<ul>要素を取得します
    const itemListElement = document.getElementById('itemList');

    // ▼ フォーム要素を取得します
    const itemFormElement = document.getElementById('itemForm');

    // ▼ 入力欄の<input>要素を取得します
    const itemInputElement = document.getElementById('itemInput');

    // ▼ メッセージ表示用の<p>要素を取得します
    const messageElement = document.getElementById('message');

    // ▼ 新しい<li>要素を作る関数
    function createListItem(text) {
      const liElement = document.createElement('li');
      liElement.textContent = text; // textContentなので安全にテキストとして扱われます
      return liElement;
    }

    // ▼ リストに項目を追加する関数
    function addItemToList(listElement, text) {
      const trimmedText = text.trim();

      if (trimmedText === '') {
        messageElement.textContent = '項目名が空です。文字を入力してください。';
        return;
      }

      const liElement = createListItem(trimmedText);
      listElement.appendChild(liElement);

      messageElement.textContent = `「${trimmedText}」をリストに追加しました。`;
    }

    // ▼ フォームが送信されたときの処理
    itemFormElement.addEventListener('submit', function (event) {
      event.preventDefault(); // 標準の送信動作を止めます

      const enteredItem = itemInputElement.value;

      // メッセージを一度クリアします
      messageElement.textContent = '';

      // リストに項目を追加します
      addItemToList(itemListElement, enteredItem);

      // 入力欄をリセットします
      itemInputElement.value = '';
    });
  </script>
</body>
</html>

深掘りポイント

  • createListItemaddItemToList に分けることで、 「要素を作る処理」と「リストに追加する処理」が明確に分離されます。
  • イベント処理の中身が短くなり、 「フォーム送信 → リスト追加 → 入力欄リセット」という流れが読みやすくなります。

こうした「関数に分ける」というテクニックは、 コードが長くなってきたときに、 バグを減らし、保守性を高めるうえで非常に重要です。

appendとappendChildを“意図で使い分ける”

appendを使ったバリエーション

先ほどは appendChild() を使いましたが、 同じことを append() でも書けます。

function addItemToListWithAppend(listElement, text) {
  const trimmedText = text.trim();

  if (trimmedText === '') {
    messageElement.textContent = '項目名が空です。文字を入力してください。';
    return;
  }

  const liElement = document.createElement('li');
  liElement.textContent = trimmedText;

  // appendを使って<li>を追加します
  listElement.append(liElement);

  messageElement.textContent = `「${trimmedText}」をリストに追加しました。(append版)`;
}
JavaScript

append() は、

  • 要素もテキストも追加できる
  • 複数の引数も渡せる

という柔軟さがあります。

初心者の方にとっては、

  • 「DOMノード(要素)を追加する」 → appendChild()
  • 「テキストも含めて柔軟に追加したい」 → append()

という意図で使い分けると、 頭の中が整理しやすくなります。

少し発展:削除ボタン付きのリスト項目を作る

「追加したものを消せる」ことで、機能として完結する

リスト追加機能をもう一歩進めて、

「追加した項目を削除できる」

ようにすると、 TODOリストや買い物リストなどに近づいていきます。

ここでは、

  • <li> の中にテキストと削除ボタンを入れる
  • 削除ボタンをクリックしたら、その <li> を削除する

というミニ機能を作ってみます。

削除ボタン付きの<li>を作る関数

function createRemovableListItem(text) {
  const liElement = document.createElement('li');

  // テキスト部分の<span>を作ります
  const textSpan = document.createElement('span');
  textSpan.textContent = text;

  // 削除ボタンを作ります
  const deleteButton = document.createElement('button');
  deleteButton.textContent = '削除';

  // 削除ボタンがクリックされたときの処理
  deleteButton.addEventListener('click', function () {
    // 親の<li>をリストから削除します
    liElement.remove();
  });

  // liの中にテキストとボタンを追加します
  liElement.append(textSpan, deleteButton);

  return liElement;
}
JavaScript

ここでは、

  • <li> の中に <span><button> を追加
  • ボタンに click イベントを付けて、liElement.remove() で削除

という流れになっています。

削除機能付きリスト追加の完成コード

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Day 37 後半:削除機能付きリスト追加</title>
</head>
<body>
  <h1>削除機能付きリスト追加</h1>

  <ul id="itemList">
    <!-- ここに<li>が追加されていきます -->
  </ul>

  <form id="itemForm">
    <label for="itemInput">項目名:</label>
    <input type="text" id="itemInput" placeholder="追加したい項目名を入力してください">
    <button type="submit">追加</button>
  </form>

  <p id="message"></p>

  <script>
    const itemListElement = document.getElementById('itemList');
    const itemFormElement = document.getElementById('itemForm');
    const itemInputElement = document.getElementById('itemInput');
    const messageElement = document.getElementById('message');

    // ▼ 削除ボタン付き<li>を作る関数
    function createRemovableListItem(text) {
      const liElement = document.createElement('li');

      const textSpan = document.createElement('span');
      textSpan.textContent = text;

      const deleteButton = document.createElement('button');
      deleteButton.textContent = '削除';

      // 削除ボタンがクリックされたときの処理
      deleteButton.addEventListener('click', function () {
        liElement.remove(); // この<li>をリストから削除します
      });

      // liの中にテキストとボタンを追加します
      liElement.append(textSpan, deleteButton);

      return liElement;
    }

    // ▼ リストに項目を追加する関数
    function addRemovableItemToList(listElement, text) {
      const trimmedText = text.trim();

      if (trimmedText === '') {
        messageElement.textContent = '項目名が空です。文字を入力してください。';
        return;
      }

      const liElement = createRemovableListItem(trimmedText);
      listElement.appendChild(liElement);

      messageElement.textContent = `「${trimmedText}」をリストに追加しました。`;
    }

    itemFormElement.addEventListener('submit', function (event) {
      event.preventDefault();

      const enteredItem = itemInputElement.value;
      messageElement.textContent = '';

      addRemovableItemToList(itemListElement, enteredItem);

      itemInputElement.value = '';
    });
  </script>
</body>
</html>

深掘りポイント

  • createRemovableListItem の中で、 「1つの<li>の中に完結した機能(表示+削除)」を作っていること。
  • 削除ボタンのイベント処理が、 自分自身の親要素(liElement)を削除していること。

こうした「1つの要素に機能を閉じ込める」設計は、 コンポーネント的な考え方の入り口になります。

セキュリティ・安全性の観点からの補足

リスト追加機能では、ユーザー入力を画面に表示します。 ここで意識しておきたいポイントは次の通りです。

  • 入力値を表示するときは、textContent を使う
    • innerHTML を使うと、入力された文字列がHTMLとして解釈されてしまい、 <script> などが実行される危険があります。
  • 入力値は必ず trim() などで前処理し、 空文字やスペースだけの入力を防ぐ。

今回のコードでは、すべて

textSpan.textContent = text;
JavaScript

のように textContent を使っているため、 入力された文字列が安全に「ただのテキスト」として扱われます。

Day 37 後半 練習用テンプレート

最後に、今日の内容をまとめて練習できるテンプレートを紹介します。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Day 37 後半:要素の追加 総合練習テンプレート</title>
</head>
<body>
  <h1>Day 37 後半:要素の追加 総合練習</h1>

  <section>
    <h2>削除機能付きリスト追加</h2>

    <ul id="itemList">
      <!-- ここに<li>が追加されていきます -->
    </ul>

    <form id="itemForm">
      <label for="itemInput">項目名:</label>
      <input type="text" id="itemInput" placeholder="追加したい項目名を入力してください">
      <button type="submit">追加</button>
    </form>

    <p id="message"></p>
  </section>

  <script>
    console.log('--- 要素の追加 総合練習開始 ---');

    const itemListElement = document.getElementById('itemList');
    const itemFormElement = document.getElementById('itemForm');
    const itemInputElement = document.getElementById('itemInput');
    const messageElement = document.getElementById('message');

    function createRemovableListItem(text) {
      const liElement = document.createElement('li');

      const textSpan = document.createElement('span');
      textSpan.textContent = text;

      const deleteButton = document.createElement('button');
      deleteButton.textContent = '削除';

      deleteButton.addEventListener('click', function () {
        liElement.remove();
        console.log('項目を削除:', text);
      });

      liElement.append(textSpan, deleteButton);

      return liElement;
    }

    function addRemovableItemToList(listElement, text) {
      const trimmedText = text.trim();

      if (trimmedText === '') {
        messageElement.textContent = '項目名が空です。文字を入力してください。';
        return;
      }

      const liElement = createRemovableListItem(trimmedText);
      listElement.appendChild(liElement);

      messageElement.textContent = `「${trimmedText}」をリストに追加しました。`;
      console.log('項目を追加:', trimmedText);
    }

    itemFormElement.addEventListener('submit', function (event) {
      event.preventDefault();

      const enteredItem = itemInputElement.value;
      messageElement.textContent = '';

      addRemovableItemToList(itemListElement, enteredItem);

      itemInputElement.value = '';
    });

    console.log('--- 要素の追加 総合練習テンプレートの準備が完了しました ---');
  </script>
</body>
</html>

Day 37 後半のまとめ

Day 37後半では、

  • createElement() を「部品を作る関数」として使い、 要素生成の処理を整理したこと。
  • appendChild()append() を、 「親に子をぶら下げる」という意図で使い分ける感覚を持ったこと。
  • 削除ボタン付きのリスト項目を作り、 「追加したものを消せる」という完結したミニ機能を実装したこと。
  • ユーザー入力を画面に表示するときに、 textContent を使うことで安全性を確保するという視点を意識したこと。

を整理しました。

この「要素を作って、追加して、場合によっては削除する」という一連の流れは、 TODOリスト、チャット、コメント欄、カードUIなど、 動的なWebインターフェースの基礎になります。

今日のコードを何度か書き直しながら、

「どんな要素を、どんな構造で、どんなタイミングで追加・削除するか」

を自分なりに設計してみることで、 DOMを“自分の手で組み立てて動かす”力が、着実に育っていきます。

タイトルとURLをコピーしました