Bagaimana cara menghentikan peristiwa yang menggelegak di klik kotak centang


183

Saya memiliki kotak centang yang ingin saya lakukan beberapa tindakan Ajax pada acara klik, namun kotak centang juga di dalam wadah dengan perilaku klik sendiri yang tidak ingin saya jalankan ketika kotak centang diklik. Sampel ini menggambarkan apa yang ingin saya lakukan:

$(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>

Namun, saya tidak dapat menemukan cara untuk menghentikan gelembung acara tanpa menyebabkan perilaku klik default (kotak centang menjadi dicentang / tidak dicentang) untuk tidak berjalan.

Kedua hal berikut ini menghentikan acara yang menggelegak tetapi juga tidak mengubah status kotak centang:

event.preventDefault();
return false;

2
Saya menemukan sebuah artikel tentang masalah ini yang mungkin bermanfaat bagi Stack Overflowers lainnya. Tip Cepat: Klik Baris Tabel untuk Memicu Klik Kotak Centang
Peder Rice

Jawaban:


341

menggantikan

event.preventDefault();
return false;

dengan

event.stopPropagation();

event.stopPropagation ()

Menghentikan gelembung acara ke elemen induk, mencegah penangan orang tua mana pun diberitahu tentang peristiwa tersebut.

event.preventDefault ()

Mencegah browser melakukan tindakan default. Gunakan metode isDefaultPrevented untuk mengetahui apakah metode ini pernah dipanggil (pada objek acara itu).


4
untuk beberapa alasan ini tidak berhasil untuk saya, tetapi return false berhasil.
Randy L

3
Jika Anda mengikat acara menggunakan .live()metode maka ini tidak akan berhasil. Anda harus menggunakannya return false;sendiri.
rahul

2
Ini berfungsi menggunakan .on()metode jQuery (live sekarang sudah tidak digunakan lagi). Saya tidak tahu mengapa return false tidak berfungsi.
styfle

Saya menghabiskan cukup banyak waktu untuk mencari tahu bahwa event.preventDefault () tidak menunjukkan tanda centang di IE8, tetapi bekerja dengan baik di browser lain. Saya menemukan jawaban ini setelah saya memperbaiki dan kemudian googling dengan preventDefault, IE8, kotak centang sebagai kata kunci, membawa saya ke sini.
signonsridhar

tidak bekerja untuk .. tapi dua baris ini (tanpa return false) -> event.preventDefault (); event.stopPropagation ();
Kugan Kumar


29

Jangan lupakan IE:

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

24
Jawaban ini dari 2012. Di 2015 tolong lupakan IE.
Taylan

8
Ini berlaku untuk IE9 juga. Mesin uji IE9 saya tersedak stopPropagation (), tetapi suka cancelBubble (). Dan beberapa orang / org masih menggunakan IE9 pada tahun 2016, sayangnya. Kita yang memiliki pelanggan korporat tidak dapat mengabaikan itu.
Chris Cober

Saya suka ie5 pada 2019
SuperUberDuper

5

Seperti yang disebutkan orang lain, cobalah stopPropagation() .

Dan ada penangan kedua untuk dicoba: event.cancelBubble = true;Ini adalah penangan khusus IE, tetapi didukung setidaknya FF. Tidak benar-benar tahu banyak tentang itu, karena saya belum menggunakannya sendiri, tetapi mungkin layak dicoba, jika semuanya gagal.


5

Ini adalah contoh yang bagus untuk memahami konsep acara bubbling. Berdasarkan jawaban di atas, kode akhir akan terlihat seperti yang disebutkan di bawah ini. Di mana pengguna mengklik kotak centang, propagasi acara ke elemen induknya 'header' akan dihentikan menggunakan 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

Saat menggunakan jQuery Anda tidak perlu memanggil fungsi stop secara terpisah.

Anda bisa saja kembali false ke event handler

Ini akan menghentikan acara dan membatalkan bubbling ..

Lihat juga event.preventDefault () vs. return false

Dari dokumen jQuery:

Penangan ini, oleh karena itu, dapat mencegah penangan yang didelegasikan untuk memicu dengan menelepon event.stopPropagation()atau kembali false.


1

Kredit ke @mehras untuk kode. Saya baru saja membuat cuplikan untuk menunjukkannya karena saya pikir itu akan dihargai dan saya ingin alasan untuk mencoba fitur itu.

$(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>


Kode yang benar-benar menunjukkan cara menggunakan variabel acara, terima kasih.
Moshe Binieli

-1

Dalam angularjs ini harus berfungsi:

event.preventDefault(); 
event.stopPropagation();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.