मैं $ .serialize () को उन अक्षम: इनपुट तत्वों को कैसे ध्यान में रखूं?


135

ऐसा लगता है कि डिफ़ॉल्ट रूप से अक्षम इनपुट तत्वों को अनदेखा किया गया है $.serialize()। क्या आसपास कोई काम है?


यह भी अजीब है, क्योंकि आप textareaएक विकलांग को input
अनुक्रमित

जवाबों:


233

अस्थायी रूप से उन्हें सक्षम करें।

var myform = $('#myform');

 // Find disabled inputs, and remove the "disabled" attribute
var disabled = myform.find(':input:disabled').removeAttr('disabled');

 // serialize the form
var serialized = myform.serialize();

 // re-disabled the set of inputs that you previously enabled
disabled.attr('disabled','disabled');

26
नीचे एंड्रयू द्वारा वर्णित के readonlyबजाय विचार करने लायक disabled
औरलैब्स

93

अक्षम इनपुट के बजाय आसानी से इनपुट का उपयोग करें:

<input name='hello_world' type='text' value='hello world' readonly />

इसे क्रमबद्ध () द्वारा उठाया जाना चाहिए।


महान, बस एक नोट: सबमिट बटन अभी भी क्लिक करने योग्य है जब केवल-पढ़ने के लिए।
एंड्रे चैलेला

3
विकलांगों को क्रमबद्धता को रोकता है, लेकिन आसानी से सत्यापन को रोकता है
जेफ लोरी

12

आप एक अनुमानित फ़ंक्शन का उपयोग कर सकते हैं (यह दोनों को प्रभावित करता है ) $.serializeArray()और $.serialize():

(function($){
    var proxy = $.fn.serializeArray;
    $.fn.serializeArray = function(){
        var inputs = this.find(':disabled');
        inputs.prop('disabled', false);
        var serialized = proxy.apply( this, arguments );
        inputs.prop('disabled', true);
        return serialized;
    };
})(jQuery);

सबसे अच्छा समाधान, चुनिंदा, चेकबॉक्स, रेडियो, छिपे हुए और अक्षम इनपुट के लिए काम करता है
प्लेसेबो

9

@ user113716 ने मुख्य उत्तर दिया। मेरा योगदान यहाँ केवल एक jQuery के एक समारोह में जोड़कर है:

/**
 * Alternative method to serialize a form with disabled inputs
 */
$.fn.serializeIncludeDisabled = function () {
    let disabled = this.find(":input:disabled").removeAttr("disabled");
    let serialized = this.serialize();
    disabled.attr("disabled", "disabled");
    return serialized;
};

उदाहरण उपयोग:

$("form").serializeIncludeDisabled();

4

इसे इस्तेमाल करे:

<input type="checkbox" name="_key" value="value"  disabled="" />
<input type="hidden" name="key" value="value"/>

क्या आप कृपया थोड़ा और विस्तार कर सकते हैं और ओपी को समझा सकते हैं कि यह क्यों काम करता है?
विलेम मुल्डर

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

3

मैं कुछ वर्कअराउंड देख सकता हूं, लेकिन फिर भी किसी ने अपना खुद का क्रमबद्ध फ़ंक्शन लिखने का सुझाव नहीं दिया है? यहां आप जाएं: https://jsfiddle.net/Lnag9kbc/

var data = [];

// here, we will find all inputs (including textareas, selects etc)
// to find just disabled, add ":disabled" to find()
$("#myform").find(':input').each(function(){
    var name = $(this).attr('name');
    var val = $(this).val();
    //is name defined?
    if(typeof name !== typeof undefined && name !== false && typeof val !== typeof undefined)
    {
        //checkboxes needs to be checked:
        if( !$(this).is("input[type=checkbox]") || $(this).prop('checked'))
            data += (data==""?"":"&")+encodeURIComponent(name)+"="+encodeURIComponent(val);
    }
});

2

अक्षम इनपुट तत्वों को क्रमबद्ध नहीं किया जाता है क्योंकि 'अक्षम' का अर्थ है कि उनका उपयोग नहीं किया जाना चाहिए, प्रति W3C मानक। jQuery अभी मानक का पालन कर रहा है, भले ही कुछ ब्राउज़र न हों। आप इसके चारों ओर काम कर सकते हैं, अक्षम फ़ील्ड के समान मान के साथ एक छिपे हुए फ़ील्ड को जोड़कर, या jQuery के माध्यम से ऐसा कर सकते हैं, कुछ इस प्रकार है:

$('#myform').submit(function() {
  $(this).children('input[hiddeninputname]').val($(this).children('input:disabled').val());
  $.post($(this).attr('url'), $(this).serialize, null, 'html');
});

जाहिर है, अगर आपके पास एक से अधिक अक्षम इनपुट हैं, तो आपको चयनकर्ताओं, आदि से अधिक पुनरावृति करनी होगी।


1

यदि कोई व्यक्ति उन्हें सक्रिय नहीं करना चाहता है, तो उन्हें फिर से अक्षम करें, आप यह करने की कोशिश भी कर सकते हैं (मैंने इसे निष्क्रिय क्षेत्रों से संशोधित किया है जो क्रमबद्ध तरीके से नहीं उठाया गया है , एक प्लगइन का उपयोग करके एक सामान्य फ़ंक्शन का उपयोग करके):

function getcomment(item)
{
  var data = $(item).serializeArray();
  $(':disabled[name]',item).each(function(){
    data.push({name: item.name,value: $(item).val()});
  });
  return data;
}

तो आप उन्हें इस तरह से कॉल कर सकते हैं:

getcomment("#formsp .disabledfield");

1
मैंने आपके फ़ंक्शन की कोशिश की और यह तत्वों के नाम या मूल्य का उत्पादन नहीं करता है। नीचे उदाहरण देखें; code 3: {नाम: अपरिभाषित, मूल्य: ""} 4: {नाम: अपरिभाषित, मूल्य: ""}
ब्लैकमैंबो

0

बस हारून हडॉन पर:

हो सकता है कि आपको इनपुट (चुनिंदा) की तुलना में कुछ और मिला हो, इसलिए मैं बदल गया

this.find(":input:disabled")

सेवा

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