val()
对于复选框控件是否有用是否有一些理由,而对于在每个其他输入控件上一致地获取输入数据有用吗?
e.g。对于复选框,无论复选框状态如何,at似乎始终返回“on”。对于实际上没有“value”属性的其他输入控件,例如select和textarea,它的行为与您期望的一样。参见:
http://jsfiddle.net/jamietre/sdF2h/4/
我无法想到它不会返回true
或false
的充分理由。如果失败了,至少只有在选中时才会返回“on”,而在没有时则返回空字符串。如果失败,至少总是返回一个空字符串,因为复选框没有value
属性!
显然我知道如何使用attr
来获取价值,但这是情况。我正在开发一个简单的(迄今为止无论如何)C#jQuery实现来在服务器上进行HTML解析,我正在努力完全忠实于jQuery的实现,因此它在客户端或服务器上针对相同的DOM表现一致。但这似乎很愚蠢,我很难让自己实际编码“值”,无论如何都要为复选框返回“ON”。但如果我不这样做,那就不一致了。所以我想了解,有这样做的原因吗?它是出于某种目的,还是仅仅是某种神器?是否有人会使用val()
方法对付复选框,如果有,为什么?如果没有,为什么jQuery架构师决定使用这种方法使其无用?
答案 0 :(得分:69)
我想不出一个很好的理由 不会返回真或假。失败 那,至少只有当“开启”时 检查,否则为空字符串。 如果做不到这一点,至少总会回来 一个空字符串,给出复选框 没有价值属性!
复选框确实有值属性。在例如使用它是很常见的。表单中的多个复选框,例如:
<input type="checkbox" name="foo[]" value="1" />
<input type="checkbox" name="foo[]" value="2" />
然后,当用户提交表单时,服务器可以通过检查foo[]
数组的值来解析检查了哪个复选框。复选框的值不会更改是否已选中;浏览器根本不会将未选中复选框的值发送到服务器。如果你这样做。在jQuery中$('#your-form').serialize()
,它的工作方式应该类似;它不应包含未选中复选框的值。如果省略复选框中的值,则默认为on
。
如果你想检查jQuery中是否选中了一个单独的复选框,最好的描述方式是$(this).is(':checked')
答案 1 :(得分:11)
你说“复选框没有value
属性”。相反:value
属性在复选框和单选框上是可选的除了。
[
value
属性]是可选的,除非type属性的值为“radio”或“checkbox”
on
是您忽略规范时浏览器为元素提供的默认值,并且未设置value
属性。
您需要记住值的含义:在提交表单时,它会与元素的name
一起发送到服务器。如果未选中,则不会发送该值。因此,仅在选中复选框时才会发送值on
。
答案 2 :(得分:5)
也许这应该有帮助
$(document).ready(function() {
$('input[type=checkbox]').click(function() {
alert("val="+$(this).val()+",checked="+$(this).attr('checked'));
});
});
使用input[type=checkbox]
选择input type="checkbox"
,因为复选框已输入并输入type =“checkbox”
并且还将值属性设置为复选框。
上<强>更新强>
<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>
和php
if($_POST){
foreach($_POST['ch'] as $post => $value){
echo "$post -> $value <br/>";
}
}
它们都具有相同的名称,因为它们是一组共同的按钮。你知道哪些被检查了,哪些不是通过他们的价值观。
另一种方式是
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>
但是之前似乎增加了更多的动态而不那么乏味(我相信)。
关于@ Capsule的问题
alert("val="+$(this).val()+",checked="+$(this).attr('checked'));
<input type="checkbox"> Check me.
返回值on
我认为这是复选框的默认值。
第二个实验也给出on
值。
我希望我没错。
答案 3 :(得分:3)
如果将数组传递给val函数,如果复选框的值与数组中的值匹配,则会将复选框设置为选中。资料来源:http://api.jquery.com/val/#val-value
<input id="checkbox" type="checkbox" value="remember">
$("#checkbox").val(["remember"]);
答案 4 :(得分:2)
复选框的值与文本框一样,只有在提交时选中了复选框,才会在提交表单时将此值发送到服务器。
与文本框不同,复选框的默认值为on
- 当选中该复选框但没有自己的value
时,会将其发送到服务器,因此处理代码可以知道它被选中了。
因此.val()
方法正常工作,返回元素的值。
你是正确的,jQuery缺少简单的方法来查看是否选择了特定的复选框/单选按钮,类似$("#mycheckbox").checked()
,但这就是我们的插件。 :)
答案 5 :(得分:1)
复选框并不总是单独的,并且在提交表单时会传递其值(否则,名称/值根本不会传递)。
从复选框中创建数组非常有用,您可以使用name="test[]"
作为名称,并在每个中设置不同的值。解析提交的结果时,最终会得到一个包含所有已检查值的数组
答案 6 :(得分:0)
您可以对jquery的val函数进行一些操作以使其表现得像这样。 是否返回值attr,返回true或false。
(function (){
var jval = $.fn.val
function superval(value){
if (value === undefined){
if (this.is("input") && this.attr("type") == "checkbox"){
if (this.attr("value")===undefined){
return this[0].checked
}
}
return jval.call(this)
} else {
return jval.call(this, value)
}
}
$.fn.val = superval
})()
console.log($('<input type="checkbox"/>').val()); // false
console.log($('<input type="checkbox" checked="whatever"/>').val()); // true
console.log($('<input type="checkbox" checked="whatever" value="yes"/>').val()); // yes
console.log($('<input type="text" value="heya"/>').val()); // heya
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>