jQuery serialize不会注册复选框

Ste*_*ven 72 jquery serialization

我正在使用jQuery.serialize来检索表单中的所有数据字段.

我的问题是它没有检索未选中的复选框.

它包括:

<input type="checkbox" id="event_allDay" name="event_allDay" class="checkbox" checked="checked" />
Run Code Online (Sandbox Code Playgroud)

但不是这个

<input type="checkbox" id="event_allDay" name="event_allDay" class="checkbox" />
Run Code Online (Sandbox Code Playgroud)

如何获取未选中的复选框的"值"?

myd*_*rms 75

为了建立在azatoth的天才答案上,我为我的场景略微扩展了它:

    /* Get input values from form */
    values = jQuery("#myform").serializeArray();

    /* Because serializeArray() ignores unset checkboxes and radio buttons: */
    values = values.concat(
            jQuery('#myform input[type=checkbox]:not(:checked)').map(
                    function() {
                        return {"name": this.name, "value": false}
                    }).get()
    );
Run Code Online (Sandbox Code Playgroud)

  • 对我不起作用所以我做了一个小小的调整:return {"name":this.name,"value":'off'} (7认同)

And*_*y E 66

jQuery的 serialize非常模仿标准表单在被附加到请求中的查询字符串或POST主体之前如何被浏览器序列化.浏览器不包含未选中的复选框,这是有道理的,因为它们具有布尔状态 - 它们由用户选择(包括)或未由用户选择(未包括).

如果你需要它在序列化中,你应该问自己"为什么?为什么不检查它在数据中的存在?".

请记住,如果JavaScript序列化表单数据的方式与浏览器的行为方式不同,那么您将消除表单优雅降级的任何可能性.如果您仍然绝对需要这样做,只需使用<select>带有是/否的框作为选项.至少那时,禁用JS的用户不会与您的站点疏远,并且您不会违反HTML规范中定义的行为.

<select id="event_allDay" name="event_allDay">
   <option value="0" selected>No</option>
   <option value="1">Yes</option>
</select>
Run Code Online (Sandbox Code Playgroud)

我曾经在一些网站上看到过这种情况,并且总是在想,"为什么他们不使用复选框"

  • 这将使在DB中存储信息变得容易得多.因为Serialize中的字段数等于表中的字段数.现在我必须控制哪些缺失了. (19认同)
  • 想要未选中的复选框和未设置的单选按钮是一个非常好的案例.这些字段的值可能已存在于服务器上,您只想更新.通过在提交字符串中没有这些值,它假定您每次都在完全覆盖记录. (19认同)
  • @mydog:为什么会出现这种情况?如果你问我,这似乎是一个糟糕的设计选择.如果浏览器提交表单数据,那些字段永远不会出现在查询字符串中,那么为什么要将它设计为与JavaScript不同?一开始你就完全消除了任何优雅降级的可能性. (4认同)

aza*_*oth 26

你没有,因为序列化意味着用作查询字符串,并且在该上下文中,未选中意味着它根本不在查询字符串中.

如果您确实想要获取未选中复选框的值,请使用:(未经测试的课程)

var arr_unchecked_values = $('input[type=checkbox]:not(:checked)').map(function(){return this.value}).get();
Run Code Online (Sandbox Code Playgroud)


Ash*_*Ash 17

如果要在查询字符串中添加未序列化的复选框,请将以下内容添加到jquery提交函数中:

var moreinfo = '';

$('input[type=checkbox]').each(function() {     
    if (!this.checked) {
        moreinfo += '&'+this.name+'=0';
    }
});
Run Code Online (Sandbox Code Playgroud)


Fur*_*ury 5

jQuery 序列化获取输入的 value 属性。

现在如何让复选框和单选按钮工作?如果您将复选框或单选按钮的点击事件设置为 0 或 1,您将能够看到更改。

$( "#myform input[type='checkbox']" ).on( "click", function(){
     if ($(this).prop('checked')){
          $(this).attr('value', 1);
     } else {
          $(this).attr('value', 0);
     }
 }); 

 values = $("#myform").serializeArray();
Run Code Online (Sandbox Code Playgroud)

以及当您想设置复选框时检查状态,例如 php

<input type='checkbox' value="<?php echo $product['check']; ?>" checked="<?php echo $product['check']; ?>" />
Run Code Online (Sandbox Code Playgroud)

  • 这段代码确实有效。它基本上使复选框控件看起来像一个普通的输入(类型为“文本”或“选择”)到“serialize()”函数,通过给复选框一个“值”属性 - 与选中的状态保持同步。而且它比选定的答案更优雅。 (2认同)