JavaScriptで属性を変更してみよう!(setAttribute)

完成イメージ

画像を切り替えるボタンをクリックして、画像を変更してみよう!

今回のテーマ

ボタンをクリックしたら、画像の src(表示する画像ファイル)や、リンクの href(リンク先URL)など、HTMLタグの属性をJavaScriptで書き換える方法を学びます。

目的

  • .setAttribute() で画像やリンクの属性を変更する
  • .getAttribute() で現在の属性値を取得する
  • JavaScriptから HTML タグの見た目や動作を変える仕組みを体験する

作成ファイル・保存場所

js-domフォルダに以下のファイルを作成してください。

ファイル名内容
js-dom06.htmlボタンクリックの動作練習用HTML/js
js-dom__06.htmlステップアップ練習用HTML/js
images/01.jpgと02.jpgダウンロードjs-domフォルダに配置
練習するHTMLは下記からコピーしてください。
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>属性を変更してみよう</title>
    <style>
        #main-img {
            width: 400px;
        }
    </style>
</head>

<body>
    <h1>属性を変更してみよう!</h1>

    <p>
        <img id="main-img" src="images/01.jpg" alt="ネコの画像">
    </p>

    <p>
        <button id="change-img-btn">画像を切り替える</button>
    </p>

    <script>
        
    </script>

</body>

</html>

JavaScriptは <script> タグ内に直接記述してください(内部JS)

チェックポイント

  • getAttribute()srchref を取得できているか?
  • setAttribute() で画像やリンクが正しく変わったか?
  • ボタンを押すと、見た目の変化があるか?

JavaScript基礎トレーニング

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>属性を変更してみよう</title>
    <style>
        #main-img {
            width: 400px;
        }
    </style>
</head>

<body>
    <h1>属性を変更してみよう!</h1>

    <p>
        <img id="main-img" src="images/01.jpg" alt="ネコの画像">
    </p>

    <p>
        <button id="change-img-btn">画像を切り替える</button>
    </p>

    <script>
        const img = document.getElementById('main-img');
        const changeImgBtn = document.getElementById('change-img-btn');

        // 手動切り替え
        changeImgBtn.addEventListener('click', () => {
            const currentSrc = img.getAttribute('src');

            if (currentSrc.includes('01.jpg')) {
                img.setAttribute('src', 'images/02.jpg');
                img.setAttribute('alt', '猫イラスト画像');
            } else {
                img.setAttribute('src', 'images/01.jpg');
                img.setAttribute('alt', '猫写真画像');
            }
        });
    </script>

</body>

</html>

.setAttribute() / .getAttribute() とは?

HTMLのタグには「属性(attribute)」と呼ばれる情報があります。

<img src="photo1.jpg" alt="写真">

この srcaltJavaScriptから変更するには .setAttribute() を使います。

img.setAttribute('src', 'photo2.jpg'); // 表示画像を変更

今の値を確認したいときは .getAttribute() を使います

const currentSrc = img.getAttribute('src');
console.log(currentSrc); // photo1.jpg

たとえば以下のような場面で使わか」を true / false で返してくれます。

知得!HTMLの「属性」は、JavaScriptからも操作できる!

HTMLタグには 属性(attribute) という追加情報があります。たとえば、以下のように画像のURLや代替テキスト(alt)などが「属性」として書かれています。

<img src="images/01.jpg" alt="ネコの画像">

属性は、タグの動作や見た目を決める大事なパーツです。
そして JavaScript からはこの 属性を自由に読み書きすることができます!

HTML属性とJavaScriptの対応一覧

HTMLでの書き方JavaScriptで取得・変更する方法補足
<img src="xxx.jpg">img.getAttribute('src') / img.setAttribute('src', '...')表示する画像のファイルパス
<a href="https://...">link.getAttribute('href') / setAttributeリンク先URL
<input value="初期値">input.value / input.setAttribute('value', '...')ユーザーが入力した値は .value で取得
<div class="box">div.className / div.setAttribute('class', '...').class ではなく .className を使う
<img alt="説明文">img.getAttribute('alt') / setAttribute代替テキスト(画像が表示できないとき)
<input type="text">input.getAttribute('type')inputの種類(text, number など)

すべての属性が .setAttribute() で扱えるとは限らない!

