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


817

我以为可以,但是由于我没有把钱花在嘴上(可以这么说),设置readonly属性实际上并没有任何作用。

我宁愿不使用“已禁用”,因为我希望选中的复选框与表单的其余部分一起提交,所以我只是不希望客户在某些情况下能够更改它们。


39
(恶意)客户端始终可以更改复选框的值(或发送任意请求)。始终确保您进行正确的服务器端验证!
knittl

4
@knittl但是普通访问者没有(恶意)客户端。和正常位访客不想改变的信息(即的培训就业处readonly
基督教Gollhardt

3
@knittl您似乎无视了readonly!那么为什么这个属性会存在!
伊扎尔·阿兹米(Izhar Aazmi)2014年

10
@IzharAazmi:readonly只是一个客户端属性,可帮助浏览器正确呈现网站,然后从中构造正确的请求。服务器不能也不应该知道readonly渲染页面的属性。它必须假设该请求来自任何地方(并且可能出于恶意目的);永远不要依赖用户提供的输入。不过,为什么还要发送无法在请求中进行编辑的复选框的值(如果在渲染前设置了该值,则在提交请求时便已经知道该值,因此无需在请求中传输它)
knittl

4
@knittl我同意!但是您会readonly因为某些原因看到属性存在。它与服务器端实现毫无关系。但这是告诉用户“嘿!这里假定为这个值,和/但您不能更改它。”
伊扎尔·阿兹米(Izhar Aazmi)2014年

Answers:


538

您可以使用此:

<input type="checkbox" onclick="return false;"/>

之所以可行,是因为单击事件返回false会停止执行链。


29
在javascript中返回false会阻止继续执行点击或键处理程序。与复选框的状态无关
Jessica Brown

9
PS ...如果您希望复选框处于选中状态,则需要添加checked="checked",而不要弄乱JavaScript。javascript只是在其中强制在输入对象上忽略鼠标单击,而不是设置复选框的状态。
杰西卡·布朗

8
在这种情况下,没有可视的r / o状态指示。
Jesse Glick 2013年

11
但是,禁止使用TAB导航到下一个输入。
user327961 2013年

7
如果禁用了javascript,则完全失败!
Doin 2015年

419

READONLY在复选框上不起作用,因为它阻止您编辑字段的,但是使用复选框实际上是在编辑字段的状态(| | off)

来自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';
}

135
可以用,但是有点脏..复选框上的只读应该只是凭直觉就能做到。
levhita

8
正如ConroyP解释的那样,直觉愚弄了我们。
ANeves,2010年

120
直觉并不愚弄美国,它愚弄了以这种方式实施复选框的人。
卡利夫(Califf)2013年

@ConroyP->“它阻止您编辑字段的值,但是带有复选框,您实际上是在编辑字段的状态(打开||关闭)”。对于一个笨拙的决定来说,这确实是一个微不足道的理由。对我们大多数人而言,“状态”和“价值”与“ toMAYto”和“ toMAHto”大致相同,正如您所持反对意见的人的投票所表明的那样。
McAuley

343

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

<input type="checkbox" disabled="disabled" checked="checked">

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


编辑以解决评论:

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

<input name="myvalue" type="checkbox" disabled="disabled" checked="checked"/>
<input name="myvalue" type="hidden" value="true"/>

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


331
请注意,“已禁用”复选框不会通过POST数据发送值。
biphobe 2011年

66
@powtac您无法解决他要发布数据的问题,您的示例没有这样做。
DavidMårtensson'02

70
这个答案不可能有105票赞成票。它违反了OP规定的所有内容。
2012年

15
@nathanhayfield:按照这种逻辑,我应该能够发布有关任何主题的有用答案并获得投票。:(
Michael Bray

24
@MichaelBray我猜想这会引起很多反对,因为很多人想知道如何将复选框设置为只读,因此他们可以这样做:1)Google“复选框”为只读。2)看到该问题的标题与他们想要的内容匹配,然后单击它。3)向下滚动,直到找到该答案。4)幸福和支持。
马克·拜尔斯2013年

63
<input type="checkbox" onclick="this.checked=!this.checked;">

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


