JavaScriptでbodyタグ内に特定のClass要素が追加された際イベントを発火させる方法
2023/05/12
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監視ができるというのは覚えておきたいところ。
関連記事
-
-
HTMLとJavaScriptのソースコードの暗号化(難読化)
サーバーサイドはソースを見られないけどクライアントサイドはソースを見られるので、 ...
-
-
PHPで画像を分割し並べ替えて出力したものをJavaScriptで復元する方法
ある電子書籍サイトをブラウザの開発者ツールで見てみたところ、PHPでページ画像を ...
-
-
Javascript / jQueryにて特定の要素内の文字数が〇文字以上の場合に丸める方法
サイトの特定の要素内の文字数が〇文字以上の場合に「コンテンツコンテ……」のように ...
-
-
JavaScriptにて「loglevel」ライブラリを利用して環境及びレベルによりログを出し分けする方法
JavaScriptにて何らかの確認の際にconsole.logを使うことが多い ...
-
-
画像にマウスを合わせると拡大表示させる「drift」ライブラリの利用方法
amazon等ECサイトで商品画像にマウスを合わせると当該部分が拡大表示されると ...