JavaScriptでHTML属性を自在に操作!追加・取得・削除・変更まで徹底解説

ウェブページの動的な挙動は、JavaScriptがHTML要素の属性を自在に操ることで実現されます。ユーザーのアクションに応じてボタンを無効にしたり、特定の情報を表示したりするなど、インタラクティブな体験を作り出す上で属性操作は欠かせない技術です。

この記事では、HTML属性の追加、取得、削除、変更といった基本的な操作から、実践的な活用例、そして効率的な要素の見つけ方まで、JavaScriptによる属性操作のすべてを徹底的に解説します。MDN Web Docsの情報を基に、具体的なコード例を交えながら分かりやすくご紹介します。

JavaScriptで属性を扱う基本

属性とは何か?なぜJavaScriptで操作するのか?

HTMLの属性は、要素に追加の情報を与えるためのものです。例えば、<a>タグのhref属性はリンク先を、<img>タグのsrc属性は画像ファイルのパスを、id属性は要素を一意に識別するための名前をそれぞれ指定します。

これらの属性は、単に静的な情報を記述するだけでなく、JavaScriptによって動的に操作されることで、ウェブページに生命を吹き込みます。例えば、フォームの入力値が条件を満たすまで送信ボタンをdisabled(無効)にしたり、ユーザーが選択したテーマに応じて要素のclass属性を切り替えて見た目を変更したりすることができます。

JavaScriptで属性を操作する最大の理由は、ユーザーの操作やアプリケーションの状態変化に応じて、HTMLの構造や表示、動作をリアルタイムで変更できる点にあります。これにより、リッチでインタラクティブなユーザー体験を提供することが可能になります。

この動的な制御こそが、最新のウェブアプリケーション開発においてJavaScriptが不可欠とされる所以です。ここから、その基盤となる具体的な属性操作メソッドを学んでいきましょう。

`setAttribute()`と`getAttribute()`の役割

HTML属性の操作において最も基本となるのが、`setAttribute()`と`getAttribute()`メソッドです。

`setAttribute(name, value)` は、指定された要素に属性を設定、または既存の属性値を変更するために使われます。属性が存在しない場合は新しく追加され、既に存在する場合はその値が更新されます。例えば、ボタン要素に`name`属性と`id`属性を追加したい場合に利用できます。

const button = document.createElement("button");
button.textContent = "Click Me";
document.body.appendChild(button);

button.setAttribute("name", "actionButton"); // name属性を追加
button.setAttribute("id", "myButtonId");   // id属性を追加または変更
console.log(button.outerHTML); // <button name="actionButton" id="myButtonId">Click Me</button>

一方、`getAttribute(name)` は、要素の指定された属性の値を取得します。対象の属性が存在しない場合は`null`を返します。

const myButton = document.getElementById("myButtonId");
const buttonName = myButton.getAttribute("name");
const buttonId = myButton.getAttribute("id");
const nonExistentAttr = myButton.getAttribute("data-info"); // 存在しない属性

console.log(`ボタンの名前: ${buttonName}`); // 出力: ボタンの名前: actionButton
console.log(`ボタンのID: ${buttonId}`);   // 出力: ボタンのID: myButtonId
console.log(`存在しない属性: ${nonExistentAttr}`); // 出力: 存在しない属性: null

これら二つのメソッドは、属性の読み書きの基本であり、多くの動的な処理の出発点となります。(参考情報より)

`removeAttribute()`と`attributes`プロパティ

属性を削除したい場合には、`removeAttribute(name)` メソッドを使用します。このメソッドは、要素から指定された属性を削除します。対象の属性が存在しない場合でもエラーは発生しないため、安心して利用できます。

const element = document.getElementById("myButtonId"); // 先ほど作成したボタンを仮定
element.setAttribute("class", "active"); // class属性を追加

console.log(element.outerHTML); // <button name="actionButton" id="myButtonId" class="active">Click Me</button>

element.removeAttribute("class"); // class属性を削除
element.removeAttribute("data-temp"); // 存在しない属性の削除(エラーなし)

console.log(element.outerHTML); // <button name="actionButton" id="myButtonId">Click Me</button>

また、要素に設定されている全ての属性を取得したい場合は、`element.attributes` プロパティを利用します。これは`NamedNodeMap`というオブジェクトを返し、配列ではないため直接配列メソッドは使えませんが、`for…of`ループを使って属性のペアを列挙することができます。

const paragraph = document.createElement("p");
paragraph.setAttribute("id", "myParagraph");
paragraph.setAttribute("data-user", "Alice");
paragraph.setAttribute("lang", "en");
document.body.appendChild(paragraph);

console.log("--- パラグラフの全属性 ---");
for (const attr of paragraph.attributes) {
  console.log(`${attr.name} -> ${attr.value}`);
}
// 出力例:
// id -> myParagraph
// data-user -> Alice
// lang -> en

`attributes`プロパティは、要素にどんな属性が設定されているかを確認したいデバッグ時や、特定のロジックを全ての属性に適用したい場合などに役立ちます。(参考情報より)

属性の追加・取得・削除・変更方法

`setAttribute()`による属性の追加と変更

