2012-04-13 11 views
11

शामिल करने के लिए jquery के .serialize को ओवरराइड कैसे कर सकता हूं मैंने सर्वर पर एचटीएमएल चेकबॉक्स पोस्ट करने के कुछ अलग-अलग तरीकों को पढ़ा है, लेकिन मैं वास्तव में $ .serialize को छोड़कर कुछ भी संशोधित किए बिना ऐसा करने के लिए देख रहा हूं। मैं आदर्श रूप में, मैं चेक बॉक्स को पोस्ट करना चाहता हूं, और 0, खाली, या शून्य के रूप में पोस्ट करने के लिए अनचेक किया गया है।मैं अनजान चेकबॉक्स

मैं jquery के आंतरिक कार्यकलापों से थोड़ा उलझन में हूं, लेकिन मुझे यह अब तक मिल गया है, लेकिन यह अनचेक चेकबॉक्स को 'चालू' पर सेट करता है ... क्या कोई मुझे बता सकता है कि नीचे इस संशोधन को कैसे जारी रखा जाए?

$.fn.extend({ 
    serializeArray: function() { 
     return this.map(function(){ 
      return this.elements ? jQuery.makeArray(this.elements) : this; 
     }) 
     .filter(function(){ 
      return this.name && !this.disabled && 
       (this.checked || !this.checked || rselectTextarea.test(this.nodeName) || rinput.test(this.type)); 
     }) 
     .map(function(i, elem){ 
      var val = jQuery(this).val(); 

      return val == null ? 
       null : 
       jQuery.isArray(val) ? 
        jQuery.map(val, function(val, i){ 
         return { name: elem.name, value: val.replace(/\r?\n/g, "\r\n") }; 
        }) : 
        { name: elem.name, value: val.replace(/\r?\n/g, "\r\n") }; 
     }).get(); 
    } 
}); 

उत्तर

-1

यह एक मामूली परिवर्तन है:

