如何发布/提交已禁用的输入复选框?


130

在特定条件下,我有一个复选框需要禁用。原来HTTP不会发布禁用的输入。

我该如何解决?提交输入(即使已禁用)并保持输入禁用?


我觉得这个解决方案还有助于在这里:stackoverflow.com/questions/12769664/...
谢尔盖·福明

我觉得这个解决方案还有助于在这里:stackoverflow.com/questions/12769664/...
谢尔盖·福明

Answers:


106

更新READONLY不适用于复选框

您可以使用,disabled="disabled"但此时复选框的值不会出现在POST值中。策略之一是在同一表单中添加一个包含复选框值的隐藏字段,然后从该字段中读回值

只需更改disabledreadonly


7
要使其成为有效的HTML,请将readonly的值专门设置为readonly,即:<input name="foo" value="bar" readonly="readonly" />
Matt Huggins,

5
要使“只读”输入字段像“禁用”字段一样进入“查找”状态,请设置“ style =“ color:grey; background-color:#F0F0F0;””。
丹·尼森鲍姆 Dan Nissenbaum)

3
@MattHuggins为仅属性名称属性(如选中,只读等)设置值,以及在非对属性上的斜杠与HTML有效性无关
-XHTML

顺便说一句:也许有人为此感到迷惑:不要将IT用于输入type =按钮,它们不会被“禁用”,使用“ disabled ='disabled'”
Meister Schnitzel

2
readonly无法使用,因为您将无法发布带有此类标签的disabled复选框的值,无法与隐藏的输入元素一起使用以保持复选框的值,请参阅方法:stackoverflow.com/a/8274787/448816
mikhail-t

91

我已经解决了这个问题。

由于readonly="readonly"代码无法正常运行(我尝试使用其他浏览器),因此必须使用disabled="disabled" 。但是您的复选框的值将不会发布...

这是我的解决方案:

要获得“只读”的外观和POST复选框的值,只需添加一个具有与复选框相同名称和值的隐藏“输入”即可。您必须将其保留在复选框旁边或相同<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


隐藏和复选框输入的ID必须相同吗?
user2167382 2014年

不,Id可以是任何数字,但“名称”和“值”必须相同。
mikhail-t 2014年

在各种浏览器中,这有多可靠?
2014年

该版本已在最新的Chrome,Firefox和IE 11中经过测试并运行良好,这是一个实现,请在您的浏览器中尝试:mvccbl.com/…–
mikhail-t

74

如果您满意使用JQuery,请在提交表单时删除Disabled属性:

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

这会使控件在UI中“启用”吗?
anar khalilov 2014年

它删除了禁用的属性,因此理论上是的。在实践中,我认为用户无法通过用户界面在发生的情况和提交的表单之间更改字段...我想确定一点。
Tristan Channing 2014年

有点陈旧,但请注意:如果您使用<select><textfield>支持disabled属性的其他HTML元素,则可以选择它们并启用以下各项: $( "*:disabled" ).removeAttr("disabled");
Gusstavv Gil 2016年

10

您可以通过这种方式进行处理...对于每个复选框,请创建一个具有相同name属性的隐藏字段。但是,请使用可以测试的默认值来设置该隐藏字段的值。例如..

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

如果在提交表单时选中该复选框,则该表单参数的值为

"agree,false"

如果未选中该复选框,则该值为

"false"

您可以使用任何值代替“ false”,但是您可以理解。


5
当您为问题编写一些复杂的解决方案,然后刷新时,您是否会讨厌它(某人)(例如Francesco)来编写简单的单行代码?;)
jessegavin 2011年

这对我要完成的工作来说是完美的,我希望未经检查的复选框提交一个值而不是什么,谢谢:D。
杰弗里2012年

@jessegavin鉴于他的“简单的班轮”已不再起作用,并且他更新了答案以包括您的答案,不,我不能说我愿意。
RyanfaeScotland

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

我从问题开始:“如何发布/提交已禁用的输入复选框?” 在我的回答中,我跳过了评论:“如果要禁用复选框,我们肯定需要保留前缀值(选中或未选中),并且我们希望用户知道它(否则,我们应该使用隐藏类型,然后而不是复选框)”。在我的回答中,我认为我们希望始终选中一个复选框,并且代码以这种方式工作。如果我们单击该复选框,则将对其进行永久检查,其值将为POSTED / Submitted!以同样的方式,如果我写onclick =“ this.checked = false”而未选中check =“ checked”(注意:默认为未选中),它将永远被取消选中,并且其值将不会为POSTED / Submitted !。