`setAttribute()`メソッドは、既存の属性値を更新するだけでなく、新しい属性を要素に追加する際にも非常に便利です。このメソッドは二つの引数を取ります。

  • `name`: 設定したい属性の名前(文字列)。HTML要素に`setAttribute()`を使用する場合、属性名は自動的に小文字に変換されます。
  • `value`: 属性に割り当てる値(文字列)。文字列以外の値が指定された場合も、自動的に文字列に変換されます。

例えば、画像要素に`alt`属性が設定されていない場合に新しく追加したり、既存の`src`属性を別の画像パスに更新したりすることができます。

const image = document.getElementById("productImage"); // <img id="productImage" src="old.jpg"> を仮定

// 新しいalt属性を追加
image.setAttribute("alt", "美しい風景の写真");
console.log(image.outerHTML); // <img id="productImage" src="old.jpg" alt="美しい風景の写真">

// src属性を更新
image.setAttribute("src", "new_awesome_image.jpg");
console.log(image.outerHTML); // <img id="productImage" src="new_awesome_image.jpg" alt="美しい風景の写真">

注意点として、論理属性(例: `disabled`, `checked`)の場合、属性が存在すればtrueとみなされます。値を設定するには、空文字列 (`””`) または属性名を指定するのが一般的です。`null`を値として指定しても、属性が削除されるわけではなく、文字列“null”として設定されるため注意が必要です。属性を削除したい場合は`removeAttribute()`を使用してください。(参考情報より)

`getAttribute()`と`removeAttribute()`の実践

`getAttribute()`は、要素の特定の属性値をピンポイントで取得したい場合に利用します。例えば、フォームの入力フィールドの現在の`value`属性や、リンク要素の`href`属性の値を取得して、動的な処理に利用できます。

const link = document.getElementById("myLink"); // <a id="myLink" href="/home" target="_blank">Home</a> を仮定

const hrefValue = link.getAttribute("href");
const targetValue = link.getAttribute("target");
const relValue = link.getAttribute("rel"); // この属性は存在しないと仮定

console.log(`リンク先: ${hrefValue}`);     // 出力: リンク先: /home
console.log(`ターゲット: ${targetValue}`); // 出力: ターゲット: _blank
console.log(`rel属性: ${relValue}`);     // 出力: rel属性: null (存在しないため)

一方で、`removeAttribute()`は、要素から特定の属性を完全に削除したいときに使います。例えば、一時的にボタンを無効化するために`disabled`属性を追加し、その後条件が満たされたらその`disabled`属性を削除してボタンを再び有効にするといったケースで活躍します。

const submitButton = document.getElementById("submitBtn"); // <button id="submitBtn" disabled>送信</button> を仮定

console.log(`初期状態のボタン: ${submitButton.outerHTML}`);

// 何らかの条件が満たされたと仮定し、disabled属性を削除
submitButton.removeAttribute("disabled");
console.log(`disabled削除後のボタン: ${submitButton.outerHTML}`); // <button id="submitBtn">送信</button>

これらのメソッドを適切に使いこなすことで、ウェブページの振る舞いを細かく制御し、ユーザーにとってより柔軟で直感的なインターフェースを提供することができます。(参考情報より)

`data-*`属性の活用と`dataset`プロパティ

HTML5から導入された`data-*`属性は、標準のHTML要素にカスタムデータを格納するための非常に便利な方法です。JavaScriptからは、要素の`dataset`プロパティを通じてこれらの属性に簡単にアクセスできます。

例えば、ユーザーID、商品コード、状態フラグなど、表示には直接関係ないがJavaScriptで利用したいデータをHTML要素に持たせたい場合に最適です。

<div id="user-info" data-user-id="123" data-user-name="Alice" data-status="active"></div>

JavaScriptから`data-*`属性にアクセスする際は、属性名から`data-`プレフィックスを除き、ハイフン区切りをキャメルケースに変換して`dataset`プロパティのサブプロパティとして扱います。

  • 取得: `element.dataset.attributeName` (例: `data-user-id` → `dataset.userId`)
  • 設定: `element.dataset.attributeName = value`
const userInfo = document.getElementById("user-info");

// 取得
console.log(`ユーザーID: ${userInfo.dataset.userId}`);     // 出力: ユーザーID: 123
console.log(`ユーザー名: ${userInfo.dataset.userName}`); // 出力: ユーザー名: Alice
console.log(`ステータス: ${userInfo.dataset.status}`);   // 出力: ステータス: active

// 設定 (値を変更)
userInfo.dataset.userId = "456";
console.log(`変更後のユーザーID: ${userInfo.dataset.userId}`); // 出力: 変更後のユーザーID: 456

// 新しいdata-*属性を追加
userInfo.dataset.userRole = "Admin";
console.log(`新しい属性: ${userInfo.dataset.userRole}`);   // 出力: 新しい属性: Admin
console.log(userInfo.outerHTML); // <div id="user-info" data-user-id="456" data-user-name="Alice" data-status="active" data-user-role="Admin"></div>

`data-*`属性は、検索エンジンにインデックスされにくかったり、支援技術でアクセスされにくかったりする可能性があるため、本来表示されるべきコンテンツの格納には適していません。あくまでJavaScriptでのデータ管理用途に留めることが重要です。(参考情報より)

`disabled`属性の操作と活用例

`disabled`属性とは何か?その重要性

`disabled`属性は、フォーム要素(“, `