2013-02-08 38 views
31

मेरे फ़ंक्शन को ट्रिगर करने वाले तत्व के अंदर रखे गए चेकबॉक्स को चेक/अनचेक करने का उचित तरीका क्या होगा?jQuery चेकबॉक्स चेक/अनचेक

<table id="news_list"> 
<tr> 
    <td><input type="checkbox" name="news[1]" /></td> 
    <td>TEXT</td> 
</tr></table> 

$("#news_list tr").click(function() { 
    var ele = $(this).find('input'); 
    if(ele.is(':checked')){ 
     ele.removeAttr('checked'); 
     $(this).removeClass('admin_checked'); 
    }else{ 
     ele.attr('checked', 'checked'); 
     $(this).addClass('admin_checked'); 
    } 
}); 

समस्या मैं जाँच करें और केवल एक बार प्रत्येक बॉक्स अनचेक कर सकते है:

यहाँ मेरी कोड है। कभी-कभी मैंने चेक और अनचेक किए जाने के बाद भी यह कक्षा को जोड़/हटाता है, लेकिन कभी भी बॉक्स को चेक नहीं करता (यहां तक ​​कि जब मैं चेकबॉक्स पर क्लिक करता हूं, तालिका पंक्ति नहीं)।

मैंने .bind ('क्लिक') ट्रिगर का उपयोग करने का प्रयास किया है, लेकिन यह वही परिणाम है।

कोई समाधान?

+0

जवाब को देखते हुए, मैं इतना यकीन है कि वे आपको बस इतना करना कोशिश कर रहे हैं के लिए एक समाधान नहीं दे रहा हूँ। मुझे नहीं लगता कि मूल रूप से चेकबॉक्स को अक्षम करने का अर्थ क्यों होगा, जो कि दिए गए उत्तरों कर रहे हैं (क्योंकि जब आप चेकबॉक्स पर क्लिक करते हैं तो यह चेक हो जाता है और इसका मतलब है कि अगर कथन तुरंत इसे अनचेक कर देगा ... और इसका मतलब है कि आप वास्तव में वास्तविक चेकबॉक्स पर क्लिक करके चेकबॉक्स को कभी भी जांच नहीं सकते ... सही?)। क्या आप यह करना चाहते हैं ?: http://jsfiddle.net/7gbhf/ – Joonas

+0

@ जुनास धन्यवाद, यह वही है जो मुझे चाहिए! जय के जवाब ने सिग्नल पंक्ति के लिए काम किया, न कि – user1587985

+0

अच्छा। हालांकि एक बात है। यदि मेरी जेस्फ़िल बिल्कुल वही है जो आपको चाहिए, मुझे यकीन नहीं है कि मैं देखता हूं कि जय का जवाब एक पंक्ति के लिए कैसे काम करता है। यह आपको चेकबॉक्स पर क्लिक करके चेकबॉक्स की जांच नहीं करने देता है, जो उपरोक्त समझाया गया है तो अगर कथन के कारण है। तो मैं सोच रहा हूं कि आप उस हिस्से को याद करते हैं, या ... मुझे अभी भी पता नहीं है कि आप क्या चाहते थे :) – Joonas

उत्तर

42

उपयोग .prop() का उपयोग करने के बजाय और अगर हम अपने कोड के साथ जाना तो इस तरह की तुलना:

$("#news_list tr").click(function() { 
    var ele = $(this).find(':checkbox'); 
    if ($(':checked').length) { 
     ele.prop('checked', false); 
     $(this).removeClass('admin_checked'); 
    } else { 
     ele.prop('checked', true); 
     $(this).addClass('admin_checked'); 
    } 
}); 

परिवर्तन::

    उदाहरण jsbin पर

    देखो

  1. input से :checkbox बदल गया।
  2. checked checkboxes के the length की तुलना करना।
+0

'prop' ने मेरे लिए काम नहीं किया है, लेकिन jQuery 1.9.1 का उपयोग करके 'हटाएं' और 'attr' किया था। – machineaddict

+0

धन्यवाद, प्रोप ने मेरे लिए एक अलग मुद्दा हल किया है, इसलिए जानकारी का यह टुकड़ा बहुत उपयोगी पाया गया। –

+0

@ निकलीविस आपका स्वागत है। – Jai

19

checked के मान को सेट करने के लिए attr() के बजाय prop() का उपयोग करें। input के बजाय खोजने विधि में :checkbox का भी उपयोग करें और विशिष्ट हो।

Live Demo

$("#news_list tr").click(function() { 
    var ele = $(this).find('input'); 
    if(ele.is(':checked')){ 
     ele.prop('checked', false); 
     $(this).removeClass('admin_checked'); 
    }else{ 
     ele.prop('checked', true); 
     $(this).addClass('admin_checked'); 
    } 
}); 

Use prop instead of attr for properties like checked

jQuery 1.6 के रूप में, .attr() विधि गुण कि सेट नहीं किया गया के लिए अनिर्धारित दिखाता है। निकालते हैं और डोम गुणों को बदलने के इस तरह के जाँच की, चयनित, या निष्क्रिय रूप तत्वों के राज्य के रूप में, .prop() विधि

+0

http://api.jquery.com/checkbox-selector/ क्योंकि: चेकबॉक्स एक jQuery एक्सटेंशन है और नहीं सीएसएस विनिर्देश का हिस्सा, उपयोग करने वाले प्रश्न: चेकबॉक्स मूल DOM querySelectorAll() विधि द्वारा प्रदत्त प्रदर्शन बूस्ट का लाभ नहीं ले सकता है। आधुनिक ब्राउज़रों में बेहतर प्रदर्शन के लिए, इसके बजाय [type = "checkbox"] का उपयोग करें। –

+0

अच्छा काम करता है) धन्यवाद – rusllonrails

+1

असल में यह सही समाधान है। स्वीकृत उत्तर में कुछ समस्या है। इस समाधान के लिए धन्यवाद। – Manik

5
$('mainCheckBox').click(function(){ 
    if($(this).prop('checked')){ 
     $('theControledCheckBoxes').prop('checked', true); 
    }else{ 
     $('theControledCheckBoxes').prop('checked', false); 
    } 
});