如何POST /提交inputcheckbox被禁用?

我有一个checkbox,在给定的条件下,需要被禁用。 原来HTTP不会发布禁用的input。

我怎样才能解决这个问题? 提交input即使被禁用,并保持input禁用?

更新READONLY不能在checkbox上工作

您可以使用disabled="disabled"但此时checkbox的值不会显示在POST值中。 其中一个策略是在同一个表单中添加一个隐藏字段来保存checkbox的值,并从该字段中读取值

只需将disabled更改为readonly

我已经解决了这个问题。

由于readonly="readonly"标签不工作(我试过不同的浏览器),所以你必须使用disabled="disabled"来代替。 但是你的checkbox的值不会发布然后…

这是我的解决scheme:

要同时获得“只读”外观和POSTcheckbox的值, 只需添加一个与您的checkbox具有相同名称和值的隐藏“input” 。 您必须将其保留在checkbox旁边或同一个<form></form>标签之间:

 <input type="checkbox" checked="checked" disabled="disabled" name="Tests" value="4">SOME TEXT</input> <input type="hidden" id="Tests" name="Tests" value="4" /> 

此外,只是让你知道readonly="readonly", readonly="true", readonly="",或只是READONLY不会解决这个! 我花了几个小时弄清楚了!

这个参考也是不相关的(可能还没有,或者不再,我不知道): http : //www.w3schools.com/tags/att_input_readonly.asp

如果您很高兴使用JQuery,请在提交表单时移除disabled属性:

 $("form").submit(function() { $("input").removeAttr("disabled"); }); 

你可以这样处理它…对于每个checkbox,创build一个具有相同name属性的隐藏字段。 但是用那些可以testing的默认值设置隐藏字段的值。 例如..

 <input type="checkbox" name="myCheckbox" value="agree" /> <input type="hidden" name="myCheckbox" value="false" /> 

如果checkbox在提交表单时被“检查”,那么表单参数的值将是

 "agree,false" 

如果checkbox没有被选中,那么值就是

 "false" 

你可以使用任何值而不是“假”,但你明白了。

 <input type="checkbox" checked="checked" onclick="this.checked=true" /> 

我从这个问题开始:“如何POST /提交一个禁用的inputcheckbox? 在我的回答中,我跳过了这样的评论:“如果我们想禁用一个checkbox,我们当然需要保留一个前缀值(选中或不选中),我们也希望用户知道它(否则我们应该使用隐藏types和不是checkbox)“。 在我的回答中,我认为我们希望始终保持checkbox被选中,并且代码以这种方式工作。 如果我们点击那个cckckbox,它将被永远检查,它的值将被POSTED /提交! 以同样的方式,如果我写onclick =“this.checked = false”没有checked =“checked”(注意:默认是未选中的),它将被永久取消选中,其值不会被POSTED / Submitted!

最简单的方法是:

 <input type="checkbox" class="special" onclick="event.preventDefault();" checked /> 

这将防止用户能够取消select该checkbox,并且在提交表单时仍然会提交它的值。 如果您希望用户无法select此checkbox,请移除选中的项目。

此外,您可以使用JavaScript来清除onclick一旦满足一定的条件(如果这是你以后)。 这是一个肮脏的小提琴,展示了我的意思。 这不是完美的,但你得到的主意。

http://jsfiddle.net/vwUUc/

这就像一个魅力:

  1. 删除 “禁用”属性
  2. 提交表单
  3. 再次添加属性。 最好的方法是使用setTimeOut函数,例如1毫秒的延迟。

