चेकबॉक्स क्लिक पर ईवेंट बबलिंग को कैसे रोकें


182

मेरे पास एक चेकबॉक्स है जिसे मैं क्लिक इवेंट पर कुछ अजाक्स कार्रवाई करना चाहता हूं, हालांकि चेकबॉक्स एक कंटेनर के अंदर भी होता है, जिसमें यह स्वयं क्लिक व्यवहार होता है कि मैं चेकबॉक्स को क्लिक करने पर चलाना नहीं चाहता। यह नमूना दिखाता है कि मैं क्या करना चाहता हूं:

$(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
मुझे इस मामले पर एक लेख मिला जो अन्य स्टैक ओवरफ्लॉवर के लिए सहायक हो सकता है। क्विक टिप: एक चेकबॉक्स पर क्लिक करने के लिए ट्रिगर से टेबल रो पर क्लिक करें
पेडर राइस

जवाबों:


341

बदलने के

event.preventDefault();
return false;

साथ में

event.stopPropagation();

event.stopPropagation ()

किसी भी पैरेंट हैंडलर्स को इवेंट के बारे में सूचित करने से रोकने के लिए, किसी भी मूल हैंडलर्स को किसी ईवेंट के बबलिंग को रोक देता है।

event.preventDefault ()

डिफ़ॉल्ट कार्रवाई को निष्पादित करने से ब्राउज़र को रोकता है। इस विधि को कभी भी उस इवेंट ऑब्जेक्ट पर कॉल किया गया था या नहीं यह जानने के लिए विधि का उपयोग करें .DefaultPrevented।


4
किसी कारण के लिए यह मेरे लिए काम नहीं करता है, लेकिन झूठी वापसी की।
रैंडी एल

3
यदि आप .live()विधि का उपयोग करके घटना को बांध रहे हैं तो यह काम नहीं करेगा। आपको return false;खुद ही इस्तेमाल करना पड़ेगा ।
रहुल

2
यह jQuery की .on()विधि का उपयोग करके काम करता है (लाइव अब पदावनत हो गया है)। मैं यह पता नहीं लगा सका कि क्यों झूठे काम नहीं कर रहे थे।
स्टाइल फेयर

उस घटना का पता लगाने के लिए मैंने काफी समय बिताया। IE8 में चेक मार्क नहीं दिखा रहा था, लेकिन अन्य ब्राउज़रों में अच्छा काम किया। मेरे द्वारा तय किए जाने के बाद मुझे यह उत्तर मिला और फिर कीवर्ड के रूप में preventDefault, IE8, चेकबॉक्स के साथ googling, मुझे यहां लाया।
साइनसोनिरधर

के लिए काम नहीं किया .. लेकिन इस दो लाइन (झूठी वापसी के बिना) -> event.preventDefault (); event.stopPropagation ();
कुगन कुमार


29

IE मत भूलना:

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

23
यह उत्तर 2012 से है। 2015 में कृपया आईई भूल जाते हैं।
तयलन

8
यह IE9 पर भी लागू होता है। मेरा IE9 परीक्षण मशीन स्टॉपप्रॉपैगनेशन () पर चोक करता है, लेकिन कैंसलबुल पसंद करता है ()। और कुछ लोग / संतरे 2016 में अभी भी IE9 का उपयोग कर रहे हैं, दुख की बात है। कॉरपोरेट ग्राहकों के साथ हम में से कोई भी इसे अनदेखा नहीं कर सकता
क्रिस रॉबर्ट

मैं 2019 में आईई 5 से प्यार करता हूं
सुपरब्यूपरडूपर

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 () बनाम गलत रिटर्न देखें

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>


कोड जो वास्तव में दिखाता है कि इवेंट चर का उपयोग कैसे करें, धन्यवाद।
मोशे बिनीली

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.