HTML复选框可以设置为只读吗?

Ele*_*hoy 787 html checkbox

我以为他们可以,但是因为我不把钱放在我的嘴里(可以这么说)设置readonly属性实际上似乎没有做任何事情.

我宁愿不使用Disabled,因为我希望检查复选框与表单的其余部分一起提交,我只是不希望客户端在某些情况下能够更改它们.

小智 516

你可以用这个:

<input type="checkbox" onclick="return false;"/>
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为从click事件返回false会停止执行链继续.

  • 在javascript中返回false会阻止继续执行click或key handler的执行链.与复选框的状态无关 (29认同)
  • 但是,阻止使用TAB导航到下一个输入. (10认同)
  • PS ...如果你想让复选框处于检查状态,你需要添加`checked ="checked"`,而不是搞乱javascript.javascript就是强制鼠标点击在输入对象上被忽略,而不是设置复选框的状态. (9认同)
  • 在这种情况下,没有r/o状态的直观指示. (8认同)
  • 如果禁用javascript,则完全失败! (7认同)
  • 更好的解决方案是 `&lt;input type="checkbox" onchange="this.checked = this.readOnly ? !this.checked : this.checked" readonly="readonly" /&gt;` 这样可以打开或关闭 readOnly随意。 (3认同)

Con*_*oyP 413

READONLY不适用于复选框,因为它会阻止您编辑字段的,但是使用复选框实际上您正在编辑字段的状态(打开||关闭)

来自faqs.org:

重要的是要理解,READONLY只是阻止用户更改字段的值,而不是与字段交互.例如,在复选框中,您可以打开或关闭它们(从而设置CHECKED状态),但不要更改字段的值.

如果您不想使用disabled但仍想提交该值,那么如何将值作为隐藏字段提交,并在不符合编辑条件时将其内容打印给用户呢?例如

// user allowed change
if($user_allowed_edit)
{
    echo '<input type="checkbox" name="my_check"> Check value';
}
else
{
    // Not allowed change - submit value..
    echo '<input type="hidden" name="my_check" value="1" />';
    // .. and show user the value being submitted
    echo '<input type="checkbox" disabled readonly> Check value';
}
Run Code Online (Sandbox Code Playgroud)

  • 工作,但它有点......肮脏,只读复选框应该只是做直觉告诉. (134认同)
  • 直觉并不欺骗美国,它欺骗那些以这种方式实施复选框的人. (115认同)
  • ConroyP解释说,直觉愚弄了我们. (8认同)
  • @ConroyP --&gt;“它阻止您编辑字段的值,但使用复选框您实际上正在编辑字段的状态(开||关)”。对于愚蠢的决定来说,这是一个非常站不住脚的理由。对于我们大多数人来说,“状态”和“价值”与“toMAYto”和“toMAHto”非常相似,正如您从不同意的人的投票中看到的那样。 (2认同)

pow*_*tac 324

这是一个您无法更改的复选框:

<input type="checkbox" disabled="disabled" checked="checked">
Run Code Online (Sandbox Code Playgroud)

只需添加disabled="disabled"为属性即可.


编辑以解决评论:

如果您希望回发数据,则简单的解决方案是将相同的名称应用于隐藏的输入:

<input name="myvalue" type="checkbox" disabled="disabled" checked="checked"/>
<input name="myvalue" type="hidden" value="true"/>
Run Code Online (Sandbox Code Playgroud)

这样,当复选框设置为"禁用"时,它仅用于数据的可视化表示,而不是实际"链接"到数据.在回发中,当禁用复选框时,将发送隐藏输入的值.

  • 请注意,"已禁用"复选框不会通过POST数据发送值. (325认同)
  • 这个答案不可能有105个赞成票.它反对OP所说的一切. (70认同)
  • @powtac你没有解决他想要发布的数据,你的例子没有这样做. (66认同)
  • @MichaelBray我猜这会得到很多赞成,因为很多人都想知道如何只读取复选框,所以他们这样做:1)Google"Checkbox readonly".2)看到这个问题的标题符合他们想要做的并点击它.3)向下滚动,直到找到答案.4)幸福和赞成. (24认同)
  • @nathanhayfield:根据这个逻辑,我应该能够发布有关*any*主题的有用答案并获得upvotes.:( (14认同)
  • @AkshaySinghal因为它为其他不是操作的人服务! (9认同)
  • 为什么这个答案有这么多的赞成?问题清楚地表明,残疾人不能达到目的! (4认同)
  • @ JM4是的,它应该是downvoted,我使用我的第一个downvote,永远!:)(我不会失去代表?!我想我不能失去125). (2认同)
  • 它得到了我的支持,因为它对我需要的东西很好 - 我在面向用户的页面上使用复选框作为状态,但是值(如果它不是只读)已经最终被推入另一个字段,所以我不关心复选框字段本身的值.:) (2认同)

