如何让jQuery的serializeObject函数获取复选框无论勾选与否的值?
解决serializeObject无法获取未勾选复选框值的问题
这个问题的核心原因很明确:jQuery的serializeArray()方法只会收集已勾选的复选框、单选按钮,以及其他表单控件(比如输入框、下拉框)的有效值,未勾选的复选框根本不会被纳入它的返回结果中。而你当前的serializeObject函数完全依赖serializeArray()的输出,自然拿不到未勾选复选框的值。
修改思路
我们需要先手动收集所有未勾选的复选框的信息,把它们补充到serializeArray()返回的结果里,再用原有的逻辑去处理合并后的完整字段数组,这样就能覆盖所有复选框的状态了。
修改后的完整代码
jQuery.fn.serializeObject = function() { var self = this, json = {}, push_counters = {}, patterns = { "validate": /^[a-zA-Z][a-zA-Z0-9_]*(?:\[(?:\d*|[a-zA-Z0-9_]+)\])*$/, "key": /[a-zA-Z0-9_]+|(?=\[\])/g, "push": /^$/, "fixed": /^\d+$/, "named": /^[a-zA-Z0-9_]+$/ }; this.build = function(base, key, value){ base[key] = value; return base; }; this.push_counter = function(key){ if(push_counters[key] === undefined){ push_counters[key] = 0; } return push_counters[key]++; }; // 关键新增步骤:收集所有未勾选的复选框 var uncheckedCheckboxes = self.find('input[type="checkbox"]:not(:checked)').map(function() { return { name: this.name, value: this.value || '0' // 若复选框未设置value,默认赋值为'0',可根据需求调整 }; }).get(); // 合并已勾选控件和未勾选复选框的字段数组 var allFields = jQuery(this).serializeArray().concat(uncheckedCheckboxes); // 遍历合并后的完整字段数组(替换原有的serializeArray遍历) jQuery.each(allFields, function() { // skip invalid keys if(!patterns.validate.test(this.name)){ return; } var k, keys = this.name.match(patterns.key), merge = this.value, reverse_key = this.name; while((k = keys.pop()) !== undefined){ reverse_key = reverse_key.replace(new RegExp("\\[" + k + "\\]$"), ''); if(k.match(patterns.push)){ merge = self.build([], self.push_counter(reverse_key), merge); } else if(k.match(patterns.fixed)){ merge = self.build([], k, merge); } else if(k.match(patterns.named)){ merge = self.build({}, k, merge); } } json = jQuery.extend(true, json, merge); }); return json; };
关键细节说明
- 收集未勾选复选框:通过
self.find('input[type="checkbox"]:not(:checked)')筛选出所有未勾选的复选框,用map()把它们转换成和serializeArray()相同格式的对象(包含name和value属性)。 - 合并字段数组:用
concat()把已勾选控件数组和未勾选复选框数组合并,确保所有字段都被处理。 - 默认值处理:如果复选框没有设置
value属性,代码会默认赋值为'0',你可以根据实际需求改成其他值(比如''或者false)。
测试你的示例
对于你给出的隐藏复选框:
<input value="0" name="test" style="display: none;" type="checkbox">
- 未勾选时:函数会收集到
{test: "0"} - 勾选时:
serializeArray()会收集到它的value(同样是"0"),最终结果也是{test: "0"}(如果你的需求是勾选时要其他值,记得修改复选框的value)
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