这只会复制该复选框已经执行的操作,但是如果它已被javascript禁用或仍然被禁用,您能否解释一下您要做什么,也许我误会了,因为它只是一行代码
ScottC 2012年


7

最简单的方法是:

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

这将防止用户取消选择此复选框,并且在提交表单时仍将提交其值。如果您希望用户无法选择此复选框,请选中“删除”。

另外,一旦满足特定条件,您就可以使用javascript清除onclick(如果您要这样做的话)。这是一个卑鄙的小提琴,显示了我的意思。这不是完美的,但您有要点。

http://jsfiddle.net/vwUUc/


4

这就像一个魅力:

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

唯一的缺点是,提交时会很快弹出禁用的输入字段。至少在我的情况下,这不是什么大问题!

$('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);

});

3

不要禁用它;而是将其设置为只读,尽管这对禁止用户更改状态没有任何作用。但是您可以使用jQuery来强制执行此操作(防止用户更改复选框的状态:

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

假设您不想修改的所有复选框都具有“只读”属性。例如。

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

这次真是万分感谢!由于某种原因,“隐藏”输入对我不起作用。这救了我。确实很不错!
NewbieProgrammer

3

以来:

  • 根据HTML规范,将readonly属性设置为checkbox无效,
  • 使用隐藏元素提交值不是很好的方法,并且
  • 设置onclick防止更改值的JavaScript也不太好

我将为您提供另一种可能性:

与正常情况一样,将复选框设置为“禁用”。并且在用户提交表单之前,请通过JavaScript启用此复选框。

<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>

由于复选框在提交表单之前已启用,因此其值以常规方式发布。关于此解决方案的唯一令人不愉快的事情是,此复选框启用了一段时间,并且用户可以看到。但这只是我可以接受的细节。


1

不幸的是,没有“简单”的解决方案。该属性readonly不能应用于复选框。我阅读了有关该复选框的W3规范,并找到了罪魁祸首:

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

这将导致未检查状态和禁用状态产生相同的解析值。

  • readonly =“ readonly”不是复选框的有效属性。
  • onclick =“ event.preventDefault();” 并非总是一个好的解决方案,因为它是在复选框本身上触发的。但是在某些情况下它可以发挥作用。
  • 启用复选框onSubmit并不是解决方案,因为该控件仍未被视为成功的控件,因此不会解析该值。
  • 在您的HTML中添加另一个具有相同名称的隐藏输入不起作用,因为第一个控件值被第二个控件值覆盖,因为它具有相同的名称。

唯一的完全验证方法是在提交表单时使用javascript添加具有相同名称的隐藏输入

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

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);
    }
  }
}

这将查找文档中的第一个表单,收集所有输入并搜索禁用的输入。当找到禁用的输入时,将在parentNode中创建一个隐藏的输入,其名称相同,并且值分别为“ on”(如果状态为“ checked”)和“”(如果状态为“-未选中”)。

此功能应由FORM元素中的“ onsubmit”事件触发,如下所示:

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

1

添加onsubmit="this['*nameofyourcheckbox*'].disabled=false"到表单。


1

hidden字段外,没有其他选择,因此请尝试使用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

0
<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是前一个子句的示例,用于管理第二个复选框(根据该子句已选中(发布其值)或未选中(不发布其值),并且用户无法修改其状态;无需管理第二个复选框的任何禁用



0

添加onclick="this.checked=true"解决我的问题:
示例:

<input type="checkbox" id="scales" name="feature[]" value="scales" checked="checked" onclick="this.checked=true" />

0

这是可以从后端控制的另一种解决方法。

ASPX

<asp:CheckBox ID="Parts_Return_Yes" runat="server" AutoPostBack="false" />

在ASPX.CS中

Parts_Return_Yes.InputAttributes["disabled"] = "disabled";
Parts_Return_Yes.InputAttributes["class"] = "disabled-checkbox";

仅出于样式目的添加类。


0

我只是在这里的答案中结合了HTML,JS和CSS建议

HTML:

<input type="checkbox" readonly>

jQuery的:

(function(){
    // Raj: https://stackoverflow.com/a/14753503/260665
    $(document).on('click', 'input[type="checkbox"][readonly]', function(e){
        e.preventDefault();
    });
})();

CSS:

input[type="checkbox"][readonly] {
  cursor: not-allowed;
  opacity: 0.5;
}

由于该元素未“禁用”,因此仍会通过POST。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.