Gra*_*ner 63

<input type="checkbox" onclick="this.checked=!this.checked;">
Run Code Online (Sandbox Code Playgroud)

但是你绝对必须验证服务器上的数据以确保它没有被更改.

  • 我发现这是最好的解决方案; 另外,我可以调用另一段代码(例如,一些jquery-stuff)来显示一个漂亮的小符号,上面写着"直到你第一次做x才能改变它".所以类似于:"... onclick ='this.checked =!this.checked; javascript:theCheckboxWasClicked();'..." (4认同)
  • 如上所述,这在IE中双击时不起作用.我用过:onchange ="this.checked = true;" (2认同)

小智 56

另一个"简单解决方案":

<!-- field that holds the data -->
<input type="hidden" name="my_name" value="1" /> 
<!-- visual dummy for the user -->
<input type="checkbox" name="my_name_visual_dummy" value="1" checked="checked" disabled="disabled" />
Run Code Online (Sandbox Code Playgroud)

disabled ="disabled"/ disabled = true

  • 这解决了所有问题:创建只读复选框、提交 POST 数据并提供只读性的可视化指示(与所有 JavaScript 解决方案相反) (2认同)
  • 你也可以从你的虚拟框中删除`name`和`value`属性,同样`="checked"`和`="diabled"`attrib-values可以被删除.http://www.w3.org/TR/html-markup/input.checkbox.html (2认同)

Fly*_*wat 44

这提出了一些可用性问题.

如果您想显示一个复选框,但不想让它与之互动,为什么即使是一个复选框呢?

但是,我的方法是使用disabled(用户希望禁用复选框不可编辑,而不是使用JS使启用的不可用),并使用javascript添加表单提交处理程序,在表单之前启用复选框提交.通过这种方式,您可以发布您的值.

即是这样的:

