MENU

【JavaScript】documentオブジェクトを解説|Webの基礎

JavaScriptのdocumentオブジェクトによるHTML要素の取得・操作解説|Webの基礎
目次

はじめに

前回の記事では、alertconfirmpromptを使ったダイアログボックスの表示方法について解説しました。

今回は、windowオブジェクトの子オブジェクトであるdocumentを使って、HTML要素を取得・操作する方法を解説します。ボタンをクリックしたらテキストを変える、入力内容をリストに追加するなど、動的なWebページを作るうえで欠かせない基本機能です。要素の取得方法から、テキスト・属性・スタイルの操作、要素の作成・追加・削除まで、実務でよく使う書き方を中心に紹介します。

documentオブジェクトとは?

以前の記事で解説した通り、documentwindowオブジェクトの子オブジェクトの1つで、表示中のHTML文書(DOM: Document Object Model)そのものを表します。

ブラウザはHTMLを読み込むと、タグの親子関係を「ツリー構造」に変換してメモリ上に保持します。これがDOMです。documentオブジェクトはこのDOMツリーの入り口にあたり、documentのメソッド・プロパティを使うことで、ツリー内の要素を取得したり、内容を書き換えたり、新しい要素を追加したりできます。

console.log(document.title);   // ページのタイトル(<title>タグの内容)
console.log(document.URL);     // 現在のページのURL

window.documentのwindow.は省略可能です。以降のサンプルでも単にdocumentと記述します。

要素を取得する方法

HTML要素を操作するには、まず対象の要素を取得する必要があります。代表的な取得方法は次の4つです。

メソッド取得対象戻り値
getElementById()指定したid属性の要素要素(1つ)
querySelector()CSSセレクタに最初に一致した要素要素(1つ)
querySelectorAll()CSSセレクタに一致するすべての要素NodeList
getElementsByClassName()指定したclass属性を持つ要素すべてHTMLCollection
<p id="msg">こんにちは</p>
<p class="item">りんご</p>
<p class="item">みかん</p>
const msg = document.getElementById("msg");
console.log(msg.textContent); // こんにちは

const first = document.querySelector(".item");
console.log(first.textContent); // りんご

const items = document.querySelectorAll(".item");
items.forEach((el) => console.log(el.textContent)); // りんご → みかん