HTMLの属性の多くは .getAttribute().setAttribute() で操作できますが、
一部の属性は、専用のプロパティを使う方が安全・確実です。

属性よく使う方法なぜ?
valueinput.value.setAttribute('value', ...) は初期値のみ変更され、動的な変更に反映されない場合がある
checkedinput.checked.setAttribute('checked', ...) は制御が難しい(ラジオやチェックボックス)
classelement.className または .classList.add()文字列操作より .classList が便利
styleelement.style.color = 'red'CSS操作には .style がわかりやすい

属性の操作には「専用プロパティ」がある場合も!

JavaScriptでは、属性に対応した「専用のプロパティ」が用意されていることがあります。

  • .value, .checked, .selected, .disabled, .classList, .style など
  • このようなプロパティを使うと、見た目の変化がすぐに反映されるため、より確実です

属性を操作するときの考え方

操作内容推奨される方法
HTML上の情報を取得したいgetAttribute()
HTMLの構造として属性を書き換えたいsetAttribute()
ユーザーの操作に応じて変化させたい.value, .checked, .classList, .style などの専用プロパティ

includes()とは?

if (currentSrc.includes('01.jpg')) {
  // 現在の画像が「01.jpg」なら実行される
}

このように書くことで、文字列の中に特定の文字が「含まれているかどうか」を調べることができます

書き方のポイント

文字列.includes('調べたい文字')
  • 戻り値は true または false
  • 大文字・小文字を区別する(完全一致が必要)
const url = 'images/01.jpg';

url.includes('01.jpg');     // → true
url.includes('02.jpg');     // → false
url.includes('images');     // → true
url.includes('.png');       // → false

画像の切り替えでは、現在の画像が 01.jpg なのか 02.jpg なのかを判定する必要があります。そのため、src 属性の中に "01.jpg"含まれているか?を調べるのに includes() が使われています。

JavaScriptステップアップトレーニング

2秒たったら自動的に画像が切り替わります。止めるボタンで止まります。

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>属性を変更してみよう</title>
    <style>
        #main-img {
            width: 400px;
        }
    </style>
</head>

<body>
    <h1>属性を変更してみよう!</h1>

    <p>
        <img id="main-img" src="images/01.jpg" alt="ネコの画像">
    </p>

    <p>
        <button id="auto-btn">自動で切り替える</button>
        <button id="stop-btn">止める</button>
    </p>

    <script>
        const img = document.getElementById('main-img');
        const autoBtn = document.getElementById('auto-btn');
        const stopBtn = document.getElementById('stop-btn');

        // 自動切り替え
        let timer = null;

        autoBtn.addEventListener('click', () => {
            if (timer !== null) return; // 二重実行防止

            timer = setInterval(() => {
                const currentSrc = img.getAttribute('src');

                if (currentSrc.includes('01.jpg')) {
                    img.setAttribute('src', 'images/02.jpg');
                    img.setAttribute('alt', '風景の画像');
                } else {
                    img.setAttribute('src', 'images/01.jpg');
                    img.setAttribute('alt', 'ネコの画像');
                }
            }, 2000);
        });

        // 停止
        stopBtn.addEventListener('click', () => {
            clearInterval(timer);
            timer = null;
        });
    </script>

</body>

</html>

timer = null の役割は?

「タイマーが止まった状態だよ」ということを明示するためのフラグです。
これによって「次にまたスタートボタンが押されたときに、再スタートできる」ようになります。

timer = null; // タイマーをリセットして再実行可能にする

setInterval() の仕組み

timer = setInterval(() => {
  // 処理
}, 2000);

このとき setInterval() は、繰り返し処理を管理する番号(ID)を返します。
そのIDを変数 timer に入れておくことで、あとで clearInterval(timer) を使って止めることができます。

なぜ null にするの?

clearInterval(timer); でタイマーを止めた後も、変数 timer の中には「直前のID(数値)」が残っています。

console.log(timer); // 102(例)

この状態で再び「自動で切り替える」ボタンを押すと、timer !== null の条件に引っかかって、新しいタイマーが動きません。

そこで null を使う!

clearInterval(timer); // タイマーを止める
timer = null;         // フラグをリセット(=停止状態に戻す)

これによって、次に「スタートボタン」が押されたときに

if (timer !== null) return; // 実行中なら何もしない

timer === null だから、タイマーが再スタートできる、という仕組みになります。