.map(function(i, elem){ 
     var val = jQuery(this).val(); 
     if ((jQuery(this).checked != undefined) && (!jQuery(this).checked)) { 
      val = "false"; 
     } 

मैं परीक्षण नहीं किया लेकिन यह सबसे तार्किक दृष्टिकोण लगता है। गुड लक

+0

यह लगभग पूरी तरह से काम किया। मैंने बस jQuery (यह) बदल दिया। JQuery (यह) .prop ('चेक') पर चेक किया गया और यह बहुत अच्छा काम करता है। धन्यवाद! – Jonathon

+0

@ user975571 या कुछ कारणों से 'jQuery (यह) .prop ('चेक')' –

+0

के बजाय 'this.checked'' का सरल उपयोग करें, लेकिन अंत में यह किया गया: jQuery (यह) .prop ('टाइप') == 'चेकबॉक्स' – Jonathon

0

इससे पहले कि आप serialize() कहते हैं, आप स्पष्ट रूप से false के लिए मूल्य निर्धारित करने की आवश्यकता है, तो एक बॉक्स जांचा गया

$(form).find(':checkbox:not(:checked)').attr('value', false); 

मैं इसे here का परीक्षण किया है।

+1

यह मेरे लिए काम नहीं करता है: विशेषता बिल्कुल सही है, लेकिन धारावाहिक अभी भी इसे प्रदर्शित नहीं करता है। आपके टेस्ट पेज में कई चेकबॉक्स हैं, लेकिन धारावाहिक फ़ंक्शन का परीक्षण करने के लिए कोई तरीका नहीं है (जिसे मैं देख सकता हूं) यह देखने के लिए कि वास्तव में यह काम करता है या नहीं। – ibrewster

+0

@ibrewster: आप उन्हें एक फॉर्म में लपेट सकते हैं और सबमिट कर सकते हैं (या $ .post) और सीरियलाइज्ड होने के लिए नेटवर्क टूल्स की जांच करें। मूल्य के बावजूद –

+0

अनचेक चेकबॉक्स सर्वर पर सबमिट नहीं किए जाते हैं (इसलिए यह प्रश्न)। सभी चेकबॉक्स में एक मान होता है, क्योंकि वे "सत्य" के लिए डिफ़ॉल्ट होते हैं या नहीं, आप सेट करते हैं या नहीं। http://stackoverflow.com/questions/11424037/does-input-type-checkbox-only-post-data-if-its-checked – chiliNUT

3

मुझे @Robin Maben का दृष्टिकोण पसंद है (मूल को कॉल करने से पहले चेकबॉक्स को पूर्व-प्रोसेस करना।) (लेकिन) महत्वपूर्ण संशोधन के बिना इसे काम नहीं कर सकता।

मैं इस प्लगइन है, जो मैं "mySerialize" (शायद एक बेहतर नाम की जरूरत है) कहा जाता है के साथ आया था:

$.fn.mySerialize = function(options) { 
    var settings = { 
     on: 'on', 
     off: 'off' 
    }; 
    if (options) { 
     settings = $.extend(settings, options); 
    } 
    var $container = $(this).eq(0), 
     $checkboxes = $container.find("input[type='checkbox']").each(function() { 
      $(this).attr('value', this.checked ? settings.on : settings.off).attr('checked', true); 
     }); 
    var s = ($container.serialize()); 
    $checkboxes.each(function() { 
     var $this = $(this); 
     $this.attr('checked', $this.val() == settings.on ? true : false); 
    }); 
    return s; 
}; 

ओपेरा 11.62 और IE9 में परीक्षण किया गया।

जैसा कि आप इस DEMO में देख सकते हैं, आप चेकबॉक्स 'चालू और बंद राज्यों को mySerialize() पर पैरामीटर के रूप में पारित विकल्प ऑब्जेक्ट के रूप में क्रमबद्ध कर सकते हैं। डिफ़ॉल्ट रूप से, चालू स्थिति को 'name = on' के रूप में क्रमबद्ध किया जाता है और OFF 'name = off' के रूप में बंद किया जाता है। अन्य सभी फॉर्म तत्व देशी jQuery serialize() के अनुसार क्रमबद्ध हैं।

+0

इस पोस्ट के लिए धन्यवाद :) –

+0

यह दूसरी बार काम नहीं करेगा, मुझे यकीन नहीं है कि यह कहां गलत हो रहा है, लेकिन एक बार जब आप फॉर्म पर mySerialize() को कॉल करते हैं और फिर आप mySerialize() को कॉल करते हैं तो यह फिर से काम नहीं करेगा, यह केवल पहली बार काम करता है। –

+0

मुझे jQuery 1.9 और बाद में थोड़ा सा जवाब देना पड़ा। अपडेट के लिए मेरा जवाब देखें। –

5

यह केवल चेक किए गए मानों की बजाय चेक किए गए/अनचेक किए गए मान भेजने के लिए jquery.serialize() विधि को ओवरराइड करेगा। यह सच/गलत का उपयोग करता है, लेकिन यदि आप चाहें तो "this.checked" को "this.checked?" पर ': 0 "पर बदल सकते हैं।

var originalSerializeArray = $.fn.serializeArray; 
$.fn.extend({ 
    serializeArray: function() { 
     var brokenSerialization = originalSerializeArray.apply(this); 
     var checkboxValues = $(this).find('input[type=checkbox]').map(function() { 
      return { 'name': this.name, 'value': this.checked }; 
     }).get(); 
     var checkboxKeys = $.map(checkboxValues, function (element) { return element.name; }); 
     var withoutCheckboxes = $.grep(brokenSerialization, function (element) { 
      return $.inArray(element.name, checkboxKeys) == -1; 
     }); 

     return $.merge(withoutCheckboxes, checkboxValues); 
    } 
}); 
9

मुझे लगता है कि रॉबिन मैबेन के समाधान में एक कदम गुम है जो 'चेक' की संपत्ति रखने के लिए बॉक्स सेट करना है। jQuery के user guide notes on serialise() राज्य है कि केवल चेक किए गए चेकबॉक्स धारावाहिक हैं, इसलिए हम थोड़ा जोड़ने की जरूरत: इस विधि को

$('form').find(':checkbox:not(:checked)').attr('value', '0').prop('checked', true); 

केवल नीचे की ओर सभी इन बॉक्स को चेक दिखा आपके प्रपत्र का एक संक्षिप्त फ़्लैश है - थोड़ा अजीब लग रहा है।

+0

यह उत्तर नीचे दिए गए मेरे उत्तर के लिए प्रेरणा थी: http://stackoverflow.com/a/32189091/34806 –

+0

उत्तर में "केवल नीचे की तरफ" शामिल करने के लिए धन्यवाद :) – tothemario

