发布未选中的checkbox

我有一个默认选中的checkbox的负载。 我的用户可能会取消选中一些checkbox(如果有),并将其余的选中。 有没有办法获得不是在表单post中检查的checkbox,而不是被检查的checkbox?

为具有不同ID的checkbox添加一个隐藏的input:

<input id='testName' type='checkbox' value='Yes' name='testName'> <input id='testNameHidden' type='hidden' value='No' name='testName'> 

在提交表单之前,根据检查的条件禁用隐藏的input:

 if(document.getElementById("testName").checked) { document.getElementById('testNameHidden').disabled = true; } 

到目前为止,我最喜欢的解决scheme是将隐藏的input与可能未检查的checkbox同名。 我认为它的工作原理是这样的,如果checkbox没有被选中,隐藏的input仍然是成功的并且被发送到服务器,但是如果checkbox被选中,它将覆盖它之前的隐藏input。 这样,您就不必跟踪发布数据中的哪些值将来自checkbox。

 <form> <input type='hidden' value='0' name='selfdestruct'> <input type='checkbox' value='1' name='selfdestruct'> </form> 

围绕这一点的常见技术是随每个checkbox携带一个隐藏variables。

 <input type="checkbox" name="mycheckbox" /> <input type="hidden" name="mycheckbox.hidden"/> 

在服务器端,我们首先检测隐藏variables列表,并且为每个隐藏variables,我们尝试查看相应的checkbox条目是否在表单数据中提交。

服务器端algorithm可能如下所示:

 for input in form data such that input.name endswith .hidden checkboxName = input.name.rstrip('.hidden') if chceckbName is not in form, user has unchecked this checkbox 

上述并不完全回答这个问题,但提供了实现类似function的替代手段。

我个人最喜欢的是添加一个隐藏的字段,如果未选中该checkbox,将会使用相同的名称。 但是解决scheme并不像看起来那么简单。

如果你添加这个代码:

 <form> <input type='hidden' value='0' name='selfdestruct'> <input type='checkbox' value='1' name='selfdestruct'> </form> 

浏览器不会真的关心你在这里做什么。 浏览器将两个参数发送到服务器,服务器必须决定如何处理它们。

例如,PHP将最后一个值作为要使用的值(请参阅: 重复HTTP GET查询键的权威位置 )

但是我使用的其他系统(基于Java)则是这样做的 – 它们只为您提供第一个值。 相反,.NET会给你一个数组而不是两个元素

我将尝试在某个时候用node.js,Python和Perl进行testing。

我通过使用简单的(本机)javascript来解决它:

 <input type="hidden" name="checkboxName" value="0"><input type="checkbox" onclick="this.previousSibling.value=1-this.previousSibling.value"> 

注意不要在这两个input元素之间有任何空格或换行符!

你可以使用this.previousSibling.previousSibling获得“上”元素。

使用PHP,您可以检查指定的隐藏字段为0(未设置)或1(设置)。

