2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Typescriptで動的なMutationObserverの追加

Posted at

概要

MutationObserver

詳しい内容についてはこちらの記事が素晴らしい内容でまとめてくださっているのでそちらを参考に。
JavaScriptのMutationObserverでDOMの変化を監視する方法 - Qiita

要するに、特定のDOMの状態変化を検知することができ、検知したあとに特定の処理を実行することができます。
今回はこれをTypescriptで動的にobserverの対象を増やす処理を実装しました。

単一の監視のコード例

    //#region 監視
    // ターゲットの要素を取得(ByClasNameで1番目の要素を取得する)
    const target: Node = document.getElementsByClassName('DataGrid-Table CommentPanelDataGrid-Table')[0];
    // オブザーバーの作成
    const observer = new MutationObserver(records => {
        // 状態変化があったときの処理をここに書く
    });
    // 監視オプションの作成
    const options = {
        attributes: true
    };
    // 監視の開始
    observer.observe(target, options);
    //#endregion

上記が基本的な使い方になります、

動的にobserverの監視対象を増やすために下記の実装をしました。
イメージとしてはグリッドのような表があり、その内容が変化したり増減したりする場合に用います。
上記の処理で、状態変化があったときに呼ばれる処理の中に下記の処理を呼ぶ(関数化するのがベターかな)ようにすることで
内容が変化するたびにobserverの対象を増やす(減らす)ようにしました。

    //#region 各セルの変更を監視する
    const observer3 = new MutationObserver(function (...args) {
        // 内容が変化したときの処理
        // console.log(this, args);
    });
    const option3 = {
        attributes: true
    };
    let cellData = document.getElementsByClassName('InlineEdit OwnerCommentEditContainer-inlineEdit');
    for (const selector of cellData as any) {
        observer3.observe(selector, option3);
    }
    ////#endregion

どのセルの内容が変化したのかはconsole.log(this, args);で確認できます。

参考

MutationObserver で複数 observe する場合
JavaScriptのMutationObserverでDOMの変化を監視する方法 - Qiita
Observerを使って要素を監視してみよう! | フロントエンドBlog | ミツエーリンクス

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?