web-dev-qa-db-fra.com

Comment faire en sorte que $ .serialize () prenne en compte les éléments désactivés: input?

Il semble par défaut que les éléments d'entrée désactivés soient ignorés par $.serialize(). Y at-il un travail autour?

121
fms

Activez-les 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');
206
user113716

Utilisez des entrées en lecture seule au lieu d'entrées désactivées:

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

Cela devrait être pris en compte par serialize ().

86
Andrew

Vous pouvez utiliser une fonction mandatée (elle affecte les fonctions $.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);
8
Krzysiek

@ user113716 a fourni la réponse principale. Ma contribution ici n’est qu’une finalité jQuery en y ajoutant une fonction:

/**
 * 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'utilisation:

$("form").serializeIncludeDisabled();
6
Aaron Hudon

Essaye ça:

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

Si quelqu'un ne veut pas les activer, puis les désactiver à nouveau, vous pouvez également essayer de le faire (je l'ai modifié de Les champs désactivés non récupérés par serializeArray, de l'aide d'un plugin à l'aide de 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;
}

Donc, vous pouvez les appeler comme ça: 

getcomment("#formsp .disabledfield");
1
maximran

Les éléments d'entrée désactivés ne sont pas sérialisés, car «désactivés» signifie qu'ils ne doivent pas être utilisés, conformément à la norme W3C. jQuery respecte simplement la norme, même si certains navigateurs ne le font pas. Vous pouvez contourner ce problème en ajoutant un champ masqué avec une valeur identique à celle du champ désactivé, ou en procédant ainsi via jQuery, à peu près 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 à effectuer une itération sur les sélecteurs correspondants, etc.

1
Jason Lewis

Je peux voir quelques solutions de contournement, mais toujours personne ne vous a suggéré d'écrire votre propre fonction de sérialisation? Ici vous allez: 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
David162795

Juste après Aaron Hudon:

Peut-être que vous avez autre chose que Input (comme select), alors j'ai changé 

this.find(":input:disabled")

à

this.find(":disabled")
0
Carl Verret