jquery stop child tetikleyici üst olay


208

Bir onclicketkinlik eklediğim bir div var . bu div'de bağlantı içeren bir etiket var. Bağlantıyı tıkladığımda div'den gelen onclickolay da tetiklenir. Div üzerindeki bağlantı tıklandığında onclicktetiklenmeyecek şekilde bunu nasıl devre dışı bırakabilirim ?

senaryo:

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

HTML Kodu:

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

Yanıtlar:


411

Bunu yap:

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

.StopPropagation () hakkında daha fazla bilgi edinmek istiyorsanız , buraya bakın .


2
Birini yardımcı olur, ben değiştirilir $(".header a")ile $(".header *")ve herhangi bir çocuk seçilir (div, formlar, giriş, vb) var.
aldo.roman.nurena

1
e.stopPropagation (); işe yaramazsa ilk satırda yazılmalıdır!
ehsan

2
ne yazık ki bu yöntem relyapılandırılmış ışık
kutusunun

5
Aşağıdaki xr280xr cevabı, çocukların olası olaylarına müdahale etmediği için çok daha iyidir.
Alexander Jank

1
Çözdüğünüzden daha fazla sorun yaratıyorsunuz. Üçüncü taraf eklentilerin belge öğesinde tıklama etkinliğini dinlediğini düşünün. Bu tıklamaları asla bilemezler. Işık kutusu hakkındaki açıklamaya bakın.
Salman A

100

Veya, başka bir işleyiciyi önlemek için fazladan bir olay işleyicisine sahip olmak yerine, bir alt öğenin tıklanıp tıklanmadığını belirlemek için tıklama olay işleyicinize iletilen Olay Nesnesi bağımsız değişkenini kullanabilirsiniz . targettıklanan öğe currentTargetolacak ve .header div olacaktır:

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

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

8
Benim için bu daha zarif bir çözüm çünkü her alt öğeye açık bir preventDefault () eklemenize gerek yok.
Ryan Griggs

5
Ve kabul edilen cevaptan farklı olarak çocuk üzerinde bağımsız olaylarınız varsa işe yarar. Kesinlikle daha temiz ve daha iyi bir çözüm
BozanicJosip

2
Çoğu durumda bunu önemsemezsiniz, ancak herhangi bir nedenle IE6-8'i desteklemeniz gerekiyorsa, sahip değildirlercurrentTarget . Çözüm, başka bir yanıttathis önerildiği gibi bunun yerine geçmektir .
Alexander Jank

Bu, sadece tıklamaları yakalamak için ekstra bir dinleyici ayarlamaktan daha temiz bir çözümdür.
Micros

bu kod benim için daha iyi çalıştı. var target = $ (e.target); `; getirisi (! ( "yayılma") target.is) eğer
Cr1xus

17

Gibi zincirleme ile () kullanarak daha iyi bir yol ,

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

4

Buradaki cevaplar OP'nin sorusunu tam anlamıyla aldı. Bu cevaplar, yalnızca tek bir <a>etiketin değil, birçok alt öğenin olduğu bir senaryoya nasıl genişletilebilir ? İşte bir yol.

Diyelim ki arka planı karartılmış bir fotoğraf galeriniz ve tarayıcıda ortalanmış fotoğraflar var. Siyah arka planı tıklattığınızda (ancak içinde hiçbir şey olmadığında) kaplamanın kapanmasını istersiniz.

İşte bazı olası 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>

İşte JavaScript'in çalışması:

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

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

Bu, .contentsher araştırmanın içindeki öğelerden gelen tıklama olaylarını durduracaktır, .galleryböylece galeri yalnızca soluk siyah arka plan alanını tıkladığınızda kapanır, ancak içerik alanını tıkladığınızda kapanmaz. Bu, birçok farklı senaryoya uygulanabilir.


4

Bu soruyu tökezledim, başka bir cevap arıyorum.

Tüm çocukların ebeveyni tetiklemesini önlemek istedim .

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

Veya bu:

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

2
@ Halcyon991 e argümanlardan her iki şekilde geçilir, e sadece bir referanstır
qodeninja

@ qodeninja Evet, ama kullanılmazsa gereksiz bir karakter ilavesi.
Halcyon991

return falseBağlantı eklemek için nokta eklemek yok , tıklanabilir olmalıdır.
eapo

0

En basit çözüm bu CSS'yi çocuklara eklemektir:

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

Wordpress tarafından eklenen istenmeyen yazı tipi etiketi için buna ihtiyacım vardı ve benim için çalıştı
Ndm Gjr

-1

Bunu yapmanın daha kısa bir yolu:

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

Ancak ... Başlığa tıkladığınızda hiçbir şey yapmaz.
Liora Haydont

Başlığı her tıkladığınızda, bu , çocuklara yeni bir tıklama etkinliği ekler ('a').
Frank Forte
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.