如何使$ .serialize()考虑到那些禁用:input元素?

默认情况下,默认情况下禁用的input元素被$.serialize()忽略,

有工作吗?

暂时启用它们。

 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'); 

如何使用只读input而不是禁用input?

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

这应该被serialize()拾取。

你可以使用代理函数(影响$.serializeArray()$.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); 

禁用的input元素不会被序列化,因为“禁用”意味着它们不应该被使用,按照W3C标准。 jQuery只是遵守标准,即使有些浏览器没有。 你可以通过添加一个隐藏字段来解决这个问题,这个隐藏字段的值与被禁用的字段相同,或者通过jQuery来完成,如下所示:

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

显然,如果你有多个被禁用的input,你必须迭代匹配的select器等。

尝试这个

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

我可以看到一些解决方法,但仍然没有人build议编写自己的序列化函数? 这里你去: 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); } }); 

@ user113716提供了核心的答案,我的贡献在这里只是一个jQuery的好处,通过添加一个函数。

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

用法示例:

 $("form").serializeIncludeDisabled();