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