You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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; 
}; 

关键细节说明

  1. 收集未勾选复选框:通过self.find('input[type="checkbox"]:not(:checked)')筛选出所有未勾选的复选框,用map()把它们转换成和serializeArray()相同格式的对象(包含name和value属性)。
  2. 合并字段数组:用concat()把已勾选控件数组和未勾选复选框数组合并,确保所有字段都被处理。
  3. 默认值处理:如果复选框没有设置value属性,代码会默认赋值为'0',你可以根据实际需求改成其他值(比如''或者false)。

测试你的示例

对于你给出的隐藏复选框:

<input value="0" name="test" style="display: none;" type="checkbox">
  • 未勾选时:函数会收集到{test: "0"}
  • 勾选时:serializeArray()会收集到它的value(同样是"0"),最终结果也是{test: "0"}(如果你的需求是勾选时要其他值,记得修改复选框的value)

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:39:51