querySelectorquerySelectorAllはCSSセレクタ(#id.classtagなど)がそのまま使えるため、CSSの知識をそのまま活かせて汎用性が高い方法です。特別な理由がなければ、この2つを使っておけばほぼ困りません。

NodeListHTMLCollectionはどちらも「要素の集まり」ですが、forEachが使えるのはNodeListだけです。HTMLCollectionをループしたい場合はArray.from()で配列に変換するか、for文(インデックス指定)を使う必要があります。

テキスト・HTMLの中身を操作する

取得した要素の中身を書き換える方法は、主に次の3種類があります。

プロパティ内容HTMLタグの解釈
textContentテキストの取得・設定されない(そのまま文字列として表示)
innerHTMLHTMLの取得・設定される(タグとして描画される)
innerText画面に表示されている見た目通りのテキストされない
const msg = document.getElementById("msg");

msg.textContent = "更新しました";           // テキストとして反映
msg.innerHTML = "<strong>更新しました</strong>"; // <strong>タグが効いた状態で反映

innerHTMLにユーザーが入力した文字列をそのまま代入すると、悪意のあるスクリプトを埋め込まれるXSS(クロスサイトスクリプティング)のリスクがあります。ユーザー入力を表示する場合は、HTMLタグを解釈しないtextContentを使うのが安全です。

属性・クラスを操作する

idhrefsrcなどのHTML属性は、getAttributesetAttributeで読み書きできます。

const link = document.querySelector("a");

console.log(link.getAttribute("href")); // 現在のリンク先を取得
link.setAttribute("href", "https://www.kurumico.com/"); // リンク先を変更
link.removeAttribute("target"); // 属性を削除

class属性の操作には、専用のclassListを使うと便利です。

const box = document.querySelector(".box");

box.classList.add("active");      // クラスを追加
box.classList.remove("hidden");   // クラスを削除
box.classList.toggle("selected"); // あれば削除、なければ追加
box.classList.contains("active"); // クラスの有無をtrue/falseで判定

CSSで見た目を制御している場合、スタイルを直接書き換えるよりclassListでクラスの付け外しをする方が、デザインとロジックを分離できて管理しやすくなります。

スタイルを操作する

要素のstyleプロパティを使うと、インラインスタイルを直接指定できます。CSSのプロパティ名はハイフン区切り(background-color)ですが、JavaScriptではキャメルケース(backgroundColor)で書きます。

const box = document.querySelector(".box");

box.style.backgroundColor = "yellow";
box.style.fontSize = "20px";
box.style.display = "none"; // 非表示にする

複数のスタイルをまとめて変更したい場合や、状態ごとにデザインを切り替えたい場合は、前述のclassListであらかじめCSSで定義したクラスを付け外しする方法がおすすめです。JavaScript側にスタイルの値を書かずに済み、デザイン変更もCSSファイル側で完結します。

要素を作成・追加・削除する

既存の要素を書き換えるだけでなく、新しい要素を作ってページに追加することもできます。

const ul = document.querySelector("ul");

const li = document.createElement("li"); // 新しい<li>要素を作成
li.textContent = "追加された項目";

ul.appendChild(li); // ul の最後の子要素として追加

不要になった要素はremove()で削除できます。

const target = document.querySelector(".item");
target.remove();
メソッド内容
document.createElement(タグ名)新しい要素を作成する(この時点ではまだ画面に表示されない)
親要素.appendChild(要素)親要素の最後の子要素として追加する
要素.remove()要素自体をDOMから削除する

実務サンプル(入力内容をリストに追加する)

入力欄に文字を入力し、ボタンを押すとリストに項目が追加され、各項目に削除ボタンが付くサンプルです。

HTML

<input type="text" id="itemInput" placeholder="項目を入力">
<button id="addBtn">追加</button>
<ul id="itemList"></ul>

JavaScript(main.js)

const input = document.getElementById("itemInput");
const addBtn = document.getElementById("addBtn");
const list = document.getElementById("itemList");

addBtn.addEventListener("click", () => {
    const value = input.value.trim();

    if (value === "") {
        return;
    }

    const li = document.createElement("li");
    li.textContent = value;

    const delBtn = document.createElement("button");
    delBtn.textContent = "削除";
    delBtn.addEventListener("click", () => {
        li.remove();
    });

    li.appendChild(delBtn);
    list.appendChild(li);

    input.value = "";
});

createElement<li>と削除用の<button>を作り、appendChildで組み立ててからリストに追加しています。削除ボタンには、押されたときに自分自身(li)をremove()するイベントを登録することで、項目ごとの削除処理を実現しています。

よくある質問・エラー対処

Q. getElementByIdなどがnullを返す、または「Cannot read properties of null」エラーになる

<script>タグがHTMLの要素より先に読み込まれ、対象の要素がまだDOMに存在しないタイミングで実行された場合に起きます。JS-01で解説した通り、<script>タグを</body>の直前に置くか、defer属性を付けて読み込むことで回避できます。

Q. innerHTMLtextContentはどちらを使えばよいか

→ HTMLタグを含んだ内容を反映したい場合のみinnerHTMLを使い、それ以外(特にユーザー入力を表示する場合)はtextContentを使うのが基本です。innerHTMLはXSSのリスクがあるため、安全性を優先するなら極力textContentを使いましょう。

Q. querySelectorAllで取得した要素に対して配列のメソッド(mapなど)が使えない

querySelectorAllの戻り値はNodeListで、forEachは使えますがmapfilterなどの配列メソッドは持っていません。使いたい場合はArray.from(要素)または[...要素]で配列に変換してから使用してください。

おわりに(まとめ)

まとめ

documentオブジェクトを使うと、HTML要素の取得から内容・属性・スタイルの変更、要素の作成や削除まで、ページを動的に操作できます。

  • ✅ 要素の取得にはgetElementByIdやquerySelector/querySelectorAllを使う
  • ✅ 中身の書き換えはtextContent(安全)とinnerHTML(HTML解釈・XSS注意)を使い分ける
  • ✅ 属性の操作はgetAttribute/setAttribute、クラスの操作はclassListが便利
  • ✅ スタイルはstyleプロパティで直接指定できるが、多用する場合はclassListとCSSの併用がおすすめ
  • ✅ createElement・appendChild・remove()で要素の作成・追加・削除ができる

まずはgetElementByIdやquerySelectorでの要素取得と、textContentでの書き換えから慣れていくのがおすすめです。

次回は、documentと組み合わせてよく使うイベント処理(クリックやフォーム送信への反応)について解説予定です。

この記事が、少しでも誰かのお役に立てれば幸いです。

関連記事

当サイトの記事で使用したVBAなどのサンプルをDLできます

この記事のサンプルはありません!

ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!


【CSS】テキスト関連プロパティについて基本解説|Webの基礎


よかったらシェアしてね!
  • URLをコピーしました!
目次