<input type =“checkbox”/>只有在检查后才发布数据?

浏览器的标准行为是否仅在发送表单时检查checkboxinput值数据?

如果没有提供数值数据,默认值是否始终为“on”?

假设以上是正确的,这是所有浏览器的一致行为?

是的,标准行为是只有在checkbox被选中时才发送的值。 这通常意味着您需要有一种方法来记住您在服务器端期望的checkbox,因为并非所有数据都从表单中返回。

默认值始终为“on”,这应该在浏览器中保持一致。

这在W3C HTML 4的build议中已经介绍过了:

checkbox(和单选button)是可以由用户切换的开/关开关。 控制元素的checked属性设置时,开关处于“on”状态。 提交表单时,只有“打开”checkbox控件才能成功。

在HTML中,每个<input />元素都与一个名称和值对相关联。 只有当<input />是“successful”时,这个对才会在后续的请求中发送(在这个例子中是一个POST请求体)。

所以如果你在<form> DOM中有这些input:

 <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 

请注意:

  • twosix被排除,因为他们有disabled属性集。
  • three被发送了两次,因为它有两个同名的有效input。
  • four是没有发送,因为它是一个checkbox没有被checked
  • six ,尽pipe被checked因为disabled属性有更高的优先级没有被发送。
  • seven没有name=""属性发送,所以不提交。

关于您的问题:您可以看到未选中的checkbox因此不会将其名称+值对发送到服务器 – 但是会共享同名的其他input。

像ASP.NET MVC这样的框架通过(暗中)将每个checkboxinput与呈现的HTML中的hiddeninput配对来解决这个问题,如下所示:

 @Html.CheckBoxFor( m => m.SomeBooleanProperty ) 

呈现:

 <input type="checkbox" name="SomeBooleanProperty" value="true" /> <input type="hidden" name="SomeBooleanProperty" value="false" /> 

如果用户没有selectcheckbox,那么以下内容将被发送到服务器:

 SomeBooleanProperty=false 

如果用户确实选中了checkbox,则两者都将被发送:

 SomeBooleanProperty=true SomeBooleanProperty=false 

但是服务器会忽略=false版本,因为它看到的是=true版本,所以如果看不到=true它可以确定checkbox已经被渲染,用户没有检查它 – 而不是SomeBooleanPropertyinput被完全呈现。

如果未选中checkbox,则不会影响表单提交时发送的数据。

HTML5第4.10.22.4节构build表单数据集描述了表单数据构造的方式:

如果满足以下任一条件,则跳过这个元素的子步骤:[…]

字段元素是一个input元素,其types属性处于checkbox状态,并且其检查是错误的。

然后如果缺less值on则指定默认值on

否则,如果字段元素是一个input元素,其types属性处于checkbox状态或单选button状态,则运行以下嵌套子步骤:

如果字段元素具有指定的值属性,则让值为该属性的值; 否则,让值为string“开”。

因此,在表单数据构build过程中,未勾选的checkbox将被跳过。

在HTML4下需要类似的行为。 从所有兼容的浏览器期望这种行为是合理的。

当且仅当checkbox被选中时,checkbox才会发布值“on”。 捕捉checkbox的值,你可以使用隐藏的input

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

checkbox(和单选button)是可以由用户切换的开/关开关。 控制元素的checked属性设置时,开关处于“on”状态。 提交表单时,只有“打开”checkbox控件才能成功。

成功定义如下:

成功的控制是“有效”的提交。 每个成功的控件都将其控件名称与其当前值配对,作为提交的表单数据集的一部分。 必须在FORM元素中定义一个成功的控件,并且必须有一个控件名称。

浏览器的标准行为是否仅在发送表单时检查checkboxinput值数据?

是的,因为否则就没有可靠的方法来确定checkbox是否被实际检查(如果它改变了值,如果检查所需的值与被检查的值相同,交换到)。

如果没有提供数值数据,默认值是否始终为“on”?

其他答案确认“开”是默认值。 但是,如果您对价值不感兴趣,请使用:

 if (isset($_POST['the_checkbox'])){ // name="the_checkbox" is checked } 

就像ASP.NET变体一样,除了在实际checkbox(同名)之前放置具有相同名称的隐藏input。 只有最后的值将被发送。 这样,如果一个盒子被选中,那么它的名字和值“on”被发送,而如果没有被选中,那么相应隐藏input的名字以及你可能想要给它的任何值都将被发送。 最后,你将得到$ _POST数组读取,其中所有的选中和未选中的元素,“开”和“假”值,没有重复的键。 易于在PHP中处理。

与未经检查的checkbox相同的问题,不会发送表单提交,我出来了另一种解决scheme,而不是镜像checkbox项目。

获取所有未经检查的checkbox

 var checkboxQueryString; $form.find ("input[type=\"checkbox\"]:not( \":checked\")" ).each(function( i, e ) { checkboxQueryString += "&" + $( e ).attr( "name" ) + "=N" }); 

我解决了这个代码的问题:

HTML表单

 <input type="checkbox" id="is-business" name="is-business" value="off" onclick="changeValueCheckbox(this)" > <label for="is-business">Soy empresa</label> 

并通过更改checkbox值的forms的JavaScriptfunction:

 //change value of checkbox element function changeValueCheckbox(element){ if(element.checked){ element.value='on'; }else{ element.value='off'; } } 

并且服务器检查数据post是“开”还是“关”。 我用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)); }