jQuery: çocukları hariç tutma işlevini tıklatın.


144

Başımı jQuery ".not ()" fonksiyonunun etrafına sarmaya çalışıyorum ve bir sorunla karşılaşıyorum. Ben üst div "tıklanabilir" olmasını istiyorum ama bir kullanıcı bir alt öğe tıklarsa, komut dosyası çağrılmaz.

$(this).not(children()).click(function(){
   $(".example").fadeOut("fast");
});

html:

<div class="example">
   <div>
      <p>This content is not affected by clicks.</p>
   </div>
</div>

Yanıtlar:


198

Bunu yapmak için, .stopPropagation kullanarak alt tıklamayı durdurun :

$(".example").click(function(){
  $(this).fadeOut("fast");
}).children().click(function(e) {
  return false;
});

Bu, üst tıklama tıklamaması için alt tıklamaların düzeylerini aşmasını engelleyecektir.

.not() biraz farklı bir şekilde kullanılırsa, öğeleri seçicinizden filtreler, örneğin:

<div class="bob" id="myID"></div>
<div class="bob"></div>

$(".bob").not("#myID"); //removes the element with myID

Tıklamak için sorununuz, bir çocuğa yapılan tıklamanın yanlışlıkla çocuğa bir tıklama işleyicisi iliştirmediğinizden değil üst öğeye doğru kabarmasıdır .


teşekkürler nick, aradığım şey bu olduğunu sanmıyorum. Sorumda net olmadığım için üzgünüm. Tüm div.example öğesinin fadeOut'a, alt öğe tıklatıldığında değil, yalnızca üst öğe tıklatıldığında olmasını istiyorum. Bunun nedeni, kullanıcının paragraf metnine tıklayabilmesini ve metni fadeOut'a sahip olmamasını istememdir. Kullanıcı dış div'a (üst div) tıklarsa, her şey kaybolur.
superUntitled

@superUntitled - Açıklama için teşekkürler ... cevaplar bunu yapmak için güncellendi, bir deneyin.
Nick Craver

18
Kullanım - @Asaf e.stopPropagation();yerine return false;o durum için.
Nick Craver

2
}).find('.classes-to-ignore').click(function(e) {Belirli alt öğeleri seçmek için de kullanabilirsiniz
Paul Mason

5
Ona neden kullanmasını e.stopPropagation()ve sonra kullanmasını söylediğini anlamıyorum return false. return falseile eşdeğer olduğundan e.preventDefault(); e.stopPropagation()beklenmedik yan etkileri olabilir.
Steen Schütt

183

Aşağıdaki biçimlendirme kullanıyorum ve aynı sorunu kodlanmış:

<ul class="nav">
    <li><a href="abc.html">abc</a></li>
    <li><a href="def.html">def</a></li>
</ul>

Burada aşağıdaki mantığı kullandım:

$(".nav > li").click(function(e){
    if(e.target != this) return; // only continue if the target itself has been clicked
    // this section only processes if the .nav > li itself is clicked.
    alert("you clicked .nav > li, but not it's children");
});

Tam soru açısından, bunun çalıştığını aşağıdaki gibi görebiliyorum:

$(".example").click(function(e){
   if(e.target != this) return; // only continue if the target itself has been clicked
   $(".example").fadeOut("fast");
});

veya tabii ki tam tersi:

$(".example").click(function(e){
   if(e.target == this){ // only if the target itself has been clicked
       $(".example").fadeOut("fast");
   }
});

Umarım yardımcı olur.


28
Bence bu daha iyi bir çözüm. Çocuklara hiçbir şekilde müdahale etmez ve binlerce çocuk varsa potansiyel olarak binlerce geri arama kaydetmediğinden daha iyi performans göstermelidir.
Mart'ta LucasB

4
@ l2aelba - v1.7'den beri kullanımdan kaldırıldığı .on("click", ...)gibi jQuery'nin son sürümlerinde kullanmalısınız .live(). Bkz api.jquery.com/live
Chris

Evet, @Chris 16 Kas 12, 10:12
l2aelba

Üzgünüz, muhtemelen kimliğinize başvurmanız gerekmedi. Bu cevabı okuyan herkes için yorumu büyük ölçüde ekledim.
Chris

1
Bu yanıt, alt öğelerdeki hiçbir tıklama etkinliğini kesintiye uğratmadığından kabul edilen yanıttan daha iyidir
cameronjonesweb

24

Veya şunları da yapabilirsiniz:

$('.example').on('click', function(e) { 
   if( e.target != this ) 
       return false;

   // ... //
});

Alt öğelerde tıklama olayını önlemek için false değerini döndürmeniz gerekir. Düzeltme yanlıştı
dani24

6

Çözümüm:

jQuery('.foo').on('click',function(event){
    if ( !jQuery(event.target).is('.foo *') ) {
        // code goes here
    } 
});

Sizinkinin üstündeki çözüme benzer.
user460114

3

Şahsen ben tıklamanın yayılmasını durdurmak hiçbir şey yapmadı alt öğeye bir tıklama işleyicisi eklemek istiyorum. Yani şöyle bir şey olurdu:

$('.example > div').click(function (e) {
    e.stopPropagation();
});

stopPropagationDiğer cevapların önerdiği gibi false ile return arasındaki fark nedir?
Crashalot

Bu durumda aynı işlevsel olacaklarına inanıyorum, ancak durma yayılımının ne yapıldığının amacına daha açık olduğunu ve neden daha sonra yapıldığını anlama şansını arttırdığını düşünüyorum. Ama tartışmalı.
Noahone

açıklama için teşekkürler. o gibi görünüyor stopPropagationonunla ortaya çıkabilir ki, meydana gelen alt öğeleri etkinlikleri durmayacak olarak temizleyici olabilir return false.
Crashalot

0

İşte bir örnek. Yeşil kare üst öğedir ve sarı kare alt öğedir.

Umarım bu yardımcı olur.

var childElementClicked;

$("#parentElement").click(function(){

		$("#childElement").click(function(){
		   childElementClicked = true;
		});

		if( childElementClicked != true ) {

			// It is clicked on parent but not on child.
      // Now do some action that you want.
      alert('Clicked on parent');
			
		}else{
      alert('Clicked on child');
    }
    
    childElementClicked = false;
	
});
#parentElement{
width:200px;
height:200px;
background-color:green;
position:relative;
}

#childElement{
margin-top:50px;
margin-left:50px;
width:100px;
height:100px;
background-color:yellow;
position:absolute;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="parentElement">
  <div id="childElement">
  </div>
</div>

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.