+0

दिन बचाया! Jquery पर नए लोगों के लिए, serialize से पहले इस कोड का उपयोग करें। –

9

बस डेटा संलग्न करें। मेरे बचाने दिनचर्या यह खाली स्ट्रिंग के रूप में अनियंत्रित प्रस्तुत करने के लिए काफी है और "पर" के रूप में जांच की गई:

var formData = $('form').serialize(); 

// include unchecked checkboxes. use filter to only include unchecked boxes. 
$.each($('form input[type=checkbox]') 
    .filter(function(idx){ 
     return $(this).prop('checked') === false 
    }), 
    function(idx, el){ 
     // attach matched element names to the formData with a chosen value. 
     var emptyVal = ""; 
     formData += '&' + $(el).attr('name') + '=' + emptyVal; 
    } 
); 
+0

मुझे नहीं पता क्यों, लेकिन आपका समाधान serialize को चेकबॉक्स में भी जोड़ रहा है। तो मेरे serialized सरणी में 2 मान एक ही चेकबॉक्स में हैं, एक चेक किया गया है और आखिरी एक अनचेक किया गया है। –

0

मैंने किया, निम्नलिखित अनियंत्रित चेक बॉक्स खोजने, serializeArray बुला, तो उन्हें ऐसा अनचेक रूप से पहले उन्हें जाँच होगा स्थिति एक जैसी होनी उपयोगकर्ता के रूप में छोड़ दिया:

var unchecked = chartCfgForm.find(':checkbox:not(:checked)'); 
unchecked.each(function() {$(this).prop('checked', true)}); 
var formValues = chartCfgForm.serializeArray(); 
unchecked.each(function() {$(this).prop('checked', false)}); 
0

चुकंदर-चुकंदर का जवाब jQuery 1.9 और बाद में मेरे लिए काम नहीं किया। मैंने .val() और .prop() का उपयोग किया, और कंटेनर पर .eq(0) आवश्यकता से छुटकारा पा लिया, जो चयनकर्ता में एक रूप में क्रमबद्ध करने के लिए प्रतिबंधित है। मेरे पास एक दुर्लभ मामला था जहां मुझे एक ही समय में कई रूपों को क्रमबद्ध करना था, इसलिए उस आवश्यकता को हल करने से हल हो गया।

$.fn.mySerialize = function(options) { 
    // default values to send when checkbox is on or off 
    var settings = { 
     on: 'on', 
     off: 'off' 
    }; 

    // override settings if given 
    if (options) { 
     settings = $.extend(settings, options); 
    } 

    // set all checkboxes to checked with the on/off setting value 
    // so they get picked up by serialize() 
    var $container = $(this), 
     $checkboxes = $container.find("input[type='checkbox']").each(function() { 
      $(this).val(this.checked ? settings.on : settings.off).prop('checked', true); 
     }); 

    var serialized = ($container.serialize()); 

    $checkboxes.each(function() { 
     var $this = $(this); 
     $this.prop('checked', $this.val() == settings.on); 
    }); 

    return serialized; 
}; 

आप इसी fiddle here देख सकते हैं: यहाँ मेरी संशोधित समाधान है।

संबंधित मुद्दे