本文へスキップ
JavaScript 基礎 JavaScript createElement DOM

HTML要素を作成・追加・削除しよう

更新日:2026-08-02

JavaScriptからDOM要素を作ると、入力内容や取得したデータに応じて画面を更新できます。

今回は、フォームに入力した学習タスクを一覧へ追加し、不要になったタスクを削除します。文字列からHTMLを作るのではなく、要素を一つずつ安全に組み立てる手順を身に付けます。

今回使用するファイル構成

javascript-practice/
├── index.html
└── js/
    └── script.js

動的なDOM操作の基本

要素を作成して追加する

<ul id="task-list"></ul>
const taskList = document.querySelector('#task-list');
const item = document.createElement('li');

item.textContent = 'JavaScriptを復習する';
item.classList.add('task-item');
taskList.append(item);

createElement()で要素を作り、内容やクラスを設定してからappend()で追加します。

削除ボタンを含める

function createTaskItem(taskName) {
  const item = document.createElement('li');
  const text = document.createElement('span');
  const removeButton = document.createElement('button');

  text.textContent = taskName;
  removeButton.type = 'button';
  removeButton.textContent = '削除';
  removeButton.addEventListener('click', () => item.remove());

  item.append(text, removeButton);
  return item;
}

taskList.append(createTaskItem('DOM操作を練習する'));

remove()は対象要素をDOMから削除します。作成処理を関数にすると異なるデータで再利用できます。

innerHTMLとの使い分け

利用者が入力した値をinnerHTMLへ直接入れると、意図しないHTMLが実行される危険があります。文章として表示する値にはtextContentを使い、要素はcreateElement()で組み立てる方法を基本にします。

入力したタスクを追加する

フォームを用意する

index.htmlへ次の内容を記述します。

<h1>学習タスク</h1>

<form id="task-form">
  <label for="task-name">新しいタスク</label>
  <input id="task-name" type="text">
  <button type="submit">追加する</button>
</form>

<p id="task-error" aria-live="polite"></p>
<ul id="task-list"></ul>

追加処理を完成させる

const form = document.querySelector('#task-form');
const taskNameInput = document.querySelector('#task-name');
const taskError = document.querySelector('#task-error');
const taskList = document.querySelector('#task-list');

function createTaskItem(taskName) {
  const item = document.createElement('li');
  const text = document.createElement('span');
  const removeButton = document.createElement('button');

  text.textContent = taskName;
  removeButton.type = 'button';
  removeButton.textContent = '削除';
  removeButton.setAttribute('aria-label', `${taskName}を削除`);

  removeButton.addEventListener('click', () => {
    item.remove();
  });

  item.append(text, removeButton);
  return item;
}

form.addEventListener('submit', (event) => {
  event.preventDefault();

  const taskName = taskNameInput.value.trim();

  if (taskName === '') {
    taskError.textContent = 'タスクを入力してください。';
    taskNameInput.focus();
    return;
  }

  taskError.textContent = '';
  taskList.append(createTaskItem(taskName));
  form.reset();
  taskNameInput.focus();
});

関数はDOMへ直接追加せず、完成したli要素を返します。どこへ追加するかは呼び出し側が決めるため、同じ関数を別の一覧でも再利用しやすくなります。

form.reset()はフォーム部品を初期状態へ戻します。その後にfocus()を呼び、続けて次のタスクを入力できるようにしています。

DOMへ追加する位置を選ぶ

append()は末尾、prepend()は先頭へ追加します。

taskList.prepend(createTaskItem(taskName));

既存要素の前後へ追加するときはbefore()after()も使えます。どのメソッドを使うかは、一覧の並び順と画面の目的で決めます。

動作確認とエラー調査

  1. 文字を入力して追加できる
  2. 空文字と空白だけでは追加できない
  3. 複数件を追加してもそれぞれ削除できる
  4. 削除後も入力欄へ戻って操作できる

追加されない場合は、Consoleのエラー、HTMLのidscriptの読み込み位置を確認します。削除ボタンがフォーム内にある場合、type="button"がないと送信ボタンとして動く点にも注意してください。

まとめ

DOM要素は作成、設定、追加の順に組み立てます。削除処理も要素の近くで登録できます。次の記事では、配列のデータから複数要素を生成します。