2013-04-25 6 views
5

मैं हाल ही में कई चेकबॉक्स के साथ काम कर रहा हूं। मैं .prevenDefault() क्लिक ईवेंट के साथ इस 'समस्या' में आया और मैंने इसके लिए एक समाधान खोजने की कोशिश की। मेरे मामले में मैं यह तय करने में सक्षम होना चाहता था कि चेकबॉक्स को अन्य क्षेत्रों के अनुसार चेक/अनचेक किया जा सकता है या नहीं। कभी-कभी मुझे घटना से पहले एक संवाद खोलना पड़ा। यह तुलना में आसान लगता है ...Jquery चेकबॉक्स .prop रोकें क्लिक करें डीफॉल्ट व्यवहार

this jsFiddle में आप देख सकते हैं कि समस्या क्या है और मैंने इसे हल करने का प्रयास कैसे किया (नीचे कोड भी देखें)। अधिकांश उत्तरों क्लिक के बजाय परिवर्तन का उपयोग करने के लिए निहित हैं। लेकिन आप .preventdefault() का उपयोग नहीं कर सकते हैं।

$('div').off('change','.wtf').on('change', '.wtf', function(e) { 
    //e.preventDefault(); 
    //return false; 
    if($(this).prop('checked') == true) { 
     alert('I am true now, but I must stay false'); 
     $(this).prop('checked', false); 
    } 
    else { 
     alert('I am false now, but I must stay true'); 
     $(this).prop('checked', true); 
    } 
}); 

क्या यह सबसे अच्छा समाधान है? या क्या चेकबॉक्स को तब तक इंतजार करने का कोई अन्य तरीका है जब तक इसे अपने राज्य को बदलने की अनुमति न हो?

उदाहरण के तौर पर: मैं चेकबॉक्स को अनचेक करना चाहूंगा यदि कोई उपयोगकर्ता 'ओके' पर क्लिक करके किसी संवाद में किसी संदेश से सहमत हो।

उत्तर

8

चेकबॉक्स एक विशेष मामला है जहां change ईवेंट और click प्रत्येक-दूसरे को प्रतिस्थापित कर सकते हैं क्योंकि change event को भी चेकबॉक्स पर क्लिक करके निकाल दिया जाता है।

ने कहा कि click और change के बीच एकमात्र बड़ा अंतर .preventDefault() की उपयोगिता है। परिवर्तन घटना उन मामलों में बेहतर है जहां क्लिक करने से किसी भी अन्य तरीकों का उपयोग करके चेकबॉक्स का मूल्य बदला जा रहा है।

इस मामले में आप जो भी चाहें चुनते हैं। एक उदाहरण होगा: Fiddle here

$('input[type="checkbox"]').on('change', function() { 
    var ch = $(this), c; 
    if (ch.is(':checked')) { 
     ch.prop('checked', false); 
     c = confirm('Do you?'); 
     if (c) { 
      ch.prop('checked', true); 
     } 
    } else { 
     ch.prop('checked', true); 
     c = confirm('Are you sure?'); 
     if (c) { 
      ch.prop('checked', false); 
     } 
    } 
}); 
+0

जवाब के लिए धन्यवाद समारोह बंद करो। फिर भी यदि आप अन्य फॉर्म तत्व हैंडलिंग के साथ तुलना करते हैं तो इन चेकबॉक्सों को कुछ हद तक अजीब लगता है ... – Brainfeeder

+0

सच है, वे एक अलग हैं क्योंकि उनके पास मूल्य है लेकिन एक ऑन/ऑफ स्टेटस (चेक किया गया है या नहीं)। और यह उन्हें और अधिक मुश्किल बनाता है। – Spokey

+2

यह भी ध्यान दें, फ़ायरफ़ॉक्स और क्रोम पर घटनाओं को अलग-अलग आग लगाना और बदलना। फ़ायरफ़ॉक्स: पहले क्लिक करें, फिर बदलें। क्रोम: पहले बदलें, फिर क्लिक करें। –

0

मैं कुछ के आधार पर संशोधनों के साथ Spokey समाधान को लागू किया है का उपयोग कर return अगर confirm() रिटर्न true

$("input[name='status']").change(function(e){ 
     if ($(this).is(':checked')){ 
      msg = "{{__('The set status will be Active again! Are you sure?')}}" 
      a = confirm(msg); 
      if (a){ 
       return true; 
      } 
      $(this).prop('checked',false) 
     } 
     else{ 
      msg = "{{__('The set will be Inactive! Are you sure?')}}" 
      a = confirm(msg); 
      if (a){ 
       return true; 
      } 
      $(this).prop('checked',true); 
     } 
    }) 
संबंधित मुद्दे