Comment puis-je faire $.serialize () tenir compte de ceux qui sont désactivés:éléments d'entrée?

il semble par défaut que les éléments d'entrée désactivés soient ignorés par $.serialize() . Est-il une solution?

117
demandé sur Peter Mortensen 2011-01-20 18:01:21

8 réponses

les activer temporairement.

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');
197
répondu user113716 2011-01-20 15:08:06

utiliser des entrées readonly au lieu des entrées disabled:

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

cela devrait être repris par serialize().

84
répondu Andrew 2018-08-03 03:44:50

vous pouvez utiliser une fonction substituée (elle affecte à la fois $.serializeArray() et $.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);
7
répondu Krzysiek 2018-08-03 03:45:20

@user113716 a fourni la réponse principale. Ma contribution ici est juste une gentillesse jQuery en ajoutant une fonction à elle:

/**
 * 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;
};

exemple d'usage:

$("form").serializeIncludeDisabled();
6
répondu Aaron Hudon 2018-08-03 03:46:24

Désactivé éléments d'entrée ne pas être sérialisé parce que "désactivé" signifie qu'ils ne doivent pas être utilisés, par standard du W3C. jQuery est juste respectant la norme, même si certains navigateurs ne le font pas. Vous pouvez contourner cela, en ajoutant un champ caché avec une valeur identique au champ désactivé, ou en faisant ceci via jQuery, quelque chose comme ceci:

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

évidemment, si vous aviez plus d'une entrée désactivée, vous auriez à itérer sur les sélecteurs correspondants, etc.

1
répondu Jason Lewis 2014-01-29 10:14:58

je peux voir quelques solutions de rechange, mais toujours personne n'a suggéré d'écrire votre propre fonction de sérialisation? Voilà: 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);
    }
});
1
répondu David162795 2015-10-22 08:35:07

essayez ceci:

<input type="checkbox" name="_key" value="value"  disabled="" />
<input type="hidden" name="key" value="value"/>
1
répondu KennyKam 2018-08-03 03:45:33

dans le cas où quelqu'un ne veut pas les activer, puis les désactiver à nouveau, vous pouvez également essayer de le faire (je l'ai modifié de champs désactivés non repris par serializeArray , de l'utilisation d'un plugin à l'utilisation d'une fonction normale):

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

pour que vous puissiez les appeler ainsi:

getcomment("#formsp .disabledfield");
1
répondu maximran 2018-08-03 03:47:28