var form = document.getElementById('yourform');
form.onSubmit = function () 
{ 
    var formElems = document.getElementsByTagName('INPUT');
    for (var i = 0; i , formElems.length; i++)
    {  
       if (formElems[i].type == 'checkbox')
       { 
          formElems[i].disabled = false;
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 另一个选项是显示禁用的复选框(或图像或任何表示已选中/未选中的内容),并具有由服务器处理的隐藏输入. (22认同)
  • 目的是使用一个复选框作为显示字段"此值为true",这比一堆"true"/"false"-s更容易扫描表格.当然,你可以使用一个图标,但在一个表格中,复选框似乎在那里,适合使用. (7认同)
  • 当你得到一个表格,其中你的某些决定会影响其他一些输入时,这不是一个可用性问题(也就是说:如果你不撤消你的第一个动作,设置一个无法触及的值).我讨厌人们试图改变人们的想法而不是回答(这不是关于你@FlySwat,你回答). (4认同)
  • 假设您有一系列可以包含或不包含的“功能”,因此您有一个显示功能复选框的模板。但有时,功能是其他功能的先决条件……因此必须包含它,但您不想更改模板。这正是禁用/选中复选框的用途。它们一直存在,所以我希望“为什么甚至是复选框”的问题是修辞性的。 (2认同)

Jan*_*Jan 36

<input type="checkbox" readonly="readonly" name="..." />
Run Code Online (Sandbox Code Playgroud)

用jquery:

$(':checkbox[readonly]').click(function(){
            return false;
        });
Run Code Online (Sandbox Code Playgroud)

提供一些视觉提示(css,text,...)仍然是一个好主意,控件不会接受输入.

  • 我使用"data-readonly = true"而不是标准属性,它在所有浏览器中都能正常工作.我更喜欢这个解决方案,而不是其他+1 (3认同)

Osa*_*ved 20

我用它来实现结果:

<input type=checkbox onclick="return false;" onkeydown="return false;" />
Run Code Online (Sandbox Code Playgroud)


Pat*_*ali 19

迟来的答案,但大多数答案似乎过于复杂。

据我了解,OP基本上想要:

  1. 只读复选框以显示状态。
  2. 随表单返回的值。

应该注意的是:

  1. OP 不希望使用该disabled属性,因为他们“希望选中的复选框与表单的其余部分一起提交”。
  2. 未选中的复选框不会随表单一起提交,因为上面 1. 中 OP 的引用表明他们已经知道了。基本上,复选框的值仅在被选中时才存在。
  3. 禁用复选框清楚地表明它不能被设计更改,因此用户不太可能尝试更改它。
  4. 复选框的值不限于指示其状态,例如yesfalse,还可以是任何文本。

因此,由于该readonly属性不起作用,不需要 javascript 的最佳解决方案是:

  1. 一个禁用的复选框,没有名称或值。
  2. 如果复选框要显示为选中状态,则为存储在服务器上的名称和值的隐藏字段。

因此,对于选中的复选框:

<input type="checkbox" checked="checked" disabled="disabled" />
<input type="hidden" name="fieldname" value="fieldvalue" />
Run Code Online (Sandbox Code Playgroud)

对于未选中的复选框:

<input type="checkbox" disabled="disabled" />
Run Code Online (Sandbox Code Playgroud)

禁用输入(尤其是复选框)的主要问题是它们的对比度差,这对于某些具有某些视觉障碍的人来说可能是一个问题。用简单的词来表示一个值可能更好,例如Status: noneStatus: implemented,但在使用后者时包括上面的隐藏输入,例如:

<p>Status: Implemented<input type="hidden" name="status" value="implemented" /></p>
Run Code Online (Sandbox Code Playgroud)


lit*_*die 13

目前的大多数答案都存在以下一个或多个问题:

  1. 只检查鼠标而不是键盘。
  2. 仅检查页面加载。
  3. 钩住曾经流行的更改或提交事件,如果其他东西钩住了它们,则这些事件并不总是有效。
  4. 需要隐藏的输入或其他特殊元素/属性,您必须撤消才能使用 javascript 重新启用复选框。

以下是简单的,没有这些问题。

$('input[type="checkbox"]').on('click keyup keypress keydown', function (event) {
    if($(this).is('[readonly]')) { return false; }
});
Run Code Online (Sandbox Code Playgroud)

如果复选框是只读的,它不会改变。如果不是,它会。它确实使用了 jquery,但您可能已经在使用它了...

有用。

  • 这可以防止 Tab 键在元素获得焦点后离开该元素。 (2认同)

小智 12

我碰巧注意到下面给出的解决方案.发现它是我对同一问题的研究.我不是谁发布它但它不是由我制作的.它使用jQuery:

$(document).ready(function() {
    $(":checkbox").bind("click", false);
});
Run Code Online (Sandbox Code Playgroud)

这将使复选框只读,这将有助于向客户端显示只读数据.


Qwe*_*tiy 9

如果您希望它们以表单形式提交到服务器但不与用户交互,您可以pointer-events: none在 css 中使用(适用于除 IE10- 和 Opera 12- 之外的所有现代浏览器)并设置 tab-index 以 -1防止通过键盘进行更改。另请注意,您不能使用label标签,因为单击它无论如何都会更改状态。

input[type="checkbox"][readonly] {
  pointer-events: none !important;
}

td {
  min-width: 5em;
  text-align: center;
}

td:last-child {
  text-align: left;
}
Run Code Online (Sandbox Code Playgroud)
<table>
  <tr>
    <th>usual
    <th>readonly
    <th>disabled
  </tr><tr>
    <td><input type=checkbox />
    <td><input type=checkbox readonly tabindex=-1 />
    <td><input type=checkbox disabled />
    <td>works
  </tr><tr>
    <td><input type=checkbox checked />
    <td><input type=checkbox readonly checked tabindex=-1 />
    <td><input type=checkbox disabled checked />
    <td>also works
  </tr><tr>
    <td><label><input type=checkbox checked /></label>
    <td><label><input type=checkbox readonly checked tabindex=-1 /></label>
    <td><label><input type=checkbox disabled checked /></label>
    <td>broken - don't use label tag
  </tr>
</table>
Run Code Online (Sandbox Code Playgroud)


gor*_*die 9

我会使用 readonly 属性

<input type="checkbox" readonly>
Run Code Online (Sandbox Code Playgroud)

然后使用 CSS 禁用交互:

input[type='checkbox'][readonly]{
    pointer-events: none;
}
Run Code Online (Sandbox Code Playgroud)

请注意,使用伪类 :read-only 在这里不起作用。

input[type='checkbox']:read-only{ /*not working*/
    pointer-events: none;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案。但忽略了大多数复选框都有关联标签的事实,这将允许单击该复选框。因此,在标签中执行: &lt;label class="form-check-label" for="" title="..." &gt;CBLabel&lt;/label&gt; 。注意“”使用 Tab 键移动也可以正常工作! (7认同)
  • 不过,我认为这不会阻止键盘对其进行检查。 (4认同)
  • 这是迄今为止最好的答案。然而对于 css,我建议也向输入添加标签。就像 - `input[type='checkbox'][readonly], label.form-check-label` 当您用标签包装复选框时。 (3认同)

Rod*_*ira 9

这对我在 Chrome 上有效:

<input type="checkbox" onclick="return false">
Run Code Online (Sandbox Code Playgroud)


小智 8

onclick="javascript: return false;"
Run Code Online (Sandbox Code Playgroud)


Tim*_*nen 7

不可以,输入复选框不能是只读的。

但你可以用 javascript 将它们设置为只读!

随时随地添加此代码,通过防止用户以任何方式修改它,使复选框按假定只读工作。

jQuery(document).on('click', function(e){
      // check for type, avoid selecting the element for performance
      if(e.target.type == 'checkbox') {
          var el = jQuery(e.target);
          if(el.prop('readonly')) {
              // prevent it from changing state
              e.preventDefault();
          }
      }
});
Run Code Online (Sandbox Code Playgroud)
input[type=checkbox][readonly] {
    cursor: not-allowed;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label><input type="checkbox" checked readonly> I'm readonly!</label>
Run Code Online (Sandbox Code Playgroud)

您可以在 jQuery 加载后随时添加此脚本。

它将适用于动态添加的元素。

它的工作原理是拾取页面上任何元素上的单击事件(在更改事件之前发生),然后检查该元素是否是只读复选框,如果是,则阻止更改。

这么多的if是为了不影响页面的性能。


小智 6

<input name="isActive" id="isActive" type="checkbox" value="1" checked="checked" onclick="return false"/>
Run Code Online (Sandbox Code Playgroud)


Rin*_*rge 5

<input type="checkbox" onclick="return false" /> 会对你有用,我正在使用它


sks*_*laj 5

这里的一些答案似乎有点迂回,但这是一个小小的黑客.

<form id="aform" name="aform" method="POST">
    <input name="chkBox_1" type="checkbox" checked value="1" disabled="disabled" />
    <input id="submitBttn" type="button" value="Submit" onClick='return submitPage();'>
</form>?
Run Code Online (Sandbox Code Playgroud)

然后在jquery中,您可以选择以下两个选项之一:

$(document).ready(function(){
    //first option, you don't need the disabled attribute, this will prevent
    //the user from changing the checkbox values
    $("input[name^='chkBox_1']").click(function(e){
        e.preventDefault();
    });

    //second option, keep the disabled attribute, and disable it upon submit
    $("#submitBttn").click(function(){
        $("input[name^='chkBox_1']").attr("disabled",false);
        $("#aform").submit();
    });

});
Run Code Online (Sandbox Code Playgroud)

演示:http: //jsfiddle.net/5WFYt/

  • 而这不是"迂回"? (3认同)

小智 5

readonly不适用于<input type='checkbox'>

因此,如果您需要提交表单中禁用复选框的值,您可以使用 jQuery:

$('form').submit(function(e) {
    $('input[type="checkbox"]:disabled').each(function(e) {
        $(this).removeAttr('disabled');
    })
});
Run Code Online (Sandbox Code Playgroud)

这样,在提交表单时,禁用的属性就会从元素中删除。