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

Posted

技术标签:

【中文标题】如何发布/提交禁用的输入复选框?【英文标题】:how to POST/Submit an Input Checkbox that is disabled? 【发布时间】:2011-06-11 07:24:35 【问题描述】:

我有一个复选框,在某些情况下,需要禁用它。原来 HTTP 没有发布禁用的输入。

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

【问题讨论】:

我认为这个解决方案在这里也有帮助:***.com/questions/12769664/… 我认为这个解决方案在这里也有帮助:***.com/questions/12769664/… 【参考方案1】:

更新READONLY 不适用于复选框

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

只需将disabled 更改为readonly

【讨论】:

要使其成为有效的html,具体将readonly的值设置为readonly,即:<input name="foo" value="bar" readonly="readonly" /> 要让“只读”输入字段看起来像“禁用”字段,设置 'style="color: gray; background-color: #F0F0F0;"'。 @MattHuggins 为 only-attribute-name 属性设置值,如已检查、只读等...以及非对属性上的结束斜线与 HTML 有效性无关 - 这些是 XHTML 有效性所必需的。 .. 顺便说一句:也许有人对此感到困惑:不要将其用于输入 type= 按钮,它们不会被“禁用”,请使用“disabled='disabled'” readonly 将不起作用,因为您将无法发布带有此类标签的复选框的值,请使用 disabled 以及隐藏的输入元素来保存复选框的值,看看如何: ***.com/a/8274787/448816【参考方案2】:

我已经解决了这个问题。

由于 readonly="readonly" 标签不起作用(我尝试过不同的浏览器),您必须使用 disabled="disabled" 反而。但是您的复选框的值将不会发布...

这是我的解决方案:

要同时获得 “readonly” 外观和 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 必须相同? 不,Id 可以是任何值,但 'name' 和 'value' 必须相同。 这在各种浏览器中的可靠性如何? 这在最新的 Chrome、Firefox 和 IE 11 中已经过测试并且运行良好,这是一个实现,请在您的浏览器中尝试:mvccbl.com/…【参考方案3】:

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

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

【讨论】:

这会使控件在 UI 中“启用”吗? 它删除了 disabled 属性,所以理论上是的。在实践中,我不认为用户可以通过 UI 在发生这种情况和提交表单之间更改字段......我很想知道。 有点旧,但作为旁注:如果您使用 &lt;select&gt;&lt;textfield&gt; 或其他支持 disabled 属性的 HTML 元素,您可以选择它们并启用所有:$( "*:disabled" ).removeAttr("disabled"); 【参考方案4】:

创建一个css类例如:

.disable
        pointer-events: none;
        opacity: 0.5;

应用这个类而不是禁用属性

【讨论】:

这是一个很好的解决方案。唯一的缺点是它仍然可以通过键盘访问。【参考方案5】:

您可以这样处理...为每个复选框创建一个具有相同name 属性的隐藏字段。但是使用您可以测试的一些默认值设置该隐藏字段的值。比如……

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

如果在提交表单时复选框被“选中”,那么该表单参数的值将是

"agree,false"

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

"false"

你可以使用任何值来代替“false”,但你明白了。

【讨论】:

当你为一个问题写一些复杂的解决方案,然后当你刷新时,有人(比如 Francesco)去写一个简单的单行,你不讨厌它吗? ;) 这非常适合我想要完成的工作,我希望未选中的复选框提交一个值而不是什么,谢谢:D。 @jessegavin 鉴于他的“简单的一个班轮”不再有效,并且他更新了他的答案以包括你的一个,不,我不能说我这样做。【参考方案6】:

最简单的方法是:

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

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

此外,一旦满足特定条件(如果这是您所追求的),您就可以使用 javascript 清除 onclick。这是一个肮脏的小提琴,显示了我的意思。它并不完美,但你明白了要点。

http://jsfiddle.net/vwUUc/

【讨论】:

工作就像一个魅力:)【参考方案7】:
<input type="checkbox" checked="checked" onclick="this.checked=true" />

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

【讨论】:

这将简单地复制复选框已经做的事情,但如果它已被 javascript 或其他东西禁用它仍然会被禁用,你能解释一下你想要什么,也许我误解了因为它只是一行代码【参考方案8】:

这就像一个魅力:

    删除“禁用”属性 提交表格 再次添加属性。最好的方法是使用 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);

);

【讨论】:

【参考方案9】:

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

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

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

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

【讨论】:

谢谢你!出于某种原因,“隐藏”输入对我不起作用。这救了我。确实非常不错!【参考方案10】:

自:

根据 HTML 规范,将只读属性设置为复选框无效, 使用隐藏元素提交值不是很好的方式,而且 设置阻止更改值的 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>

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

【讨论】:

【参考方案11】:

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

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

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

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

做到这一点的唯一完全证明方法是在提交表单时添加一个与 javascript 同名的隐藏输入

你可以使用我为此制作的小sn-p:

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

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

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

HTML:

<input type="checkbox" readonly>

jQuery:

(function()
    // Raj: https://***.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。

【讨论】:

【参考方案15】:
<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 是前一个子句的示例,用于根据子句管理第二个复选框被选中(发布其值)或未选中(不发布其值)并且用户不能修改其状态;无需管理第二个复选框的任何禁用

【讨论】:

【参考方案16】:

您可以根据需要将其保持禁用状态,然后在提交表单之前删除 disabled 属性。

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

【讨论】:

【参考方案17】:

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

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

【讨论】:

【参考方案18】:

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

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

仅出于样式目的添加类。

【讨论】:

以上是关于如何发布/提交禁用的输入复选框?的主要内容,如果未能解决你的问题,请参考以下文章

如果选中/取消选中复选框,则启用/禁用提交按钮?

如何根据 Reactstrap 的复选框启用/禁用输入字段

Shiny r-单击后如何禁用复选框组输入?

如何从 AngularJS 输入中禁用我的复选框?

视觉上禁用复选框,但允许它仍然提交其值

html 选中“禁用提交直到”复选框