4
我发现这是最好的解决方案。另外,我可以调用另一段代码(例如,一些jquery-stuff)来显示一个漂亮的小标志,上面写着“您必须先做x才能更改它”。就像这样:“ ... onclick ='this.checked =!this.checked; javascript:theCheckboxWasClicked();'...“
Bane

这不会像powtac的答案一样使框灰白,因此得到了我的投票
EHarpham 2013年

这是一个小技巧,但这是一个巧妙,完美,几乎优雅的小技巧。
罗素2013年

最佳解决方案。应标记为正确答案。
Scottie 2014年

3
如上所述,这不适用于双击IE。我曾经使用过:onchange =“ this.checked = true;”
瑞提凯诗2015年

57

另一个“简单解决方案”:

<!-- 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" />

disabled =“ disabled” / disabled = true


1
这解决了所有问题:创建只读复选框,提交POST数据,并提供可视化指示(与所有javascript解决方案相比)
Dalibor Frivaldsky 2014年

2
你也可以下车name,并value从虚拟盒属性,也="checked"="diabled"ATTRIB值可以下车。w3.org/TR/html-markup/input.checkbox.html
Sampo Sarrala-codidact.org 2014年

最重要的是,此解决方案是纯旧的HTML,并且不依赖Javascript。
GlennG '18 -10-5

45

这带来了一些可用性问题。

如果要显示一个复选框,但又不想与之交互,那为什么还要一个复选框呢?

但是,我的方法是使用禁用的(用户希望禁用的复选框不可编辑,而不是使用JS来使已启用的复选框不起作用),并使用JavaScript来添加表单提交处理程序,该处理程序会在表单开始之前使用启用复选框的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;
       }
    }
}

22
另一个选项是显示禁用的复选框(或图像或任何表示选中/未选中的内容),并具有由服务器处理的隐藏输入。
Juan Mendes '04

5
当您的表单中某些决定会影响其他一些输入时(也就是:设置一个不撤消第一个操作就无法触及的值),这不是可用性问题。我讨厌当人们试图改变人们的想法而不是回答时(我回答这不是关于您@FlySwat的问题)。
Pherrymason

7
目的是使用复选框作为“此值为true”的显示字段,与一堆“ true” /“ false” -s相比,向下扫描表更容易。当然,您可以使用图标,但是在某种形式上,似乎可以使用复选框。
奥利(Olie)

1
我通常使用此解决方案,但是..有时,尤其是在连接速度较慢的用户中,看到表单提交后启用的输入按钮,并决定使用它。
systempuntoout 2012年

2
假设您具有或不包含一系列“功能”,因此您有一个模板,其中显示了该功能上的复选框。但是有时,功能是其他功能的前提条件...因此必须将其包括在内,但您不想更改模板。这正是禁用/选中复选框的目的。他们已经存在了很长时间,所以我希望“为什么连一个复选框”问题也很夸张。
Triynko

38
<input type="checkbox" readonly="readonly" name="..." />

使用jQuery:

$(':checkbox[readonly]').click(function(){
            return false;
        });

给出一些视觉提示(css,文本等)仍然是一个好主意,该控件将不接受输入。


对我来说,这在ie6中不起作用,只读属性过滤器无法正常工作。我将其从过滤器中取出,并将属性检查放入函数的主体中,并在ie6中正常工作。
gt124 2010年

3
我使用“ data-readonly = true”代替了标准属性,它在所有浏览器中都能正常工作。我喜欢这种解决方案,而不是+1以上的其他解决方案
peipst9lker 2012年

1
选择器应$(':checkbox[readonly]')选择所有候选复选框,因为readonly属性值是可选的。
伊扎尔·阿兹米(Izhar Aazmi)2014年

21

我用它来达到结果:

<input type=checkbox onclick="return false;" onkeydown="return false;" />

在我的情况下,这种方法不需要分号,否则就不行。
Mwiza

12

我碰巧注意到下面给出的解决方案。发现它是我针对同一问题的研究。我不是谁张贴的,但不是我做的。它使用jQuery:

$(document).ready(function() {
    $(":checkbox").bind("click", false);
});

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


1
该问题要求一个只读复选框,而不是一个禁用的复选框。因此,这是最正确的答案。
NileshChauhan 2015年

9
onclick="javascript: return false;"

