चेकबॉक्स के माध्यम से लूप करें और चेक किए गए या अनियंत्रित हर एक को गिनें


82

मैं एक मुद्दे की एक बिट में चला गया हूँ। यहाँ एक संक्षिप्त विवरण दिया गया है।

मेरे पास एक मानक फॉर्म में 12 चेक बॉक्स हैं। मुझे क्या करना है उनमें से प्रत्येक के माध्यम से लूप है और जानें कि कौन से चेक किए गए हैं और कौन से अनियंत्रित हैं।

इसका उपयोग करके, मैं तब एक स्ट्रिंग बना सकता हूं जिसे मैं फिर एक डेटाबेस फ़ील्ड में दर्ज करता हूं। यहाँ एक उदाहरण है।

(चेक 1 - चेक किया गया)
( चेक 2 - चेक नहीं किया गया)
(चेक 3 - चेक किया गया)

1,0,1

अब तक, मुझे यह बिट कोड मिल गया है।

$('input[type=checkbox]').each(function () {
           if (this.checked) {
               console.log($(this).val()); 
           }
});

यह पूरी तरह से काम करता है सिवाय इसके कि यह केवल चेक किए गए लोगों को वापस लाता है, सभी को नहीं।

नए प्रश्न के लिए क्षमा करें। मैं jquery के लिए नया हूँ।


5
आपको अपने डेटाबेस स्कीमा को नया स्वरूप देना चाहिए।
SLaks

नया स्वरूप कैसे? क्या प्रत्येक चेक बॉक्स के लिए एक फ़ील्ड होने से बेहतर एक फ़ील्ड में चेक बॉक्स का समूह संग्रहीत नहीं है?
रिचर्ड एम

4
यह स्पष्ट रूप से इस बात पर निर्भर करता है कि चेकबॉक्स क्या हैं, लेकिन आपको संभवतः अलग-अलग फ़ील्ड या एक चाइल्ड टेबल का उपयोग करना चाहिए (एक फ़ील्ड प्रति पंक्ति के साथ [चेक किए गए] चेकबॉक्स)
SLaks

"प्रत्येक चेक बॉक्स के लिए एक फ़ील्ड होने से बेहतर है कि एक फ़ील्ड में चेक बॉक्स का एक समूह संग्रहीत नहीं किया जा रहा है?" नहीं, क्योंकि आपके वाले और शून्य बिट्स के रूप में संग्रहीत नहीं हैं, वे बाइट्स के रूप में संग्रहीत हैं। यदि एक क्षेत्र में अल्पविराम-अलग-मूल्य-बिट-सूची संग्रहीत करने का आपका कारण दक्षता के लिए है, तो अल्पविराम खो दें और इसके बजाय बिटवाइज़ और मास्क संचालन का उपयोग करें। हालांकि, इन दिनों mysql ने बिट डेटा-प्रकार लागू किया है, इसलिए बिटकॉइन और मास्क आवश्यक नहीं हो सकता है, जब तक कि आप क्रेडिट कार्ड चिप्स की प्रोग्रामिंग नहीं कर रहे हैं या आपको कुछ बिल्कुल तेज चाहिए।
ब्लू वाटर

जवाबों:


126

आपके द्वारा दिखाए गए प्रारूप में परिणाम स्ट्रिंग का निर्माण करने के लिए, आप इसका उपयोग कर सकते हैं:

var sList = "";
$('input[type=checkbox]').each(function () {
    sList += "(" + $(this).val() + "-" + (this.checked ? "checked" : "not checked") + ")";
});
console.log (sList);

हालाँकि, मैं @SLaks से सहमत हूँ, मुझे लगता है कि आपको उस संरचना पर फिर से विचार करना चाहिए जिसमें आप इसे अपने डेटाबेस में संग्रहीत करेंगे।

संपादित करें : क्षमा करें, मैं आपके द्वारा खोजे जा रहे आउटपुट प्रारूप को गलत तरीके से पढ़ता हूं। यहाँ एक अद्यतन है:

var sList = "";
$('input[type=checkbox]').each(function () {
    var sThisVal = (this.checked ? "1" : "0");
    sList += (sList=="" ? sThisVal : "," + sThisVal);
});
console.log (sList);

1
जैसा कि मैं समझता हूं, वह 1एस और 0एस पर एक स्ट्रिंग चाहता है ।
SLaks

धन्यवाद। मैं इसे आज़माऊंगा और आपको बताऊंगा।
रिचर्ड एम

हम्म। मैंने यह कोशिश की, लेकिन उसने कंसोल लॉग में संपूर्ण js फ़ाइल प्रदर्शित की।
रिचर्ड एम

1
मैं उपयोग नहीं कर सकते यह लेकिन उपयोग करने की आवश्यकता $ (this)
वि शर्म

1
@ Si8 - मैंने फिडेल को अपडेट किया, इसलिए कोड अचयनित चेकबॉक्स को अनदेखा करता है, जिसे अतिरिक्त कॉमा को कम करना चाहिए: jsfiddle.net/m4k6vj8x
एड स्कीबोर

61

चयनकर्ताओं का उपयोग करना

आप इस तरह से सभी चेक किए गए चेकबॉक्स प्राप्त कर सकते हैं:

var boxes = $(":checkbox:checked");

और इस तरह सभी गैर-चेक किए गए:

var nboxes = $(":checkbox:not(:checked)");

