<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
请注意:
-
two
和six
被排除,因为他们有disabled
属性集。 -
three
被发送了两次,因为它有两个同名的有效input。 -
four
是没有发送,因为它是一个checkbox
没有被checked
-
six
,尽pipe被checked
因为disabled
属性有更高的优先级没有被发送。 -
seven
没有name=""
属性发送,所以不提交。
关于您的问题:您可以看到未选中的checkbox因此不会将其名称+值对发送到服务器 – 但是会共享同名的其他input。
像ASP.NET MVC这样的框架通过(暗中)将每个checkbox
input与呈现的HTML中的hidden
input配对来解决这个问题,如下所示:
@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已经被渲染,用户没有检查它 – 而不是SomeBooleanProperty
input被完全呈现。
如果未选中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)); }