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?
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');
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 ().
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);
@ 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();
Essaye ça:
<input type="checkbox" name="_key" value="value" disabled="" />
<input type="hidden" name="key" value="value"/>
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");
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.
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);
}
});
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")