Onay kutusu tıklamasında olay köpürme nasıl durdurulur


183

Ben tıklama olayında bazı Ajax eylemi gerçekleştirmek istiyorum bir onay kutusu var, ancak onay kutusu da onay kutusu tıklatıldığında çalıştırmak istemiyorum kendi tıklama davranışı olan bir kapsayıcı içinde. Bu örnek ne yapmak istediğimi göstermektedir:

$(document).ready(function() {
  $('#container').addClass('hidden');
  $('#header').click(function() {
    if ($('#container').hasClass('hidden')) {
      $('#container').removeClass('hidden');
    } else {
      $('#container').addClass('hidden');
    }
  });
  $('#header input[type=checkbox]').click(function(event) {
    // Do something
  });
});
#container.hidden #body {
  display: none;
}
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<div id="container">
  <div id="header">
    <h1>Title</h1>
    <input type="checkbox" name="test" />
  </div>
  <div id="body">
    <p>Some content</p>
  </div>
</div>

Ancak, varsayılan tıklama davranışının (onay kutusu işaretli / işaretli değil) çalışmasına neden olmadan olay köpürmeyi nasıl durduracağımı anlayamıyorum.

Aşağıdakilerin her ikisi de olayın köpürmesini durdurur, ancak onay kutusu durumunu değiştirmez:

event.preventDefault();
return false;

2
Bu konuda, diğer Stack Overflowers için yararlı olabilecek bir makale buldum. Hızlı İpucu: Bir Onay Kutusunu Tetiklemek için Tablo Satırına Tıklayın
Peder Rice

Yanıtlar:


341

değiştirmek

event.preventDefault();
return false;

ile

event.stopPropagation();

Event.stopPropagation ()

Bir olayın üst öğelere köpürmesini durdurarak, üst işleyicilerin olaya bildirilmesini önler.

event.preventDefault ()

Tarayıcının varsayılan işlemi gerçekleştirmesini önler. Bu yöntemin hiç çağrılıp çağrılmadığını (o olay nesnesinde) bilmek için isDefaultPrevented yöntemini kullanın.


4
bir nedenden dolayı bu benim için işe yaramıyor, ama dönüş yanlış.
Randy L

3
Olayı .live()yöntem kullanarak bağlıyorsanız, bu çalışmaz. return false;Kendini kullanman gerekecek .
rahul

2
Bu jQuery .on()yöntemi kullanılarak çalışır (live artık kullanımdan kaldırılmıştır). Yanlış dönüşün neden işe yaramadığını anlayamadım.
styfle

i event.preventDefault () IE8 onay işareti göstermek değildi, ama diğer tarayıcılarda iyi çalıştı anlamaya oldukça zaman geçirdim. Bu cevabı düzelttikten sonra öneriyorumDefault, IE8, onay kutusu ile googling sonra beni buraya getirdi.
signonsridhar

işe yaramadı .. ama bu iki satır (dönüş yanlış olmadan) -> event.preventDefault (); Event.stopPropagation ();
Kugan Kumar


29

IE'yi unutmayın:

if (event.stopPropagation) {    // standard
        event.stopPropagation();
    } else {    // IE6-8
        event.cancelBubble = true;
}

24
Bu cevap 2012 yılına aittir. 2015 yılında lütfen IE'yi unutmayın.
Taylan

8
Bu IE9 için de geçerlidir. IE9 test makinem stopPropagation () öğesini boğuyor, ancak cancelBubble () işlevini seviyor. Ve bazı insanlar / kuruluşlar 2016'da hala IE9 kullanıyorlar. Kurumsal müşterileri olanlarımız bunu görmezden gelemeyiz.
Chris Cober

i 2019 yılında ie5 seviyorum
SuperUberDuper

5

Diğerlerinin de belirttiği gibi, deneyin stopPropagation().

Denemek için ikinci bir işleyici var: event.cancelBubble = true;IE'ye özel bir işleyici, ancak en azından FF'de destekleniyor. Kendim kullanmadığım için gerçekten fazla bir şey bilmiyorum, ama her şey başarısız olursa, denemeye değer olabilir.


5

Bu, olay köpürme konseptini anlamak için mükemmel bir örnektir. Yukarıdaki cevaplara dayanarak, son kod aşağıda belirtildiği gibi görünecektir. Kullanıcı onay kutusunu tıkladığında, olayın üst öğesi olan 'header' öğesine yayılması durdurulur event.stopPropagation();.

$(document).ready(function() {
            $('#container').addClass('hidden');
            $('#header').click(function() {
                if($('#container').hasClass('hidden')) {
                    $('#container').removeClass('hidden');
                } else {
                    $('#container').addClass('hidden');
                }
            });
          $('#header input[type=checkbox]').click(function(event) {
              if (event.stopPropagation) {    // standard
                   event.stopPropagation();
               } else {    // IE6-8
                    event.cancelBubble = true;
               }
          });     
  });

5

JQuery kullanırken ayrı bir durdurma işlevi çağırmanız gerekmez.

Sadece falseolay işleyicisine dönebilirsiniz

Bu olayı durduracak ve köpürmeyi iptal edecektir.

Ayrıca bkz. Event.preventDefault () ve return false

JQuery dokümanlarından:

Bu nedenle, bu işleyiciler devredilen işleyicinin arayarak event.stopPropagation()veya geri dönerek tetiklenmesini engelleyebilir false.


1

Kredi @mehras kodu. Bunu göstermek için sadece bir pasaj oluşturdum çünkü bunun takdir edileceğini düşündüm ve bu özelliği denemek için bir bahane istedim.

$(document).ready(function() {
  $('#container').addClass('hidden');
  $('#header').click(function() {
    if ($('#container').hasClass('hidden')) {
      $('#container').removeClass('hidden');
    } else {
      $('#container').addClass('hidden');
    }
  });
  $('#header input[type=checkbox]').click(function(event) {
    if (event.stopPropagation) { // standard
      event.stopPropagation();
    } else { // IE6-8
      event.cancelBubble = true;
    }
  });
});
div {
  text-align: center;
  padding: 2em;
  font-size: 1.2em
}

.hidden {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="header"><input type="checkbox" />Checkbox won't bubble the event, but this text will.</div>
<div id="container">click() bubbled up!</div>


Olay değişkeninin nasıl kullanılacağını gösteren kod, teşekkürler.
Moshe Binieli

-1

Angularjs'de bunun çalışması gerekir:

event.preventDefault(); 
event.stopPropagation();
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.