JavaScriptでbodyタグ内に特定のClass要素が追加された際イベントを発火させる方法
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エディタ(WYSIWYG)を導入する方法
シンプルで導入が簡単、且つ日本語化されているウィジウィグを探しており、良さそうな ...
-
-
FileReader APIを用いて画像をアップロードせずにサムネイル表示
以前にFile APIを用いてファイル名やサイズ、形式(拡張子)を取得するメモを ...
-
-
javascriptのtry文
javascriptとかjQueryを使ってて、Firefox,chromeはい ...
-
-
NicEdit(WYSIWYGエディタ)を再描写時にサイズを調整する方法
NicEdit(WYSIWYGエディタ)を設置しているサイトがあった。ページ読み ...
-
-
jQueryやJavaScriptで認識違いしていたところのメモ(高速化)
認識違いしていたり、知らなかったりでもっと高速な 処理を行えそうな点があったので ...
-
-
jQueryのdatetimepickerでスクロールを無効
日時ピッカーのjQuery datetimepickerにて、ピッカーを指定して ...
-
-
JavaScriptの三項演算子
いつもと違う書き方? 使い方の三項演算子が あったのでメモ。 ■ソース var ...
-
-
leaflet.jsとOSMでマーカーの画像をそれぞれ指定する
leaflet.jsとOpenStreetMapでマップ上にマーカーを複数設置し ...
-
-
異なる文字コード間でform送信する
formの送り手がUTF-8で受け手がEUC-JP、 なんとかしてjavascr ...
-
-
テキストエリアを自動でリサイズ
改行するだけで勝手にリサイズしてくれるので、 ユーザー用でも管理用でも使えそう。 ...