JavaScript 逆引き集 | 要素の生成

JavaScript JavaScript
スポンサーリンク

要素の生成の基本 — const n = document.createElement('div')

画面に新しい箱(要素)を追加したいときは document.createElement(tagName) を使います。作っただけでは表示されないので、「中身を設定 → 既存の親に追加」という流れで扱います。


基本の作り方と追加手順

<div id="app"></div>
<script>
  // 1) 要素を作る
  const n = document.createElement("div");

  // 2) 中身や見た目を設定
  n.textContent = "こんにちは";      // テキストを入れる
  n.className = "greeting";         // クラスを付ける
  n.setAttribute("data-id", "42");  // 属性を付ける

  // 3) 既存の親に追加(これで初めて画面に出る)
  document.getElementById("app").appendChild(n);
</script>
HTML
  • 作成: createElement("div") のようにタグ名を渡します。
  • 設定: textContentclassNamesetAttributestyle などで見た目やデータをセット。
  • 追加: appendChild で親要素にぶら下げると表示されます。

よく使うテンプレート集

ラベル: ボタンを動的に作ってクリック処理を付ける

const btn = document.createElement("button");
btn.type = "button";
btn.textContent = "購入する";
btn.addEventListener("click", () => {
  console.log("購入処理を開始");
});
document.body.appendChild(btn);
JavaScript
  • ポイント: 作成→設定→イベント→追加の順で組み立てると分かりやすい。

ラベル: 複数の子要素をまとめて作る(カードUI)

function createCard({ title, body }) {
  const card = document.createElement("article");
  card.className = "card";

  const h = document.createElement("h3");
  h.textContent = title;

  const p = document.createElement("p");
  p.textContent = body;

  card.append(h, p); // 複数まとめて追加できる(appendChildでもOK)
  return card;
}

document.getElementById("app").appendChild(
  createCard({ title: "お知らせ", body: "明日は休館日です" })
);
JavaScript
  • ポイント: 小さな関数化で再利用しやすく。append は複数引数や文字列も扱えます。

ラベル: HTML文字列を入れる(XSS対策に注意)

const box = document.createElement("div");
box.className = "content";

// 安全な静的HTMLのみ innerHTML を使う
box.innerHTML = "<strong>重要:</strong> ルールを確認してください"; 
document.body.appendChild(box);
JavaScript
  • ポイント: innerHTML は便利ですが、動的な未検証文字列の代入は避ける。テキストは textContent を使う。

ラベル: リストを高速に作る(DocumentFragment)

const frag = document.createDocumentFragment();
for (let i = 1; i <= 5; i++) {
  const li = document.createElement("li");
  li.textContent = `Item ${i}`;
  frag.appendChild(li);
}
document.querySelector("ul#items").appendChild(frag);
JavaScript
  • ポイント: まとめて追加すると reflow を減らし、パフォーマンスに優しい。

ラベル: ある要素の直前に差し込む(insertBefore)

const ref = document.querySelector(".ref");
const badge = document.createElement("span");
badge.className = "badge";
badge.textContent = "NEW";

ref.parentNode.insertBefore(badge, ref); // refの直前に挿入
JavaScript
  • ポイント: 位置を細かく指定して挿入したいときに便利。

実務でのコツ

  • ラベル: クラス/属性/データの役割分担
    • クラス: 見た目や状態(.active, .error)
    • 属性: 既定動作(href, src, alt)
    • data-属性: 軽い識別や状態(data-id, data-status)
  • ラベル: テキストは textContent
    • HTMLを埋めたい特別な場合を除き、ユーザー入力の表示は textContent を使うと安全。
  • ラベル: まとめて作るときは Fragment
    • 大量追加は DocumentFragment → まとめて1回の appendChild が定石。
  • ラベル: スタイルはCSSで管理
    • JSで style を直接書きすぎない。クラス切り替え(classList)で見た目を制御。

ありがちなハマりポイントと対策

  • ラベル: 作ったのに表示されない
    • 原因: 親へ追加していない。
    • 対策: 最後に必ず appendChild(または append)で既存のDOMにぶら下げる。
  • ラベル: innerHTMLの乱用
    • 原因: 文字列連結で安全性や可読性が悪化。
    • 対策: 要素を作って組み立てる。動的テキストは textContent
  • ラベル: イベントが効かない
    • 原因: 作成後に addEventListener を付け忘れ。
    • 対策: コンポーネント関数内でイベント登録までを完結させる。
  • ラベル: パフォーマンス低下
    • 原因: ループで毎回DOMへ直接追加。
    • 対策: まず Fragment に溜めてから一括追加。

練習問題(手を動かして覚える)

<div id="app"></div>
<ul id="list"></ul>
<script>
  // 1) 見出し+ボタンを作って追加
  const title = document.createElement("h2");
  title.textContent = "メニュー";

  const addBtn = document.createElement("button");
  addBtn.type = "button";
  addBtn.textContent = "追加";

  document.getElementById("app").append(title, addBtn);

  // 2) クリックでリストに項目を追加(連番)
  let n = 0;
  const list = document.getElementById("list");
  addBtn.addEventListener("click", () => {
    n++;
    const li = document.createElement("li");
    li.textContent = `Item ${n}`;
    li.dataset.id = String(n); // data-* で識別子をセット
    list.appendChild(li);
  });

  // 3) 5件まとめて追加(Fragment)
  const frag = document.createDocumentFragment();
  for (let i = 1; i <= 5; i++) {
    const li = document.createElement("li");
    li.textContent = `Batch ${i}`;
    frag.appendChild(li);
  }
  list.appendChild(frag);
</script>
HTML

直感的な指針

  • 作る → 設定する → 追加する、の3ステップが基本。
  • テキストは textContent、見た目はクラス、識別は data- に。*
  • 大量追加は Fragment を使ってサクッと。
タイトルとURLをコピーしました