你不需要为所有的checkbox创build一个隐藏的字段只是复制我的代码。 它会改变checkbox的值,如果没有选中, value将被赋值为0 ,如果checkbox被选中,则赋值为1

 $("form").submit(function () { var this_master = $(this); this_master.find('input[type="checkbox"]').each( function () { var checkbox_this = $(this); if( checkbox_this.is(":checked") == true ) { checkbox_this.attr('value','1'); } else { checkbox_this.prop('checked',true); //DONT' ITS JUST CHECK THE CHECKBOX TO SUBMIT FORM DATA checkbox_this.attr('value','0'); } }) }) 

你可以在表单的提交事件中做一些Javascript。 这就是你所能做的,但是没有办法让浏览器自己来做这件事。 这也意味着你的表单将会为没有Javascript的用户打破。 更好的方法是在服务器上知道哪些checkbox存在,这样就可以推断出那些没有发布的表单值(PHP中的$_POST )没有被选中。

我会实际做下面的事情。

使用checkboxinput使我的隐藏input字段具有相同的名称

 <input type="hidden" name="checkbox_name[]" value="0" /> <input type="checkbox" name="checkbox_name[]" value="1" /> 

然后当我发布我首先删除$ _POST数组中获取重复值,atfer显示每个唯一值。

  $posted = array_unique($_POST['checkbox_name']); foreach($posted as $value){ print $value; } 

我从一个post得到这个从数组中删除重复的值

 $('input[type=checkbox]').on("change",function(){ var target = $(this).parent().find('input[type=hidden]').val(); if(target == 0) { target = 1; } else { target = 0; } $(this).parent().find('input[type=hidden]').val(target); }); 
 <p> <input type="checkbox" /> <input type="hidden" name="test_checkbox[]" value="0" /> </p> <p> <input type="checkbox" /> <input type="hidden" name="test_checkbox[]" value="0" /> </p> <p> <input type="checkbox" /> <input type="hidden" name="test_checkbox[]" value="0" /> </p> 

如果省略checkbox的名称,则不会传递。 只有test_checkbox数组。

“我已经走了服务器的方法,似乎工作得很好 – 谢谢 – – 达到4thelasers”我想推荐从业主。 至于引用:javascript解决scheme取决于如何服务器处理程序(我没有检查它)

 if(!isset($_POST["checkbox"]) or empty($_POST["checkbox"])) $_POST["checkbox"]="something"; 

我已经试过了Sam的版本。 好主意,但是会导致在同一个表单中有多个元素。 如果您使用任何基于名称查找元素的JavaScript,它现在将返回一组元素。

我已经在PHP中使用了Shailesh的想法,它适用于我。 这是我的代码:

 / *如果原文存在,则删除'.hidden'字段,否则使用'.hidden'值。  * /
 foreach($ _POST ['frmmain'] as $ field_name => $ value)
 {
     //只看看以'.hidden'结尾的元素
     if(!substr($ field_name,-strlen('。hidden'))){
        打破;
     }

     //得到没有'.hidden'的名字
     $ real_name = substr($ key,strlen($ field_name) -  strlen('。hidden'));

     //如果原始文件不存在,用'.hidden'中的值创build一个'假'原始字段
    如果(!array_key_exists($ real_name,$ POST_copy)){
         $ _POST [$ real_name] = $ value;
     }

     //删除'.hidden'元素
    未设置($ _ POST [$ FIELD_NAME]);
 }

您也可以在提交之前截取form.submit事件并进行反向检查

 $('form').submit(function(event){ $('input[type=checkbox]').prop('checked', function(index, value){ return !value; }); }); 

这里的大部分答案都需要使用JavaScript或重复的input控件。 有时这需要完全在服务器端进行处理。

我相信解决这个共同问题的(打算)关键是表单的提交input控制。

要成功解释和处理checkbox的未经检查的值,您需要了解以下内容:

  1. checkbox的名称
  2. 表单的提交input元素的名称

通过检查表单是否被提交(一个值被赋值给提交input元素),可以假定任何未选中的checkbox值。

例如:

 <form name="form" method="post"> <input name="value1" type="checkbox" value="1">Checkbox One<br/> <input name="value2" type="checkbox" value="1" checked="checked">Checkbox Two<br/> <input name="value3" type="checkbox" value="1">Checkbox Three<br/> <input name="submit" type="submit" value="Submit"> </form> 

我使用这个jQuery块,它将在提交时添加一个隐藏的input到每个未经检查的checkbox。 这样可以保证您每次都能为每个checkbox提交一个值,而不会使您的标记混乱,并且有可能忘记在稍后添加的checkbox上进行操作。 对于你使用的任何后端堆栈(PHP,Ruby等)也是不可知的。

 // Add an event listener on #form's submit action... $("#form").submit( function() { // For each unchecked checkbox on the form... $(this).find($("input:checkbox:not(:checked)")).each( // Create a hidden field with the same name as the checkbox and a value of 0 // You could just as easily use "off", "false", or whatever you want to get // when the checkbox is empty. function(index) { var input = $('<input />'); input.attr('type', 'hidden'); input.attr('name', $(this).attr("name")); // Same name as the checkbox input.attr('value', "0"); // or 'off', 'false', 'no', whatever // append it to the form the checkbox is in just as it's being submitted var form = $(this)[0].form; $(form).append(input); } // end function inside each() ); // end each() argument list return true; // Don't abort the form submit } // end function inside submit() ); // end submit() argument list 

我看到这个问题很老,有很多答案,但是我仍然会给我一分钱。 正如一些人指出的,我的投票是在表单的“提交”事件上的javascript解决scheme。 没有加倍的input(特别是如果你有很长的名字和PHP代码混合html的属性),没有服务器端的麻烦(这将需要知道所有字段名称,并逐一检查),只是获取所有未经检查的项目,给他们分配一个0值(或任何你需要表示“未检查”状态),然后将他们的属性“checked”更改为true

  $('form').submit(function(e){ var b = $("input:checkbox:not(:checked)"); $(b).each(function () { $(this).val(0); //Set whatever value you need for 'not checked' $(this).attr("checked", true); }); return true; }); 

这样你将有一个像这样的$ _POST数组:

 Array ( [field1] => 1 [field2] => 0 ) 
 $('form').submit(function () { $(this).find('input[type="checkbox"]').each( function () { var checkbox = $(this); if( checkbox.is(':checked')) { checkbox.attr('value','1'); } else { checkbox.after().append(checkbox.clone().attr({type:'hidden', value:0})); checkbox.prop('disabled', true); } }) }); 

我所做的有点不一样 首先,我改变了所有未经检查的checkbox的值。 到“0”,然后全部选中,这样值就会被提交。

 function checkboxvalues(){ $("#checkbox-container input:checkbox").each(function({ if($(this).prop("checked")!=true){ $(this).val("0"); $(this).prop("checked", true); } }); } 

我宁愿整理$ _POST

 if (!$_POST['checkboxname']) !$_POST['checkboxname'] = 0; 

它介意,如果邮政没有“checkbox名”的价值,它是unckecked,asign一个值。

你可以创build一个你的cckckbox值的数组,并创build一个函数,检查值是否存在,如果没有,它介意没有选中,你可以设置一个值

这可以完全用一些JavaScript来完成,因为未经检查的checkbox不会被传输。 所以你需要JavaScript,例如在幕后添加隐藏的领域取消选中checkbox。 没有JavaScript,这是不能做到的。

Ajax动作示例是(':checked')使用jQuery而不是.val();

  var params = { books: $('input#users').is(':checked'), news : $('input#news').is(':checked'), magazine : $('input#magazine').is(':checked') }; 

params将得到TRUE或FALSE值。

checkbox通常代表存储在数据库中的二进制数据,如Yes / No,Y / N或1/0值。 只有勾选checkbox,HTMLcheckbox才会向服务器发送值。 这意味着其他站点上的服务器脚本必须事先知道网页上所有可能的checkbox,以便能够存储肯定(选中)或否定(未选中)的值。 实际上只有负值是问题(当用户取消选中以前的(预先)检查值 – 如果事先不知道这个名字应该发送,什么都不发送的时候服务器怎么知道这个)。 如果您有一个dynamic创buildUPDATE脚本的服务器端脚本,则会出现问题,因为您不知道应该收到所有checkbox,以便为已选中的值设置Y值,为未选中的(未接收)值设置N值。

由于我在数据库中存储了值“Y”和“N”,并通过页面上的选中和取消选中的checkbox来表示它们,所以我为每个值(checkbox)添加了隐藏字段(checkbox),并使用“Y”和“N”值,然后使用checkbox表示,并使用简单的JavaScript函数check()来根据select来设置if的值。

 <input type="hidden" id="N1" name="N1" value="Y" /> <input type="checkbox"<?php if($N1==='Y') echo ' checked="checked"'; ?> onclick="check(this);" /> <label for="N1">Checkbox #1</label> 

使用一个JavaScript onclick监听器,并为我的网页上的每个checkbox调用函数check():

 function check(me) { if(me.checked) { me.previousSibling.previousSibling.value='Y'; } else { me.previousSibling.previousSibling.value='N'; } } 

这种方式'Y'或'N'值总是被发送到服务器端脚本,它知道什么是应该更新的领域,没有必要将checbox“on”值转换为“Y”或没有收到checkbox到“N ”。

注:空白或新行也是兄弟姐妹,所以在这里我需要.previousSibling.previousSibling.value。 如果之间只有.previousSibling.value没有空格


您不需要像以前那样明确地添加onclick监听器,您可以使用jQuery库dynamic添加带有函数的点击监听器,以将值更改为页面中的所有checkbox:

 $('input[type=checkbox]').click(function() { if(this.checked) { $(this).prev().val('Y'); } else { $(this).prev().val('N'); } }); 

我也喜欢你只是发布额外的input字段的解决scheme,使用JavaScript似乎有点哈克给我。

取决于您使用的后端将取决于哪个input先行。

对于使用第一个事件(JSP)的服务器后端,您应该执行以下操作。

  <input type="checkbox" value="1" name="checkbox_1"/> <input type="hidden" value="0" name="checkbox_1"/> 

对于使用最后一次出现的服务器后端(PHP,Rails),您应该执行以下操作。

  <input type="hidden" value="0" name="checkbox_1"/> <input type="checkbox" value="1" name="checkbox_1"/> 

对于所有出现次数都存储在列表数据types( []array )中的服务器后端。 (Python / Zope)

您可以发布您想要的任何顺序,只需要使用checkboxtypes属性尝试从input中获取值。 因此,如果checkbox位于隐藏元素之前,并且checkbox位于隐藏元素之后,则为最后一个索引。

对于所有出现与逗号连接的服务器后端(ASP.NET / IIS)您需要(使用逗号作为分隔符来分隔/分解)string以创build列表数据types。 ( []

现在,如果checkbox位于隐藏元素之前,您可以尝试抓取列表的第一个索引,如果checkbox位于隐藏元素之后,则抓取最后一个索引。

后端参数处理

图像源

checkbox的问题是,如果他们没有检查,那么他们不张贴与您的表单。 如果您选中checkbox并发布表单,您将获得$ _POSTvariables中的checkbox的值,您可以使用该variables处理表单,如果未选中,将不会将值添加到$ _POSTvariables中。

在PHP中,您通常会通过对checkbox元素执行isset()检查来解决此问题。 如果您期望的元素未在$ _POSTvariables中设置,那么我们知道该checkbox未被选中,并且该值可能为false。

 if(!isset($_POST['checkbox1'])) { $checkboxValue = false; } else { $checkboxValue = $_POST['checkbox1']; } 

但是,如果你创build了一个dynamic表单,那么你不会总是知道你的checkbox的名称属性,如果你不知道checkbox的名称,那么你不能使用isset函数来检查是否已经发送$ _POSTvariables。

有一个更好的解决方法。 首先提供名称属性只有那些checkbox被检查。 然后点击submit ,通过JavaScript的function你检查所有未经检查的框。 所以当你只submit那些将在form collection检索的name属性。

  //removing name attribute from all checked checkboxes var a = $('input:checkbox:checked'); $(a).each(function () { $(this).removeAttr("name"); }); // checking all unchecked checkboxes var b = $("input:checkbox:not(:checked)"); $(b).each(function () { $(this).attr("checked", true); }); 

优点:不需要创build额外的隐藏框,并操纵它们。

@cpburnz得到它的权利,但很多代码,这是使用较less的代码相同的想法:

JS:

 // jQuery OnLoad $(function(){ // Listen to input type checkbox on change event $("input[type=checkbox]").change(function(){ $(this).parent().find('input[type=hidden]').val((this.checked)?1:0); }); }); 

HTML(注意使用数组名称的字段名称):

 <div> <input type="checkbox" checked="checked"> <input type="hidden" name="field_name[34]" value="1"/> </div> <div> <input type="checkbox"> <input type="hidden" name="field_name[35]" value="0"/> </div> <div> 

而对于PHP:

 <div> <input type="checkbox"<?=($boolean)?' checked="checked"':''?>> <input type="hidden" name="field_name[<?=$item_id?>]" value="<?=($boolean)?1:0?>"/> </div> 

@ vishnu的答案jQuery版本。

 if($('#testName').is(":checked")){ $('#testNameHidden').prop('disabled', true); } 

如果您使用jQuery 1.5或更低版本,请使用.attr()函数而不是.prop()

这个解决scheme受@ desw的启发。

如果您的input名称是“窗体样式”,只要选中一个框,您将失去与您的框值相关的数组索引关联,每次检查框时,将此“分解”增加一个单位。 这可能是一种插入类似由某些字段组成的员工的表单的情况,例如:

 <input type="text" name="employee[]" /> <input type="hidden" name="isSingle[] value="no" /> <input type="checkbox" name="isSingle[] value="yes" /> 

如果你一次插入三个员工,而第一个和第二个员工都是单一的,那么你最终会得到一个5元素的isSingle数组,所以你将无法一次遍历三个数组,以便实例,插入员工在数据库中。

你可以用一些简单的数组后处理来克服这个问题。 我在服务器端使用PHP,我这样做:

 $j = 0; $areSingles = $_POST['isSingle']; foreach($areSingles as $isSingle){ if($isSingle=='yes'){ unset($areSingles[$j-1]); } $j++; } $areSingles = array_values($areSingles); 

所以这个解决scheme对于这个问题是矫枉过正的,但是当我在表格中为不同的行出现了相同的checkbox时,它对我有帮助。 我需要知道checkbox代表的行,也知道checkbox的状态(选中/未选中)。

我所做的是从我的checkboxinput的名称属性,给他们所有相同的类,并创build一个隐藏的input,将保存数据的JSON等效。

HTML

  <table id="permissions-table"> <tr> <td> <input type="checkbox" class="has-permission-cb" value="Jim"> <input type="checkbox" class="has-permission-cb" value="Bob"> <input type="checkbox" class="has-permission-cb" value="Suzy"> </td> </tr> </table> <input type="hidden" id="has-permissions-values" name="has-permissions-values" value=""> 

所有的答案都很好,但是如果你有一个同名的表单中有多个checkbox,你想发布每个checkbox的状态。 然后我解决了这个问题,放置一个隐藏的领域与checkbox(名称相关的我想要的)。

 <input type="hidden" class="checkbox_handler" name="is_admin[]" value="0" /> <input type="checkbox" name="is_admin_ck[]" value="1" /> 

然后通过下面的jquery代码控制checkbox的更改状态:

 $(documen).on("change", "input[type='checkbox']", function() { var checkbox_val = ( this.checked ) ? 1 : 0; $(this).siblings('input.checkbox_handler').val(checkbox_val); }); 

现在改变任何checkbox,它会改变相关隐藏字段的值。 而在服务器上,你只能看到隐藏的领域,而不是checkbox。

希望这会帮助有这种types的问题。 欢呼:)

您可以在提交表单之前添加隐藏的元素。

 $('form').submit(function() { $(this).find('input[type=checkbox]').each(function (i, el) { if(!el.checked) { var hidden_el = $(el).clone(); hidden_el[0].checked = true; hidden_el[0].value = '0'; hidden_el[0].type = 'hidden' hidden_el.insertAfter($(el)); } }) });