ラボ > Javascript関連:DOM関連、イベント関連

js,jquery 任意のセレクターを除く…イベント設定(is()、matches())

設定済みのイベント設定から特定の要素を除外したい

作成日:2024-03-27, 更新日:2024-03-27

jquery / .is()

$(document).on('click','.hoge', function() {
    if ( !$(this).is('#not-hoge') ) {
        // 「#not-hoge」以外の処理
    }
});

ネイティブのjavascript / .matches()

let elms_hoge = document.querySelectorAll('.hoge');
elms_hoge.forEach(elm => {
    elm.addEventListener('click', function(event) {
        if (!event.target.matches('#not-hoge')) {
            // 「#not-hoge」以外の処理
        }
    });
});

複数の条件のとき

上記は「id: #not-hoge」を除外したけど、「クラス: not-foo」「タグ: span」で絞ることも可能

// 省略
if ( !event.target.matches('.not-foo') && !event.target.matches('span') ) {
// 省略

※jqueryも同様

▼下記のようなまとめた記述で問題なし

// 省略
if ( !event.target.matches('span.not-foo') ) {
// 省略

※jqueryも同様

複数のクラスを持つとき

event.target.matches('.not-bar.not-foo')

親子関係

対象の親要素の判断は可能だけど、子要素の判断は出来ないらしい

▼htmlの例

<div class="aaa"><div class="not-hoge">

▼チェックしたい例

elm.matches('.aaa .not-hoge')

elmが親要素で子要素に対象が存在…はチェック不可

elmが「class="aaa"」のとき「false」
→子要素をマルっと取得して、その子要素をそれぞれチェックする感じの処理が必要

elmが子要素で親要素に対象が存在…はチェックOK

elmが「class="not-hoge"」のとき「true」