質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
jQuery

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

Q&A

解決済

1回答

1609閲覧

非同期で内容が変化する<table>をMutationObserverで監視し、イベントを発火させたい

doubutsu.karada

総合スコア26

jQuery

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

1グッド

0クリップ

投稿2018/01/11 06:31

編集2018/01/11 07:24

以下のようなテーブルが存在し、

HTML

1<tbody id="targetTable"> 2 <tr> 3 <td class="red">red</td> 4 <td class="green">green</td> 5 <td class="blue">blue</td> 6 </tr> 7</tbody>

こちらのclassや文言などが非同期処理で内容が変化した場合にイベントを発火させたいのですが、以下のコードでうまく動作せず困っております。

JavaScript

1$(function() { 2 var observer = new MutationObserver(function () { 3 console.log('changed'); 4 }); 5 6 observer.observe($('#targetTable')[0], { 7 attributes: true, 8 childList: true, 9 characterData: true, 10 subtree: true 11 }); 12});
$(selector).on('DOMSubtreeModified propertychange', handler);

調べた結果、こちらでも同じ動作が期待できるとのことでしたがDOMSubtreeModifiedが非推奨とのことでしたので、MutationObserverクラスを利用した方法で何かご助言頂ければ幸いです。

defghi1977👍を押しています

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

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

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

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

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

yambejp

2018/01/11 06:36

非同期で処理をさせるトリガー側で対応はできないでしょうか?
doubutsu.karada

2018/01/11 06:49 編集

非同期で表示の制御を行っている処理が共通のjsファイルに有り(複数箇所のtableに使用)、それを監視する必要があるのは一箇所のみなので難しいです・・・。
yambejp

2018/01/11 06:55

そうなると内容が変化するたびに反応しそうですが、複数文字が変更になるとき1文字ずつ反応するイメージですか?
defghi1977

2018/01/11 07:02

> <table>をjQueryで監視し の部分ですが「MutationObserverで監視し」のほうが適切かと思います. また, tbody要素を監視しているようですが, table要素のinnerHTMLを書き換えている可能性はありませんか?
doubutsu.karada

2018/01/11 07:12

リンク押下時にテーブル内の属性値やテキストが動的に変化(LaravelのコントローラでレンダリングしたViewを表示)するので、1文字ずつ反応という形ではないと思います。DOMに変更が生じた場合に処理を発火、としたいです。
doubutsu.karada

2018/01/11 07:28

>defghi1977 様 現在はajaxで非同期通信実行、成功の場合にtableの親要素にあたるdivの中身をempty()で空にしたあとappendで新しくhtmlを追加するという処理になっております。JavaScript初心者であまり詳しくないのですが、こちらは table要素のinnerHTMLを書き換えている ということに当たるのでしょうか?
x_x

2018/01/11 07:28

こちらでは動いているので、監視範囲外になっていないか確認してみてください。
guest

回答1

0

ベストアンサー

MutationObserverオブジェクトの使い方としては間違っていません.が,

defghi1977 様 現在はajaxで非同期通信実行、成功の場合にtableの親要素にあたるdivの中身をempty()で空にしたあとappendで新しくhtmlを追加するという処理になっております。

これではMutationObserverオブジェクトが監視しているtbody要素がそっくりそのまま破棄されてしまっています.

従って監視対象をtable要素を挿入している(破棄される可能性のない)div要素に変更して下さい.

投稿2018/01/11 07:35

編集2018/01/11 07:37
defghi1977

総合スコア4756

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

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

doubutsu.karada

2018/01/11 07:49

こちらで解決いたしました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問