आप इनमें से किसी एक संग्रह के माध्यम से साइकिल चला सकते हैं, और उन नामों को संग्रहीत कर सकते हैं। यदि कुछ भी अनुपस्थित है, तो आप जानते हैं कि इसकी या तो जाँच नहीं की गई थी। PHP में, यदि आपके पास नामों की एक सरणी थी, जिन्हें चेक किया गया था, तो आप बस यह in_array()जानने के लिए अनुरोध कर सकते हैं कि किसी विशेष बॉक्स को बाद की तारीख में चेक किया जाना चाहिए या नहीं।

क्रमबद्ध करें

jQuery में एक क्रमबद्ध विधि भी है जो आपके प्रपत्र नियंत्रण की स्थिति को बनाए रखेगा। उदाहरण के लिए, jQuery की वेबसाइट पर दिया गया उदाहरण निम्नानुसार है:

single=Single2&multiple=Multiple&multiple=Multiple3&check=check2&radio=radio2

यह आपको जानकारी रखने में सक्षम करेगा कि किन तत्वों की जाँच की गई थी।


16

आप लिखकर सभी चेकबॉक्स के माध्यम से लूप कर सकते हैं $(':checkbox').each(...)

यदि मैं आपके प्रश्न को सही ढंग से समझता हूं, तो आप निम्नलिखित कोड ढूंढ रहे हैं:

var str = "";

$(':checkbox').each(function() {
    str += this.checked ? "1," : "0,";
});

str = str.substr(0, str.length - 1);    //Remove the trailing comma

यह कोड सभी चेकबॉक्स के माध्यम से लूप करेगा और एक स्ट्रिंग में 1,या तो जोड़ देगा 0,


धन्यवाद। यह भी एक कोशिश दे देंगे।
रिचर्ड एम

आप मान विशेषता का भी उपयोग कर सकते हैं। यदि आप एक द्विआधारी मान बनाने की कोशिश कर रहे हैं, तो प्रत्येक चेक बॉक्स को 2 की एक शक्ति प्रदान करें और बस चेक किए गए लोगों को जोड़ दें, बाइनरी में राशि जोड़ वाले और शून्य के समान होगी। आप 32 चेक बॉक्स तक सीमित रहेंगे (जावास्क्रिप्ट में सबसे बड़ा संख्यात्मक मान 2 ^ 32 है [मुझे लगता है, 64 हो सकता है। एक बेहतर डेटाबेस डिजाइन अधिक लचीला होगा)
जेसन स्पर्सके

0

मुझे नहीं लगता कि मूल पोस्ट में लाए गए स्कीमा विचारों पर पर्याप्त ध्यान दिया गया था। तो, यहाँ किसी भी newbies के लिए विचार करने के लिए कुछ है।

मान लीजिए कि आपने आगे बढ़कर इस समाधान का निर्माण किया। आपके सभी मासिक धर्म मानों को एक एकल मान में संग्रहीत किया जाता है और डेटाबेस में संग्रहीत किया जाता है। आप वास्तव में अपने डेटाबेस में [थोड़ी] जगह बचा रहे हैं और कुछ समय कोडिंग कर रहे हैं।

अब विचार करते हैं कि आपको वर्तमान चेकबॉक्स 3 और 4 के बीच एक नया चेकबॉक्स जोड़ने का लगातार और आसान काम करना होगा। आपका विकास प्रबंधक, ग्राहक, जो यह अपेक्षा करता है कि यह एक साधारण बदलाव है।

तो आप UI (आसान भाग) में चेकबॉक्स को जोड़ दें। आपका लूपिंग कोड पहले से ही मानों को अलग कर देगा चाहे कितने भी चेकबॉक्स हों। आप यह भी आंकते हैं कि आपका डेटाबेस फ़ील्ड सिर्फ एक varchar या अन्य स्ट्रिंग प्रकार है इसलिए यह ठीक होना चाहिए।

क्या होता है जब ग्राहक या आप परिवर्तन से पहले डेटा को देखने की कोशिश करते हैं? आप अनिवार्य रूप से बाएं से दाएं क्रमबद्ध हैं। हालाँकि, अब 3 के बाद के मान 1 वर्ण द्वारा बंद हो गए हैं। आप अपने सभी मौजूदा डेटा के साथ क्या करने जा रहे हैं? क्या आप कोई एप्लिकेशन लिख रहे हैं, इसे डेटाबेस से वापस खींच लें, इसे नए प्रश्न स्थान के लिए डिफ़ॉल्ट मान में जोड़ने की प्रक्रिया करें और फिर इसे डेटाबेस में वापस स्टोर करें? क्या होता है जब आपके पास एक सप्ताह या महीने में कई नए मूल्य होते हैं? यदि आप स्थानों को स्थानांतरित करते हैं और jQuery उन्हें एक अलग क्रम में संसाधित करता है तो क्या होगा? आपके सभी डेटा को ठीक कर दिया गया है और इसे फिर से व्यवस्थित करने के लिए फिर से तैयार किया जाना है।

एक तंग कुंजी-मूल्य संबंध प्रदान नहीं करने की पूरी अवधारणा लुडाक्रिस है और आपको बाद में के बजाय जल्द ही परेशानी में डाल देगी। आप में से जो इस पर विचार कर रहे हैं, कृपया नहीं। स्कीमा परिवर्तन के अन्य सुझाव ठीक हैं। एक बच्चे की मेज, मुख्य तालिका में अधिक फ़ील्ड, एक प्रश्न-उत्तर तालिका आदि का उपयोग करें। उस डेटा की संरचना को बदलने के अधीन होने पर बस गैर-लेबल डेटा को संग्रहीत न करें।


-1
$.extend($.expr[':'], {
        unchecked: function (obj) {
            return ((obj.type == 'checkbox' || obj.type == 'radio') && !$(obj).is(':checked'));
        }
    });

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