jquery - not - ¿Cómo hacer que $.serialize() tenga en cuenta los deshabilitados: elementos de entrada?
serialize in json jquery (9)
¿Qué pasa con el uso de entradas de solo lectura en lugar de entradas inhabilitadas?
<input name=''hello_world'' type=''text'' value=''hello world'' readonly />
Esto debería ser recogido por serialize ().
Parece que por defecto los elementos de entrada son ignorados por $.serialize()
,
hay un trabajo alrededor?
@ user113716 proporcionó la respuesta principal, mi contribución aquí es solo una suficiencia de jQuery al agregarle una función.
/**
* 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;
};
Ejemplo de uso:
$("form").serializeIncludeDisabled();
Considere utilizar readonly
lugar de disabled
. Los campos de solo lectura están serializados.
En caso de que alguien no quiera activarlos, deshabilítelos nuevamente, también puede intentar hacer esto: (Modifiqué desde campos Desactivados no recogidos por serializeArray , desde usar el complemento hasta usar una función normal.
function getcomment(item)
{
var data = $(item).serializeArray();
$('':disabled[name]'',item).each(function(){
data.push({name: item.name,value: $(item).val()});
});
return data;
}
para que pueda llamarlos así: getcomment ("# formsp .disabledfield");
Habilítelos temporalmente.
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'');
Los elementos de entrada deshabilitados no se serializan porque ''deshabilitado'' significa que no deben usarse, según el estándar W3C. jQuery simplemente está cumpliendo con el estándar, aunque algunos navegadores no lo hacen. Puede solucionar esto, agregando un campo oculto con un valor idéntico al campo deshabilitado, o haciendo esto a través de jQuery, algo como esto:
$(''#myform'').submit(function() {
$(this).children(''input[hiddeninputname]'').val($(this).children(''input:disabled'').val());
$.post($(this).attr(''url''), $(this).serialize, null, ''html'');
});
Obviamente, si tuviera más de una entrada deshabilitada, tendría que iterar sobre selectores coincidentes, etc.
Puede usar la función de proxy (afectar tanto $.serializeArray()
como $.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);
Puedo ver algunas soluciones, ¿pero nadie sugirió escribir su propia función de serialización? Aquí tienes: 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);
}
});
prueba esto
<input type="checkbox" name="_key" value="value" disabled="" />
<input type="hidden" name="key" value="value"/>