特定のHTML要素以外をクリックした時にイベントを発火
2025/08/13 (水) - 09:00 JavaScript
Webページで特定の要素をクリックした時と、それ以外の要素をクリックした時とで処理を分岐したい…。例えば親以上の要素にイベントハンドラを設定してしまうと、自身の要素もイベントハンドラの対象になってしまうのでそれを防ぎたい。
モーダルウィンドウなどで指定した要素以外をクリックしたらイベントを発火させたい場合は以下のように実装します。closestメソッドを使うと指定したセレクタ自身、または最も近い親要素を取得できます。targetと組み合わせて指定したセレクタが含まれなかったら〜で判別します。HTMLの例は以下の通り。
<div id="modal">モーダルウィンドウ</div>
JavaScript
document.addEventListener('click', function(e){
if(!e.target.closest('#modal')) {
console.log('モーダル以外をクリック!');
} else {
console.log('モーダルをクリック!');
}
});
jQueryで似たようなことを再現する場合
$(document).on('click',function(e) {
if(!$(e.target).closest('#modal').length) {
console.log('モーダル以外をクリック!');
} else {
console.log('モーダルをクリック!');
}
});
Reactで似たようなことを再現する場合
useRefを使うことでDOMを参照し、イベントハンドラを実行できるようにします。
import React, { useEffect, useRef } from 'react';
function App() {
const modalRef = useRef<HTMLDivElement | null>(null);
useEffect(() => {
const handleClickOutside = (e: MouseEvent) => {
if (modalRef.current && !modalRef.current.contains(e.target as Node)) {
console.log('モーダル以外をクリック!');
} else {
console.log('モーダルをクリック!');
}
};
document.addEventListener('click', handleClickOutside);
}, []);
return (
<div id="modal" ref={modalRef}>モーダルウィンドウ</div>
);
}
export default App;
これを使うことで例えば、モーダルウィンドウやドロップダウンメニュー以外の外側をクリックしたら要素を非表示にする…など実現できます。
おしまい♥
おすすめ記事
- sessionStorageやlocalStorageではBoolean使えないのね…
- Next.js[App Router]とPokeAPIでポケモンを番号で検索する。
- Youtube iFrame Player APIでスクロールして見えたら動画を自動再生する
- Next.js App Routerによるhead要素内の設定(meta OGPとかfavicon)
- Reactで画像がクロスフェードするスライドショーを作る
トラックバック & ピンバック
- この記事へのトラックバックURI:
- https://weblog.walk-life.me/js_nottarget_click/trackback/