默认情况下,$.serialize()
会忽略禁用的输入元素。有解决方法吗?
答案 0 :(得分:209)
暂时启用它们。
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');
答案 1 :(得分:88)
使用只读输入而不是禁用输入:
<input name='hello_world' type='text' value='hello world' readonly />
这应该通过serialize()获取。
答案 2 :(得分:9)
您可以使用代理功能(它同时影响$.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);
答案 3 :(得分:7)
@ 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();
答案 4 :(得分:2)
禁用的输入元素不会被序列化,因为根据W3C标准,“禁用”意味着它们不应被使用。 jQuery只是遵守标准,即使有些浏览器没有。你可以解决这个问题,添加一个隐藏字段,其值与禁用字段相同,或者通过jQuery执行此操作,如下所示:
$('#myform').submit(function() {
$(this).children('input[hiddeninputname]').val($(this).children('input:disabled').val());
$.post($(this).attr('url'), $(this).serialize, null, 'html');
});
显然,如果您有多个禁用输入,则必须迭代匹配的选择器等。
答案 5 :(得分:2)
试试这个:
<input type="checkbox" name="_key" value="value" disabled="" />
<input type="hidden" name="key" value="value"/>
答案 6 :(得分:2)
我可以看到一些解决方法,但仍然没有人建议编写自己的序列化功能?在这里: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);
}
});
答案 7 :(得分:1)
如果有人不想激活它们,然后再次禁用它们,您也可以尝试执行此操作(我从 Disabled fields not picked up by serializeArray 修改它,从使用插件到使用正常功能):
function getcomment(item)
{
var data = $(item).serializeArray();
$(':disabled[name]',item).each(function(){
data.push({name: item.name,value: $(item).val()});
});
return data;
}
所以你可以像这样打电话给他们:
getcomment("#formsp .disabledfield");
答案 8 :(得分:0)
就在Aaron Hudon之上:
也许您除了Input之外还有其他东西(例如select),所以我更改了
this.find(":input:disabled")
到
this.find(":disabled")