jQuery val()和复选框

Jam*_*rgy 60 jquery

是否有一些理由对于val()复选框控件无用,而对于在每个其他输入控件上一致地获取输入数据是有用的?

例如,对于复选框,无论复选框状态如何,at似乎始终返回"on".对于实际上没有"value"属性的其他输入控件,例如select和textarea,它的行为与您期望的一样.看到:

http://jsfiddle.net/jamietre/sdF2h/4/

我想不出一个很好的理由,为什么它不会回来truefalse.如果失败了,至少只有在选中时才会返回"on",而在没有时则返回空字符串.如果失败了,至少总是返回一个空字符串,因为复选框没有value属性!

显然我知道如何使用价值attr,但这是情况.我正在开发一个简单的(迄今为止无论如何)C#jQuery实现来在服务器上进行HTML解析,我正在努力完全忠实于jQuery的实现,因此它在客户端或服务器上针对相同的DOM表现一致.但这似乎很愚蠢,我很难让自己实际编码"值",无论如何都要为复选框返回"ON".但如果我不这样做,那就不一致了.所以我想了解,有这样做的原因吗?它是出于某种目的,还是仅仅是某种神器?有人val()会对复选框使用该方法,如果是这样,为什么?如果没有,为什么jQuery架构师决定使用这种方法使其无用?

rek*_*o_t 71

我想不出一个很好的理由,为什么它不会返回真或假.如果失败了,至少只有在选中时才会返回"on",而在没有时则返回空字符串.如果失败了,至少总是返回一个空字符串,因为复选框没有值属性!

复选框具有值属性.在例如使用它是很常见的.表单中的多个复选框,例如:

<input type="checkbox" name="foo[]" value="1" />
<input type="checkbox" name="foo[]" value="2" />
Run Code Online (Sandbox Code Playgroud)

然后,当用户提交表单时,服务器可以通过检查foo[]数组的值来解析检查了哪个复选框.无论是否选中,复选框的值都不会改变 ; 浏览器根本不会将未选中复选框的值发送到服务器.如果你这样做.$('#your-form').serialize()在jQuery中,它应该类似; 它不应包含未选中复选框的值.如果省略复选框中的值,则默认为on.

如果你想检查是否在jQuery中选中了一个单独的复选框,那么最好的描述方法就是这样做 $(this).is(':checked')

  • 为什么?如果"val"的目的只是返回"value"属性的内容,那么它将毫无意义.这不是它的作用.它返回文本区域的内部HTML,"select"列表的选定选项,以及复选框的"value"属性.在每种其他类型的控件中,它返回与当前表单状态相关的信息.文档将val描述为:"获取匹配元素集中第一个元素的当前值." 然后继续说明.."除了复选框,你可以使用:选中." 这完全是违反直觉的. (14认同)
  • 你知道的就像我理解的那样,我仍然认为更直观的方法是返回真或假.如果你想要的话,你可以随时使用`attr('value').似乎打败了抽象的目的. (7认同)
  • +1,虽然`this.checked`比`$(this).is(':checked')`更好(并且可能快几个数量级). (6认同)
  • 好的.那讲得通.JEES.我已经从HTML中抽象了很长时间,因为asp.net我忘记了复选框如何工作的基础知识. (2认同)

lon*_*day 12

你说"复选框没有value属性".相反:除了复选框和单选框之外,该value属性是可选的.

W3C规范:

[ value属性]是可选的,除非type属性的值为"radio"或"checkbox"

on是忽略规范并且未设置value属性时浏览器为元素提供的默认值.

您需要记住值的含义:name在提交表单时,它将与元素一起发送到服务器.如果未选中,则不会发送该值.on因此,仅在选中复选框时才会发送该值.

  • +1我们每天都学到新东西。谢谢lonesomeday。这很有趣。我已经在网络时代工作了,但从未考虑阅读W3C复选框规范,也没有兴趣研究“启用”的来源,尽管这在我看来很奇怪。(经过许多其他W3C规范等等。)现在我知道了。说得通!现在换个完全不同的东西 (2认同)

San*_*kha 5

也许这应该有所帮助

$(document).ready(function() {
    $('input[type=checkbox]').click(function() {
      alert("val="+$(this).val()+",checked="+$(this).attr('checked'));
    });

});
Run Code Online (Sandbox Code Playgroud)

使用input[type=checkbox]选择input type="checkbox",因为复选框,并输入类型="复选框"

并且还将值属性设置为复选框.

jsfiddle

UPDATE

<form method="post" action="#">
    PHP<input type="checkbox" name="ch[]" value="PHP"><br/>
    JS<input type="checkbox" name="ch[]" value="JS"><br/>
    JAVA<input type="checkbox" name="ch[]" value="JAVA"><br/>
    PYTHON<input type="checkbox" name="ch[]" value="PYTHON"><br/>
    <input type="submit" name="submit"/>
</form>
Run Code Online (Sandbox Code Playgroud)

和PHP

if($_POST){
foreach($_POST['ch'] as $post => $value){
    echo "$post -> $value <br/>";
}
}
Run Code Online (Sandbox Code Playgroud)

它们都具有相同的名称,因为它们是一组共同的按钮.你知道哪个被检查过,哪个不是通过它们的值.

另一种方式是

if($_POST){
    foreach($_POST as $post => $value){
        echo "$post -> $value <br/>";
    }
}

<form method="post" action="#">
    PHP<input type="checkbox" name="PHP"><br/>
    JS<input type="checkbox" name="JS"><br/>
    JAVA<input type="checkbox" name="JAVA"><br/>
    PYTHON<input type="checkbox" name="PYTHON"><br/>
    <input type="submit" name="submit"/>
</form>
Run Code Online (Sandbox Code Playgroud)

但是之前似乎增加了更多的动态和更少的乏味(我相信).

至于@ Capsule的问题

alert("val="+$(this).val()+",checked="+$(this).attr('checked'));
<input type="checkbox"> Check me.
Run Code Online (Sandbox Code Playgroud)

返回值,on我相信这是复选框的默认值.

第二个实验也给出了on价值.

我希望我没错.