【问题标题】:Converting checkboxes to JSON array将复选框转换为 JSON 数组
【发布时间】:2013-11-05 00:22:24
【问题描述】:

我正在尝试在多个复选框具有相同名称的表单上序列化复选框。

<input name="mycheckbox" type="checkbox" value="A"/>A</br>      
<input name="mycheckbox" type="checkbox" value="B"/>B</br>

使用下面的 serializeArray 一切都很好。如果同时检查了 A 和 B,则 JSON.stringify 正确地将 JSON 表示为数组:

{"mycheckbox":["A","B"]}  

但是,如果我只检查了 A,则 JSON 不再表示为数组:

{"mycheckbox":"A"}  

在我正在处理的 RESTful 后端中,我需要始终作为数组传递。有没有办法强制 stringify 将其表示为数组?

var jsonData = JSON.stringify($('form').serializeObject());

$.fn.serializeObject = function () {
    var o = {};
    var a = this.serializeArray();
    $.each(a, function () {
        if (o[this.name] !== undefined) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

【问题讨论】:

    标签: javascript serializearray


    【解决方案1】:

    您必须按名称查找表单中的每个元素并检查它是否为复选框。

    但请注意,拥有多个文本框、密码、文件上传等也是完全有效的。没有什么能以任何方式将表单输入定义为“多个”,除非当您碰巧查看表单时存在两个具有相同名称的成功控件。

    当你知道你需要一个数组时,在后端处理这个可能会更容易。或者使用普通的旧表单编码而不是 JSON 提交表单,然后让后端的 HTTP 库处理它。 (他们中的大多数让您执行request.GET.getall('mycheckbox') 之类的操作以始终获取列表。)

    【讨论】:

      【解决方案2】:

      如果你不想直接修改插件的代码,你可以在之后简单地修改对象。

      var formData = $('form').serializeObject(),
          mycheckboxVal = formData.mycheckbox;
      
      if (!$.isArray(mycheckboxval)) {
          formData.mycheckbox = [mycheckboxval];
      }
      
      //then you serialize
      var jsonData = JSON.stringify(formData);
      

      如果您愿意,也可以在服务器端执行相同的逻辑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-11
        • 2012-02-08
        • 1970-01-01
        • 2014-06-28
        • 1970-01-01
        • 2015-02-06
        • 2017-09-06
        • 2023-01-12
        相关资源
        最近更新 更多