JavaScript

JavaScriptでclass要素の変更を検知しイベントを発火させる方法

JavaScriptでDOMの操作を行う際に、要素のクラスが変更されることがあります。例えば、ユーザーの操作によってUIが動的に変化する場合、クラスの変更を検知して特定のアクションを実行することが求められます。本記事では、JavaScriptを使用してclass要素の変更を検知し、イベントを発火させるさまざまな方法について詳しく解説します。MutationObserveraddEventListenerといった定番の方法に加えて、setIntervalProxyなど、さらに柔軟な手法も紹介します。

class要素の変更を監視する方法

「MutationObserver」を使用する

MutationObserverは、DOMの変更を監視するためのJavaScriptの組み込みオブジェクトです。これを使用すると、要素の属性や内容の変更をリッスンし、それに対応するイベントを発火させることができます。

const targetElement = document.querySelector('.target-element');

const observer = new MutationObserver((mutations) => {
  mutations.forEach((mutation) => {
    if (mutation.attributeName === 'class') {
      // class要素が変更されたときの処理を記述
    }
  });
});

const config = { attributes: true };

observer.observe(targetElement, config);

 

「setInterval」を使ったポーリング

setIntervalを使用して、一定の間隔でclass属性の変更を監視する方法です。シンプルな実装が可能ですが、頻繁なチェックはパフォーマンスに影響を与える可能性があります。

const targetElement = document.querySelector('.target-element');
let previousClass = targetElement.className;

setInterval(() => {
  if (targetElement.className !== previousClass) {
    previousClass = targetElement.className;
    // class要素が変更されたときの処理を記述
  }
}, 100);

 

「Proxy」を使ったオブジェクト監視

Proxyを利用して、class属性の変更を監視する方法です。Proxyはオブジェクトの操作を捕捉し、変更を検知するのに役立ちます。

const targetElement = document.querySelector('.target-element');

const handler = {
  set(target, property, value) {
    if (property === 'className') {
      // class要素が変更されたときの処理を記述
    }
    target[property] = value;
    return true;
  }
};

const proxyElement = new Proxy(targetElement, handler);
proxyElement.className = 'new-class'; // この変更が検知される

 

「Object.defineProperty」を使ったプロパティ監視

Object.definePropertyを利用してclassNameプロパティの変更を監視する方法です。プロパティが設定されるときに処理を追加できます。

const targetElement = document.querySelector('.target-element');
let classNameValue = targetElement.className;

Object.defineProperty(targetElement, 'className', {
  get() {
    return classNameValue;
  },
  set(newValue) {
    classNameValue = newValue;
    // class要素が変更されたときの処理を記述
  }
});

 

クラス変更イベントのハンドリング

「addEventListener」を使用する

要素のclassが変更された際に、特定のイベントをトリガーしたい場合、addEventListenerを利用する方法もあります。

const targetElement = document.querySelector('.target-element');

targetElement.addEventListener('DOMAttrModified', (event) => {
  if (event.attrName === 'class') {
    // class要素が変更されたときの処理を記述
  }
});

 

CSSアニメーションの終了イベントを利用

CSSアニメーションを利用して、classの変更に伴うアニメーション終了時にイベントを発火させる方法です。class変更とアニメーションを組み合わせる場合に効果的です。

const targetElement = document.querySelector('.target-element');

targetElement.addEventListener('animationend', () => {
  // アニメーション終了時の処理を記述
});

 

まとめ

この記事では、JavaScriptを用いてclass要素の変更を検知し、イベントを発火させる複数の方法を解説しました。MutationObserveraddEventListenerのような定番の手法から、setIntervalProxyObject.defineProperty、CSSアニメーションの終了イベントを利用した方法まで、さまざまなアプローチを網羅しています。各方法には利点と欠点があり、プロジェクトの要件に応じて最適な方法を選ぶことが重要です。これらの知識を活用して、よりダイナミックで応答性の高いウェブアプリケーションを構築してみてください。

ABOUT ME
りん
沖縄から福岡に移住。QA/Webデザイナー/SE/フリーランス/SE人事など。趣味や好きなことをブログにまとめてます。