唯一的缺点是提交时禁用的input字段会短暂闪烁 。 至less在我的情况下,这不是一个问题!

 $('form').bind('submit', function () { var $inputs = $(this).find(':input'), disabledInputs = [], $curInput; // remove attributes for (var i = 0; i < $inputs.length; i++) { $curInput = $($inputs[i]); if ($curInput.attr('disabled') !== undefined) { $curInput.removeAttr('disabled'); disabledInputs.push(true); } else disabledInputs.push(false); } // add attributes setTimeout(function() { for (var i = 0; i < $inputs.length; i++) { if (disabledInputs[i] === true) $($inputs[i]).attr('disabled', true); } }, 1); }); 

不要禁用它; 而是将其设置为只读,尽pipe这不会影响用户更改状态。 但是你可以使用jQuery来强制执行(防止用户改变checkbox的状态:

 $('input[type="checkbox"][readonly="readonly"]').click(function(e){ e.preventDefault(); }); 

这假定你不想被修改的所有checkbox都具有“只读”属性。 例如。

 <input type="checkbox" readonly="readonly"> 

以来:

  • 根据HTML规范设置只读属性checkbox无效,
  • 使用隐藏元素来提交值并不是很漂亮的方式
  • 设置onclick防止更改值的JavaScript也不是很好

我会给你提供另一种可能性:

将您的checkbox设置为正常禁用。 在用户提交表单之前,用JavaScript启用此checkbox。

 <script> function beforeSumbit() { var checkbox = document.getElementById('disabledCheckbox'); checkbox.disabled = false; } </script> ... <form action="myAction.do" method="post" onSubmit="javascript: beforeSubmit();"> <checkbox name="checkboxName" value="checkboxValue" disabled="disabled" id="disabledCheckbox" /> <input type="submit /> </form> 

由于该checkbox在提交表单之前已启用,因此其值以常见方式发布。 只有这个解决scheme不太令人愉快的事情是,这个checkbox会被激活一段时间,用户可以看到。 但这只是我可以生活的一个细节。

不幸的是,没有“简单”的解决scheme。 readonly属性不能应用于checkbox。 我读了关于checkbox的W3规范,发现了罪魁祸首:

如果控件在提交表单时没有当前值,则不需要用户代理将其视为成功的控件。http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2

这会导致未检查状态和禁用状态导致相同的分析值。

  • readonly =“只读”不是checkbox的有效属性。
  • 的onclick = “event.preventDefault();” 并不总是一个好的解决scheme,因为它在checkbox本身上触发。 但是在某些场合它可以起作用。
  • 启用checkboxonSubmit不是一个解决scheme,因为该控件仍然不被视为成功的控件,因此该值不会被parsing。
  • 在HTML中添加另一个具有相同名称的隐藏input不起作用,因为第一个控件值被第二个控件值覆盖,因为它具有相同的名称。

唯一完整的方法是在提交表单时添加一个与javascript相同名称的隐藏input

你可以使用我为此制作的小片段:

 function disabled_checkbox() { var theform = document.forms[0]; var theinputs = theform.getElementsByTagName('input'); var nrofinputs = theinputs.length; for(var inputnr=0;inputnr<nrofinputs;inputnr++) { if(theinputs[inputnr].disabled==true) { var thevalueis = theinputs[inputnr].checked==true?"on":""; var thehiddeninput = document.createElement("input"); thehiddeninput.setAttribute("type","hidden"); thehiddeninput.setAttribute("name",theinputs[inputnr].name); thehiddeninput.setAttribute("value",thevalueis); theinputs[inputnr].parentNode.appendChild(thehiddeninput); } } } 

这将查找文档中的第一个表单,收集所有input并search禁用的input。 当find一个禁用的input时,在parentNode中创build一个隐藏的input,它具有相同的名称和值'on'(如果状态是'checked')和''(如果状态是'' – 没有被选中)。

这个函数应该被FORM元素中的'onsubmit'事件触发:

 <form id='ID' action='ACTION' onsubmit='disabled_checkbox();'> 

onsubmit="this['*nameofyourcheckbox*'].disabled=false"添加onsubmit="this['*nameofyourcheckbox*'].disabled=false"

 <html> <head> <script type="text/javascript"> function some_name() {if (document.getElementById('first').checked) document.getElementById('second').checked=false; else document.getElementById('second').checked=true;} </script> </head> <body onload="some_name();"> <form> <input type="checkbox" id="first" value="first" onclick="some_name();"/>first<br/> <input type="checkbox" id="second" value="second" onclick="some_name();" />second </form> </body> </html> 

函数some_name是前一个子句的一个例子,用于pipe理第二个checkbox,该checkbox根据子句进行检查(发布其值)或未选中(不发布其值),并且用户不能修改其状态; 没有必要pipe理任何禁用第二个checkbox

除了hidden字段之外没有其他select,所以请尝试使用hidden字段,如下面的代码所示:

 <input type="hidden" type="text" name="chk1[]" id="tasks" value="xyz" > <input class="display_checkbox" type="checkbox" name="chk1[]" id="tasks" value="xyz" checked="check" disabled="disabled" >Tasks 

您可以根据需要禁用它,然后在提交表单之前删除禁用的属性。

 $('#myForm').submit(function() { $('checkbox').removeAttr('disabled'); });