Answers:
是的,标准行为是仅在选中复选框后才发送值。这通常意味着您需要记住在服务器端期望使用的复选框的方式,因为并非所有数据都从表单返回。
默认值始终为“ on”,这在所有浏览器中都应保持一致。
W3C HTML 4建议中涵盖了这一点:
复选框(和单选按钮)是可以由用户切换的开/关开关。设置控制元素的选中属性时,开关为“ on”。提交表单后,只有“启用”复选框控件才能成功。
<select>
两个选项on
和off
:-)
在HTML中,每个<input />
元素都与一个(但不是唯一的)名称和值对关联。仅当<input />
“成功”时,才在后续请求(在本例中为POST请求正文)中发送该对。
因此,如果您在<form>
DOM中有以下输入:
<input type="text" name="one" value="foo" />
<input type="text" name="two" value="bar" disabled="disabled" />
<input type="text" name="three" value="first" />
<input type="text" name="three" value="second" />
<input type="checkbox" name="four" value="baz" />
<input type="checkbox" name="five" value="baz" checked="checked" />
<input type="checkbox" name="six" value="qux" checked="checked" disabled="disabled" />
<input type="checkbox" name="" value="seven" checked="checked" />
<input type="radio" name="eight" value="corge" />
<input type="radio" name="eight" value="grault" checked="checked" />
<input type="radio" name="eight" value="garply" />
将生成这些名称+值对,并将其提交给服务器:
one=foo
three=first
three=second
five=baz
eight=grault
注意:
two
而six
被排除,因为他们的disabled
属性集。three
被发送两次,因为它具有两个具有相同名称的有效输入。four
没有发送,因为它checkbox
不是checked
six
尽管checked
由于disabled
属性具有较高的优先级而未发送。seven
没有name=""
发送属性,因此未提交。关于您的问题:您可以看到未选中的复选框因此不会将其名称+值对发送到服务器-但其他共享相同名称的输入将与它一起发送。
诸如ASP.NET MVC之类的框架通过(秘密地)将每个checkbox
输入与hidden
呈现的HTML中的输入配对来解决此问题,如下所示:
@Html.CheckBoxFor( m => m.SomeBooleanProperty )
渲染:
<input type="checkbox" name="SomeBooleanProperty" value="true" />
<input type="hidden" name="SomeBooleanProperty" value="false" />
如果用户未选中该复选框,则将以下内容发送到服务器:
SomeBooleanProperty=false
如果用户确实选中了该复选框,则将同时发送两个复选框:
SomeBooleanProperty=true
SomeBooleanProperty=false
但是服务器将忽略该=false
版本,因为它可以看到该=true
版本,因此,如果看不到该版本,=true
则可以确定该复选框已呈现,并且用户没有对其进行检查-与SomeBooleanProperty
完全不呈现输入相反。
[]
在输入名称的末尾使用它,它只会接收一个数组,默认行为是仅提交具有该名称的最后一个元素,因此只要隐藏的输入在复选框之前,它就可以工作。
[]
后缀不是HTML规范的一部分,浏览器不会对其进行特殊处理。没有[]
PHP,将只允许访问单个值(最后一个值)而不是所有值。
如果未选中该复选框,则不会对表单提交中发送的数据有所贡献。
HTML5第4.10.22.4节“ 构造表单数据集”描述了构造表单数据的方式:
如果满足以下任一条件,则跳过此元素的这些子步骤:[...]
字段元素是输入元素,其类型属性处于“复选框”状态,并且其检查度为false。
on
如果value
缺少默认值,则指定默认值:
否则,如果field元素是type属性处于Checkbox状态或Radio单选状态的输入元素,则运行以下嵌套的子步骤:
如果field元素指定了value属性,则让value为该属性的值;否则为false。否则,让value为字符串“ on”。
因此,在表单数据构建过程中会跳过未选中的复选框。
HTML4需要类似的行为。可以期望所有兼容的浏览器都具有这种行为。
当且仅当复选框被选中时,复选框才将值发布为“ on”。掌握了复选框的值,您可以使用隐藏的输入
JS:
var chk = $('input[type="checkbox"]');
chk.each(function(){
var v = $(this).attr('checked') == 'checked'?1:0;
$(this).after('<input type="hidden" name="'+$(this).attr('rel')+'" value="'+v+'" />');
});
chk.change(function(){
var v = $(this).is(':checked')?1:0;
$(this).next('input[type="hidden"]').val(v);
});
HTML:
<label>Active</label><input rel="active" type="checkbox" />
根据HTML 4规范,该规范在几乎所有浏览器中都应保持一致:
http://www.w3.org/TR/html401/interact/forms.html#checkbox
复选框(和单选按钮)是可以由用户切换的开/关开关。设置控制元素的选中属性时,开关为“ on”。提交表单后,只有“启用”复选框控件才能成功。
成功定义如下:
成功的控件对于提交是“有效的”。每个成功的控件都有其控件名称和其当前值,作为提交的表单数据集的一部分。成功的控件必须在FORM元素内定义,并且必须具有控件名称。
输入type =“ hidden” name =“ is_main” value =“ 0”
输入type =“ checkbox” name =“ is_main” value =“ 1”
因此您可以像在应用程序中一样进行控制。如果检查,则发送值1,否则发送0
上述答案都没有令我满意。我发现最好的解决方案是在每个具有相同名称的复选框输入之前包含一个隐藏输入。
<input type="hidden" name="foo[]" value="off"/>
<input type="checkbox" name="foo[]"/>
然后在服务器端,使用一些算法,您将获得更多类似HTML应该提供的内容。
function checkboxHack(array $checkbox_input): array
{
$foo = [];
foreach($checkbox_input as $value) {
if($value === 'on') {
array_pop($foo);
}
$foo[] = $value;
}
return $foo;
}
这将是原始输入
array (
0 => 'off',
1 => 'on',
2 => 'off',
3 => 'off',
4 => 'on',
5 => 'off',
6 => 'on',
),
然后该函数将返回
array (
0 => 'on',
1 => 'off',
2 => 'on',
3 => 'on',
)
我有一个页面(窗体),它可以动态生成复选框,因此这些答案对您有很大的帮助。我的解决方案与这里的许多解决方案非常相似,但我不禁认为它更易于实现。
首先,我将一个隐藏的输入框与我的复选框对齐,即
<td><input class = "chkhide" type="hidden" name="delete_milestone[]" value="off"/><input type="checkbox" name="delete_milestone[]" class="chk_milestone" ></td>
现在,如果所有checkboxes
未选中,则隐藏字段返回的值将全部关闭。
例如,这里有五个动态插入的复选框,其形式POSTS
为以下值:
'delete_milestone' =>
array (size=7)
0 => string 'off' (length=3)
1 => string 'off' (length=3)
2 => string 'off' (length=3)
3 => string 'on' (length=2)
4 => string 'off' (length=3)
5 => string 'on' (length=2)
6 => string 'off' (length=3)
这表明只有第3和第4复选框为 on
或checked
。
实质上,伪输入或隐藏输入字段仅指示所有内容均处于关闭状态,除非off索引下方没有“ on”,这将为您提供所需的索引,而无需一行客户端代码。
。
我用以下代码解决了问题:
HTML表格
<input type="checkbox" id="is-business" name="is-business" value="off" onclick="changeValueCheckbox(this)" >
<label for="is-business">Soy empresa</label>
和javascript函数,方法是更改复选框的值形式:
//change value of checkbox element
function changeValueCheckbox(element){
if(element.checked){
element.value='on';
}else{
element.value='off';
}
}
服务器检查数据发布是“开”还是“关”。我用过playframework java
final Map<String, String[]> data = request().body().asFormUrlEncoded();
if (data.get("is-business")[0].equals('on')) {
login.setType(new MasterValue(Login.BUSINESS_TYPE));
} else {
login.setType(new MasterValue(Login.USER_TYPE));
}