jquery子を停止して親イベントをトリガー


208

onclickイベントをアタッチしたdivがあります。このdivには、リンク付きのタグがあります。リンクをクリックするとonclick、divからのイベントもトリガーされます。これを無効にして、リンクをクリックしたときにdiv onclickが発生しないようにするにはどうすればよいですか?

脚本:

$(document).ready(function(){
    $(".header").bind("click", function(){
         $(this).children(".children").toggle();
    });
})

HTMLコード:

<div class="header">
    <a href="link.html">some link</a>
    <ul class="children">
        <li>some list</li>
    </ul>
</div>

回答:


411

これを行う:

$(document).ready(function(){
    $(".header").click(function(){
        $(this).children(".children").toggle();
    });
   $(".header a").click(function(e) {
        e.stopPropagation();
   });
});

あなたがしたい場合は.stopPropagation()に続きを読む、ここを見て


2
それが誰かを助ける場合、私は置き換え$(".header a")$(".header *")、子を選択しました(div、フォーム、入力など)。
aldo.roman.nurena 2013

1
e.stopPropagation(); 動作しない場合を除いて、最初の行に記述する必要があります。
ehsan 2013年


5
xr280xrによる以下の回答は、子供たちの起こり得るイベントを妨害しないため、はるかに優れています。
Alexander Jank 2017年

1
あなたが解決するよりも多くの問題を作成します。ドキュメント要素のクリックイベントをリッスンするサードパーティのプラグインを想像してください。彼らはそれらのクリックについて決して知りません。ライトボックスに関するコメントを参照してください。
Salman A

98

または、別のハンドラーを防ぐために追加のイベントハンドラーを用意するのではなく、クリックイベントハンドラーに渡されたイベントオブジェクト引数を使用して、子がクリックされたかどうかを判断できます。targetクリックされた要素とcurrentTargetなり、.header divになります:

$(".header").click(function(e){
     //Do nothing if .header was not directly clicked
     if(e.target !== e.currentTarget) return;

     $(this).children(".children").toggle();
});

8
私には、すべての子要素に明示的なpreventDefault()を追加する必要がないため、これはよりエレガントなソリューションです。
Ryan Griggs

5
そして、それは受け入れられた答えとは異なり、あなたが子供に独立したイベントを持っている場合に機能します。間違いなくよりクリーンで優れたソリューション
BozanicJosip

2
ほとんどの場合、これは問題になりませんがcurrentTarget、何らかの理由でIE6-8をサポートする必要がある場合は、サポートされません。回避策はthis別の回答で提案されているように、に置き換えることです。
Alexander Jank 2017年

これは、クリックをキャッチするように追加のリスナーを設定するよりもクリーンなソリューションです。
Micros

このコードは私にとってよりうまくいきました `var target = $(e.target); if(!target.is( "span"))return; `
Cr1xus

17

次のようなチェーンでon()を使用することにより、より良い方法

$(document).ready(function(){
    $(".header").on('click',function(){
        $(this).children(".children").toggle();
    }).on('click','a',function(e) {
        e.stopPropagation();
   });
});

4

ここでの答えは、OPの質問を文字通りに捉えすぎていました。これらの回答を、単一の<a>タグだけでなく、多くの子要素があるシナリオに拡張するにはどうすればよいですか?これが1つの方法です。

たとえば、背景が黒く、写真がブラウザの中央に配置されているフォトギャラリーがあるとします。黒い背景をクリックすると(その内部ではなく)、オーバーレイを閉じます。

可能なHTMLは次のとおりです。

<div class="gallery" style="background: black">
    <div class="contents"> <!-- Let's say this div is 50% wide and centered -->
        <h1>Awesome Photos</h1>
        <img src="img1.jpg"><br>
        <img src="img2.jpg"><br>
        <img src="img3.jpg"><br>
        <img src="img4.jpg"><br>
        <img src="img5.jpg">
    </div>
</div>

そして、これがJavaScriptがどのように機能するかです:

$('.gallery').click(
    function()
    {
        $(this).hide();
    }
);

$('.gallery > .contents').click(
    function(e) {
        e.stopPropagation();
    }
);

これにより.contents、すべてのリサーチの内部の要素からのクリックイベントが停止します。.galleryギャラリーは、フェードされた黒い背景領域をクリックしたときにのみ閉じます。コンテンツ領域をクリックしたときは閉じません。これは、さまざまなシナリオに適用できます。


4

私はこの質問に出くわし、別の答えを探しました。

すべての子供が親を誘発するのを防ぎたかったのです。

JavaScript:

document.getElementById("parent").addEventListener("click",  function (e) {
    if (this !== event.target) return;
    // Do something
});

jQuery:

$("#parent").click(function () {
    // Do something
}).children().on("click", function (e) {
    e.stopPropagation();
});

0

またはこれ:

$(document).ready(function(){
    $(".header").click(function(){
        $(this).children(".children").toggle();
    });
   $(".header a").click(function(e) {
        return false;
   });
});

2
@ Halcyon991 eはどちらかの方法で引数を介して渡されます。eは単なる参照です
qodeninja 2014年

@qodeninjaええ、でもそれを使わなければ不要な文字が追加されます。
Halcyon991 2014年

return falseリンクに追加するポイントはありません。クリックできる必要があります。
eapo 2016年

0

最も簡単な解決策は、このCSSを子に追加することです。

.your-child {
    pointer-events: none;
}

Wordpressによって追加された不要なフォントタグにこれが必要でしたが、
うまくいき

-1

それを行うためのより短い方法:

$('.header').on('click', function () {
    $(this).children('a').on('click', function(e) {
        e.stopPropagation();
        $(this).siblings('.children').toggle();
    });
});

しかし...ヘッダーをクリックしても何も起こりません。
Liora Haydont

ヘッダーをクリックするたびに、これにより新しいクリックイベントが子( 'a')に追加されます。
フランクフォルテ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.