勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ

JavaScriptでbodyタグ内に特定のClass要素が追加された際イベントを発火させる方法

   2023/05/12  JavaScript

ASPを使用したサイトでページ内に特定のClass要素が追加された際にJSでイベントを発火させたいという案件があった。通常であればClass要素を追加する際に当該イベントを実行すればよさそうだが、Class要素を追加する部分をASP側で制御していたため通常の方法が取られなかった。以下に対応方法をメモ。

 

MutationObserverを使用する

DOMの変化を監視するMutationObserverという機能を使うのが良さそう。以下リファレンス。

https://developer.mozilla.org/ja/docs/Web/API/MutationObserver

 

ソースコード

<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>MutationObserverのテスト</title>
</head>
<body>

    <p id="msg"></p>

    <script>
    const body = document.body;

    //監視開始
    const observer = new MutationObserver(records => {

        //.testというClassを見つけた場合
        if( document.querySelector('.test') !== null ){

            //監視を終了し、アラートを表示
            observer.disconnect(alert('success!'));
        }
    });

    observer.observe(body, {
        childList: true, //直接の子要素をチェック
        subtree: true //全ての子孫要素をチェック
    });

    //5秒後に#msg内に.test要素を挿入
    setTimeout(function(){
        const msg = document.getElementById('msg');
        msg.innerHTML = '<span class="test">msg</span>';
    }, 5000);

    </script>
</body>
</html>

上記の場合だとページを表示した5秒後に<p id="msg">内に<span class="test">が挿入され、それをMutationObserverで見つけてアラートを表示するという内容。念のため以下サンプルページ。

https://taitan916.info/sample/MutationObserver/

 

所感

MutationObserverというのは知らなかったため最初はsetIntervalで無理やり監視する形を取ろうとしたが、ソースコードの見た目やブラウザへの負荷的な面でどうなのかと悩ましかった。今回のようなケースはあんまり無さそうではあるがJSでDOM監視ができるというのは覚えておきたいところ。

 - JavaScript

  関連記事

Leafletで「Leaflet.markercluster」プラグインを導入してマーカークラスタ機能を追加する方法
Leafletで「Leaflet.markercluster」プラグインを導入してマーカークラスタ機能を追加する方法

LeafletとOpenStreetMapでマップ上にマーカーを複数設置した上で ...

Ajaxでプラグイン無しのファイルアップロード方法
Ajaxでプラグイン無しのファイルアップロード方法

画像ファイルを添付できて、尚且つAjaxを用いた非同期通信のフォームを作りたかっ ...

jQueryでユーザーが編集可能な文字列をページ上に表示する際にエスケープする方法
jQueryでユーザーが編集可能な文字列をページ上に表示する際にエスケープする方法

GETパラメータを取得し、その内容をページ上に表示したいケースがあった。また、A ...

Leafletにて表示されているマップを画像としてダウンロードさせる「leaflet-easyPrint」の利用方法
Leafletにて表示されているマップを画像としてダウンロードさせる「leaflet-easyPrint」の利用方法

Leafletにて何らかのボタンをクリックすると表示されているマップを画像として ...

国土地理院のAPIを使用して無料でジオコーディング(住所→経度緯度)を行う方法
国土地理院のAPIを使用して無料でジオコーディング(住所→経度緯度)を行う方法

GoogleMapAPIでジオコーディングをするには、支払い情報を登録したアカウ ...