🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Chrome extension

Chrome拡張機能

Q&A

解決済

1回答

2806閲覧

javascriptでMutationObserverイベント監視対象の切り替え

sika

総合スコア52

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Chrome extension

Chrome拡張機能

0グッド

1クリップ

投稿2019/09/05 18:15

現在Chrome拡張アプリでwebページの要素をpopup.htmlのボタンで指定して
その対象をMutationObserverで監視して変更されたテキストデータを取得→拡張アプリへ再伝達するものを作成中です。

大まかな動きのものは出来たのですが、監視対象を切り替える度に
MutationObserverのイベントの切り替えで詰まっています。

監視対象の切り替えの挙動は成功しているのですが、その度に過去の対象も含めて監視状態が増えてしまう(newで生成してるので当たり前なのですが・・・)

できれば切り替え時に現在動作しているobserverを取得して、もし稼働中のMutationObserverイベントを停止 observer.disconnect();
そのうえで切り替え対象のMutationObserverイベントを新たに作成といった方法を望んでいます。

MutationObserverイベント自体を監視、または稼働中のMutationObserverイベントを新たに更新するという方法はありますでしょうか?
ご教授お願い致します。

html

1<!-- popup.html --> 2 <ul class="monitoring_slot"> 3 <li data-name="tab_01">タブ1</li> 4 <li data-name="tab_02">タブ2</li> 5 <li data-name="tab_03">タブ3</li> 6 <li data-name="tab_04">タブ4</li> 7 <li data-name="tab_05">タブ5</li> 8 </ul>

js

1// background.js 2 3//「content_script.js」へ監視を伝達 4function monitoringSetting(type){ 5 chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 6 chrome.tabs.sendMessage(tabs[0].id, { 7 data: type 8 },function(msg) { 9 console.log("タブ送信情報:", type); 10 }); 11 }); 12} 13 14// 「popup.html」の監視対象要素切り替え 15$(".monitoring_slot li").click(function(){ 16 type = $(this).data("name"); 17 $(this).addClass('activ'); 18 monitoringSetting(type) 19}) 20 21 22// 「content_script.js」からデータ受け取り 23chrome.extension.onMessage.addListener( 24 function(request, sender, sendResponse) { 25 // 監視要素のデータを受け取ってなんだかんだ 26 } 27);

js

1// content_script.js 2 3chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { 4 console.log(msg); 5 var type = msg.data['type']; 6 // 監視対象の切り替え 7 switch(type){ 8 case "tab_01": 9 var $element = $("#tab_01"); 10 break; 11 case "tab_02": 12 var $element = $("#tab_02"); 13 break; 14 case "tab_03": 15 var $element = $("#tab_03"); 16 break; 17 case "tab_04": 18 var $element = $("#tab_04"); 19 break; 20 case "tab_05": 21 var $element = $("#tab_05"); 22 break; 23 } 24 25 // 監視要素のテキストデータを監視 26 var observer = new MutationObserver(function(monitoring) { 27 var data = $element.children("span").text(); 28     // 「background.js」へデータを伝達 29 chrome.extension.sendMessage({'value':data}); 30 }); 31 var config = { attributes:true, subtree: true }; 32 observer.observe($element, config); 33

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

監視の対象を返るだけであればご自身で書かれている通り
observer.disconnect()した上で、
別の監視対処を指定してobserver.observe()してやればよいのでは?

subtreeだと例示しにくいのでvalue属性を利用したsample

javascript

1<script> 2const observer = new MutationObserver((mutations) => { 3 mutations.forEach((mutation) => { 4 console.log(mutation.target.value); 5 }); 6}); 7const config = { attributes: true, attributeFilter:['value']}; 8window.addEventListener('DOMContentLoaded', ()=>{ 9 observer.observe(document.querySelector('#hoge'), config); 10 document.querySelector('#btn1').addEventListener('click',()=>{ 11 var hoge=document.querySelector('#hoge'); 12 hoge.value=parseInt(hoge.value)+1; 13 }); 14 document.querySelector('#btn2').addEventListener('click',()=>{ 15 var hoge=document.querySelector('#hoge'); 16 var v=parseInt(hoge.value)+1; 17 hoge.setAttribute("value",v); 18 hoge.value=v; 19 }); 20 document.querySelector('#btn3').addEventListener('click',()=>{ 21 var fuga=document.querySelector('#fuga'); 22 hoge.value=parseInt(fuga.value)+1; 23 }); 24 document.querySelector('#btn4').addEventListener('click',()=>{ 25 var fuga=document.querySelector('#fuga'); 26 var v=parseInt(fuga.value)+1; 27 fuga.setAttribute("value",v); 28 fuga.value=v; 29 }); 30 document.querySelector('#btn5').addEventListener('click',()=>{ 31 observer.disconnect(); 32 observer.observe(document.querySelector('#fuga'), config); 33 }); 34}); 35</script> 36hoge:<input type="text" id="hoge" value="0"> 37<input type="button" id="btn1" value="prop+"> 38<input type="button" id="btn2" value="attr+"><br> 39fuga:<input type="text" id="fuga" value="0"> 40<input type="button" id="btn3" value="prop+"> 41<input type="button" id="btn4" value="attr+"><br> 42<input type="button" id="btn5" value="change"><br>

動作:

  • 当初hogeを監視
  • hogeのprop+をおすとhogeが+1→プロパティなので変更はログされない
  • hogeのattr+をおすとhogeが+1→属性ので変更はログされる
  • fugaのprop/attrもインクリメントするが監視対象ではないのでログされない

(changeを押す)
↓↓↓

  • hogeの監視がはずれてfugaの監視に変更
  • fugaのprop+をおすとfugaが+1→プロパティなので変更はログされない
  • fugaのattr+をおすとfugaが+1→属性ので変更はログされる
  • hogeのprop/attrもインクリメントするが監視対象ではないのでログされない

投稿2019/09/06 01:46

yambejp

総合スコア116663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sika

2019/09/06 07:32 編集

ご回答ありがとうございます。 > observer.disconnect()した上で、 > 別の監視対処を指定してobserver.observe()してやればよいのでは? おっしゃる通りなのですが 2回目以降の指定でしたらすでに動いているものを事前に 'observer.observe()' すれば良いのですが、初回にまだ動いていないイベントを事前に停止という手段が取れず・・・ 頂いたコードを参考に検証してみます!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問