如何使$ .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();