MutationObserverで実現できたコードを書き残しておきます
デモ
0
abc
- startをクリックして監視を開始します
- changeをクリックします
- 「0」には1が足されていきます
- 「abc」は「ABC」に変更されます
- 変更された要素のidとtextContentがアラートに表示されます
- stopをクリックすると監視されなくなります
- MutationObserver
以下も見つけたけれど非推奨や廃止されていた
- DOMSubtreeModified
- Object.observe()
- Object.prototype.watch()
コード.gs
function doGet() {
return HtmlService.createHtmlOutputFromFile("index");
}
|
意訳この機能がやること 指定したHTMLファイルを表示する |
index.html
<!DOCTYPE html>
<html>
<body>
<div id="div1">0</div>
<div id="div2">abc</div>
<button id="start">start</button>
<button id="change">change</button>
<button id="stop">stop</button>
<script>
var div1 = document.getElementById('div1');
var div2 = document.getElementById('div2');
document.getElementById('start').onclick = start_observer;
document.getElementById('change').onclick = change_clicked;
document.getElementById('stop').onclick = stop_observer;
function change_clicked() {
div1.textContent = parseInt(div1.textContent) + 1;
div2.textContent = "ABC";
}
var observer;
function start_observer(){
var config = get_config();
observer = new MutationObserver(fnc);
observer.observe(div1, config);
observer.observe(div2, config);
}
function get_config(){
var config = {
childList: true
}
return config;
}
function fnc(mutations) {
for (var i = 0; i < mutations.length; i++) {
var mutation = mutations[i];
alert([mutation.target.id, mutation.target.textContent]);
}
}
function stop_observer(){
if(observer){
observer.disconnect();
}
}
</script>
</body>
</html>
|
意訳div1 div2 変更を監視するstartボタン textContentを変更するボタン 変更の監視を停止するボタン idがdiv1の要素を取得する idがdiv2の要素を取得する idがstartの要素がクリックされた時にstart_observerを実行する idがchangeの要素がクリックされた時にchange_clickedを実行する idがstopの要素がクリックされた時にstop_observerを実行する この機能がやること div1のtextContentの数値に1足す div2のtextContentをABCにする observerを定義する この機能がやること configを取得して MutationObserverを作成して監視対象が変更された時にコールバック関数(例ではfnc)を実行する 監視対象にdiv1要素とconfigを設定 監視対象にdiv2要素とconfigを設定 この機能がやること configを作って childListをtrueにして 返す この機能がやること mutations(監視対象の変更)の数だけ以下を繰り返す 変更された対象を一つずつ取得して 要素のidとtextContentをアラートに出す この機能がやること observerがtrueなら observerで監視するのを止める |