嗯...这适用于错误/未经检查的情况,但onclick="javascript: return true;"只是使其像普通复选框一样工作。提示?谢谢!
奥利(Olie)

@Olie,添加checked属性并保持不变false
Qwertiy

7

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

据我了解,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" />

对于未选中的复选框:

<input type="checkbox" disabled="disabled" />

禁用输入(尤其是复选框)的主要问题是对比度差,这对于某些视力障碍的人可能是个问题。最好使用纯文字(例如Status: none或)来指示值Status: implemented,但是在使用后者时,请在上方包含隐藏的输入,例如:

<p>Status: Implemented<input type="hidden" name="status" value="implemented" /></p>


7

当前大多数答案都具有以下一个或多个问题:

  1. 只检查鼠标而不是键盘。
  2. 仅检查页面加载。
  3. 挂钩受欢迎的更改或提交事件,如果挂钩其他事件,这些事件将永远无法解决。
  4. 需要隐藏的输入或其他必须撤消的特殊元素/属性,才能使用javascript重新启用该复选框。

以下内容很简单,没有任何问题。

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

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

有用。


6
<input name="isActive" id="isActive" type="checkbox" value="1" checked="checked" onclick="return false"/>

6

如果您希望将它们以表单形式提交到服务器,但对用户不友好,则可以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;
}
<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>


让我重复您的最后一句话(我错过了这句话,浪费了宝贵的时间):如果使用<label>,您的技术是无用的(实际上,在Firefox中,它工作得很好。Chrome的问题所在)。
Niccolo M.

@NiccoloM。,但是如果您知道它是只读的,为什么要将它包装到标签中?您也可以在其后放置标签并使用for属性。在这种情况下,您可以使用input[type="checkbox"][readonly] + label { pointer-events: none !important; }
Qwertiy

@KevinBui,您删除label并添加了tabindex吗?如何将焦点放在无法聚焦的元素上以在其上按下空格?
Qwertiy


5

这里的一些答案似乎有些round回,但这是一个小技巧。

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

然后在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();
    });

});

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


3
这不是“回旋处”吗?
KoZm0kNoT 2014年

不,这很直接..只是不简洁。
sksallaj 2015年

4

在上述答案的基础上,如果使用jQuery,这可能是所有输入的不错解决方案:

<script>
    $(function () {
        $('.readonly input').attr('readonly', 'readonly');
        $('.readonly textarea').attr('readonly', 'readonly');
        $('.readonly input:checkbox').click(function(){return false;});
        $('.readonly input:checkbox').keydown(function () { return false; });
    });
</script>

我将此与Asp.Net MVC一起使用,以将某些表单元素设置为只读。上面的方法通过将任何父容器设置为.readonly来处理文本和复选框,例如以下情形:

<div class="editor-field readonly">
    <input id="Date" name="Date" type="datetime" value="11/29/2012 4:01:06 PM" />
</div>
<fieldset class="flags-editor readonly">
     <input checked="checked" class="flags-editor" id="Flag1" name="Flags" type="checkbox" value="Flag1" />
</fieldset>

4
<input type="radio" name="alwaysOn" onchange="this.checked=true" checked="checked">
<input type="radio" name="alwaysOff" onchange="this.checked=false" >

4

我知道“已禁用”是不可接受的答案,因为操作人员希望它发布。但是,即使设置了只读选项,也总是必须在服务器端验证值。这是因为您无法阻止恶意用户使用readonly属性发布值。

我建议存储原始值(服务器端),并将其设置为禁用。然后,当他们提交表单时,忽略任何发布的值并采用您存储的原始值。

它的外观和行为就像一个只读值。并且它处理(忽略)来自恶意用户的帖子。您正在用一块石头杀死2只鸟。


3

我会在ConroyP的答案上发表评论,但这需要50个我没有的声誉。我确实有足够的声誉可以发布另一个答案。抱歉。

ConroyP答案的问题在于,即使未在页面上包含复选框,该复选框也无法更改。尽管Electrons_Ahoy的规定不多,但是最好的答案将是这样的:与应用“ disabled”属性时一样,不可更改的复选框看起来将与可更改的复选框相似(如果不相同)。一个解决方案既解决了两方面的原因Electrons_Ahoy给出了不想要使用“残疾”的属性将必然是无效的,因为它使用的“已禁用”属性。

