LoginSignup
1
1

特定のDOM要素の増加を観測してみた!

Posted at

はじめに

今回、拡張機能を作るにあたって、ChatGPTへの質問回数をカウントする機能を実装することになりました。その際に実装が難しかったので記事にしようと思いました。

概要

特定のDOM要素の増加を観測する目的

ChatGPTの1日の返答回数(質問回数)をカウントすることが当初の目的でした。
つまりDOMの中の特定のクラスネームをカウントして、そのクラスネームのDOM要素が1増えるとGPTの返答回数が増えるということになります。そのため特定のDOM要素の増加の観測を実装することになりました。

予測される実装の関数の流れ

①監視をスタート→②既存のGPTの返答数をカウントする→③DOMに変化がある場合再度返答数をカウントする→④もしカウントした返答数が増加していたら、既存の返答数に+1して③に戻る。
この繰り返しでChatGPT内の返答の増加を常に監視することができそう。

実装

今回はMutationObserverを用いて実装しました。


const targetParentElement = document.querySelector(".sample")
const targetElementClassName = ".sample__item"

const observeDOMChanges = async (): Promise<void> => {
  if (targetParentElement) {
    let currentCount = document.querySelectorAll(
      targetElementClassName
    ).length
    const mutationCallback: MutationCallback = () => {
      const updateCount = document.querySelectorAll(targetElementClassName).length

      if (updateCount - currentCount === 1) {
        currentCount = updateCount
        // 特定のDOM要素が1つ追加された時の処理
      }
    }

    const observer = new MutationObserver(mutationCallback)
    observer.observe(targetParentElement, {
      childList: true,
      subtree: true
    })
  } else {
    console.error("Target element not found.")
  }
}

observeDOMChanges()

この実装ではtargetParentElementtargetElementClassNameをサンプルの値で実装しています。
また自分はこのカウントするコードに実際の実装ではDOMの処理を読み込む時間をcurrentCountの部分でsetTimeoutを用いて指定した時間を待つようにしました。それに加えて、URLが変更された際に、オブザーバーを再起動することで、chatごとのcurrentCountの初期値を計算しています。
以下の部分がその実装です。

まとめ

今回はオブザーバーを用いた特定のDOM要素の増加を観測方法を紹介しました。
個人的には振り返ってみると簡単そうに見えるのに、当初はすごく手こずった思い出があります。
違うやり方があったり、もっといい方法あるよーとかあったらじゃんじゃんコメント待っています。
最後まで読んでいただきありがとうございました。

1
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
1
1