วิธีหยุดการทำฟองอากาศในช่องทำเครื่องหมายให้คลิก


182

ฉันมีช่องทำเครื่องหมายที่ฉันต้องการดำเนินการบางอย่างของ Ajax ในกิจกรรมคลิกอย่างไรก็ตามช่องทำเครื่องหมายยังอยู่ในคอนเทนเนอร์ด้วยพฤติกรรมการคลิกของตัวเองซึ่งฉันไม่ต้องการเรียกใช้เมื่อคลิกที่ช่องทำเครื่องหมาย ตัวอย่างนี้แสดงสิ่งที่ฉันต้องการทำ:

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

อย่างไรก็ตามฉันไม่สามารถหาวิธีหยุดเหตุการณ์ที่เกิดขึ้นโดยไม่ทำให้เกิดพฤติกรรมการคลิกเริ่มต้น

ทั้งสองอย่างต่อไปนี้หยุดการเดือดปุด ๆ ของเหตุการณ์ แต่ไม่เปลี่ยนสถานะช่องทำเครื่องหมาย:

event.preventDefault();
return false;

2
ฉันพบบทความเกี่ยวกับเรื่องนี้ที่อาจเป็นประโยชน์กับ Stack Overflowers อื่น ๆ เคล็ดลับอย่างรวดเร็ว: คลิกแถวของตารางเพื่อทริกเกอร์กล่องกาเครื่องหมายคลิก
Peder Rice

คำตอบ:


341

แทนที่

event.preventDefault();
return false;

กับ

event.stopPropagation();

event.stopPropagation ()

หยุดเดือดปุด ๆ ของเหตุการณ์ไปยังองค์ประกอบหลักป้องกันไม่ให้ตัวจัดการหลักใด ๆ จากการได้รับแจ้งของเหตุการณ์

event.preventDefault ()

ป้องกันเบราว์เซอร์ไม่ให้ดำเนินการตามค่าเริ่มต้น ใช้เมธอด isDefaultPrevented เพื่อทราบว่าเมธอดนี้เคยถูกเรียก (บนวัตถุเหตุการณ์นั้น)


4
ด้วยเหตุผลบางอย่างสิ่งนี้ไม่ได้ผลสำหรับฉัน แต่กลับมาผิดได้
แรนดี้ L

3
หากคุณกำลังเชื่อมโยงเหตุการณ์โดยใช้.live()วิธีการนี้จะไม่ทำงาน คุณจะต้องใช้return false;ตัวเอง
ราหุล

2
สิ่งนี้ใช้งานได้โดยใช้.on()วิธีของ jQuery (ขณะนี้ไลฟ์เลิกใช้แล้ว) ฉันไม่สามารถเข้าใจได้ว่าทำไมการคืนที่ผิดพลาดจึงไม่ได้ผล
สไตล์

ฉันใช้เวลาสักครู่เพื่อคิดว่า event.preventDefault () ไม่แสดงเครื่องหมายถูกใน IE8 แต่ทำงานได้ดีในเบราว์เซอร์อื่น ฉันพบคำตอบนี้หลังจากที่ฉันแก้ไขแล้ว googling กับ PreventDefault, IE8, ช่องทำเครื่องหมายเป็นคำหลักพาฉันมาที่นี่
signonsridhar

ไม่ทำงาน .. แต่สองบรรทัดนี้ (โดยไม่ส่งคืนเท็จ) -> event.preventDefault (); event.stopPropagation ();
Kugan Kumar


29

อย่าลืม IE:

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

24
คำตอบนี้มาจาก 2012 ในปี 2015 โปรดอย่าลืม IE
Taylan

8
สิ่งนี้ใช้ได้กับ IE9 เช่นกัน เครื่องทดสอบ IE9 ของฉันสำลัก stopPropagation () แต่ชอบ cancelBubble () และบางคน / องค์กรยังคงใช้ IE9 ในปี 2559 น่าเศร้า พวกเราที่มีลูกค้าองค์กรไม่สามารถเพิกเฉยได้
Chris Cober

ฉันรัก ie5 ในปี 2019
SuperUberDuper

5

stopPropagation()เป็นคนอื่นได้กล่าวถึงลอง

และมีตัวจัดการที่สองลอง: event.cancelBubble = true;เป็นตัวจัดการเฉพาะ IE แต่ได้รับการสนับสนุนอย่างน้อย FF ไม่ค่อยรู้อะไรเกี่ยวกับมันมากนักเพราะฉันไม่ได้ใช้มัน แต่มันอาจจะคุ้มค่ากับการยิงถ้าทุกอย่างล้มเหลว


5

นี่เป็นตัวอย่างที่ยอดเยี่ยมสำหรับการทำความเข้าใจแนวคิดเหตุการณ์เดือดปุด ๆ ตามคำตอบข้างต้นรหัสสุดท้ายจะมีลักษณะตามที่ระบุไว้ด้านล่าง ในกรณีที่ผู้ใช้คลิกบนช่องการขยายพันธุ์เหตุการณ์ที่องค์ประกอบหลักของ 'หัว' 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 คุณไม่จำเป็นต้องเรียกใช้ฟังก์ชันหยุดแยกต่างหาก

คุณสามารถส่งคืนfalseในตัวจัดการเหตุการณ์

วิธีนี้จะหยุดกิจกรรมและยกเลิกการเดือดปุด ๆ

ดูที่event.preventDefault () เทียบกับ return false

จากเอกสาร jQuery:

ขนย้ายวัสดุเหล่านี้จึงอาจป้องกันการจัดการที่ได้รับมอบจากวิกฤติโดยการเรียกหรือกลับevent.stopPropagation()false


1

ให้เครดิต@mehrasสำหรับรหัส ฉันเพิ่งสร้างตัวอย่างเพื่อแสดงให้เห็นเพราะฉันคิดว่ามันจะได้รับการชื่นชมและฉันต้องการข้ออ้างที่จะลองใช้คุณสมบัตินั้น

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


รหัสที่แสดงวิธีการใช้ตัวแปรเหตุการณ์จริงขอบคุณ
Moshe Binieli

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.