假设两个布尔变量$ checked和$ disabled:

if ($checked && $disabled)
    echo '<input type="hidden" name="my_name" value="1" />';
echo '<input type="checkbox" name="my_name" value="1" ',
    $checked ? 'checked="checked" ' : '',
    $disabled ? 'disabled="disabled" ' : '', '/>';

如果$ checked为true,则复选框显示为选中状态。如果$ checked为false,则该复选框显示为未选中。仅当$ disabled为false时,用户才能更改复选框的状态。无论用户是否选中该复选框,都不会发布“ my_name”参数。无论用户是否选中此复选框,都会发布“ my_name = 1”参数。我相信这是Electrons_Ahoy所寻找的。


3

不,输入复选框不能为只读。

但是您可以使用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();
          }
      }
});
input[type=checkbox][readonly] {
    cursor: not-allowed;
}
<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>

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

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

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

有太多的假设使它不会影响页面的性能。




2

如果您希望所有复选框都被“锁定”,那么如果存在“只读”属性,则用户无法更改“已检查”状态,则可以使用jQuery:

$(':checkbox').click(function () {
    if (typeof ($(this).attr('readonly')) != "undefined") {
        return false;
    }
});

这段代码的妙处在于,它允许您在整个代码中更改“只读”属性,而不必重新绑定每个复选框。

它也适用于单选按钮。


1

人们希望使用只读复选框和(以及)只读无线电组的主要原因是,可以将无法更改的信息以其输入的形式呈现给用户。

确定禁用将执行此操作-不幸的是,禁用的控件无法通过键盘导航,因此会违反所有辅助功能法规。这是我所知道的最大的HTML挂断。


1

贡献非常晚...但是无论如何。在页面加载时,使用jquery禁用除当前选中的复选框以外的所有复选框。然后将当前选定的设置为只读,使其外观与禁用的外观相似。用户无法更改该值,并且所选值仍会提交。


1

参加聚会的时间很晚,但是我找到了MVC的答案(5)我禁用了复选框,并在复选框之前添加了HiddenFor,因此在发布时,如果首先找到Hidden字段并使用该值。这确实有效。

 <div class="form-group">
     @Html.LabelFor(model => model.Carrier.Exists, new { @class = "control-label col-md-2" })
         <div class="col-md-10">
              @Html.HiddenFor(model => model.Carrier.Exists)
              @Html.CheckBoxFor(model => model.Carrier.Exists, new { @disabled = "disabled" })
              @Html.ValidationMessageFor(model => model.Carrier.Exists)
          </div>
 </div>

1

我会使用readonly属性

<input type="checkbox" readonly>

然后使用CSS禁用交互:

input[type='checkbox'][readonly]{
    pointer-events: none;
}

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

input[type='checkbox']:read-only{ /*not working*/
    pointer-events: none;
}

0

我只是不希望客户在某些情况下能够更改它们。

READONLY本身不起作用。使用CSS,您可以执行一些时髦的操作,但是我们通常只是将其禁用。

警告:如果将它们重新发布,则客户可以更改期限。您不能依靠只读来阻止用户更改某些内容。可以始终使用提琴手,也可以仅使用带有萤火虫的html之类的东西。


您完全正确,这就是为什么我还要在服务器端进行检查,将其设置为只是为了改善客户端的用户体验。
levhita

0

我的解决方案实际上与FlySwat的解决方案相反,但是我不确定它是否适合您的情况。我有一组复选框,每个复选框都有一个提交表单的onClick处理程序(用于更改表格的过滤器设置)。我不想允许多次点击,因为第一次点击之后的后续点击将被忽略。因此,我在第一次单击后以及提交表单后禁用了所有复选框:

onclick="document.forms['form1'].submit(); $('#filters input').each(function() {this.disabled = true});"

复选框位于一个ID为“过滤器”的span元素中-代码的第二部分是jQuery语句,该语句迭代复选框并禁用每个复选框。这样,复选框值仍通过表单提交(因为表单是在禁用它们之前提交的),并且它阻止用户更改它们直到页面重新加载。

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.