如何为<input>添加“只读”属性?


301

如何添加readonly到特定内容<input>.attr('readonly')不起作用。


2
.attr(“只读”,真)的作品,其他的不要

3
.attr(“只读”,“只读”)也适用

3
这取决于您使用哪种DOCTYPE。对于HTML 4.01 DTD,来自CMS的答案是有效的且有效的HTML 4.01。如果您使用XHTML DTD,则来自ceejayoz的答案是有效的XHTML。
bjoernwibben

2
它不依赖于doctype,无论是通过HTML还是XML读取DOM都是相同的,并且在任何情况下,出于IE兼容性的考虑,XHTML几乎始终仍然实际上是HTML而不是XML。
bobince

Answers:


545

jQuery <1.9

$('#inputId').attr('readonly', true);

jQuery 1.9以上

$('#inputId').prop('readonly', true);

阅读有关prop和attr之间差异的更多信息


1
你确定吗?我也这么认为,但在规范中找不到任何信息。<input name =“ foo” readonly =“ readonly” value =“ bar” />使用xhtml 1.0 strict在validator.w3.org上完美验证。
乔纳斯·斯滕维德2011年

17
这个职位应改为.prop(),而不是.attr(),如jQuery的API中指出:jquery.com/upgrade-guide/1.9/#attr-versus-prop-
frshca

只读属性是一个“布尔属性” -whatwg.org/specs/web-apps/current-work/#boolean-attribute 尽管名称有些误导,但其值不应为“ true”或“ false”。虽然我认为上面的代码可以实际使用(在Chrome中使用jQuery 1.8.1进行了测试),但对于经验不足的用户,可能会导致以后的困惑。另外,根据jQuery文档,该值应为数字或字符串,而不是布尔值。api.jquery.com/attr/#attr2
路加福音

151

使用$ .prop()

$("#descrip").prop("readonly",true);

$("#descrip").prop("readonly",false);

8
阅读适用于.prop的jQuery API后,这应该是可接受的答案。我过去总是做过.attr('readonly','readonly')和.removeAttr('readonly'),但这似乎更正确,也使代码更简洁。
evan w 2012年

4
:每个人都应该使用这个答案,因为这里所说jquery.com/upgrade-guide/1.9/#attr-versus-prop-
frshca

4
在使用时要小心$.prop():Prop会将readonly属性设置为blank / empty字符串,因此,如果您有使用CSS的属性选择器的CSS [readonly="readonly"],则必须将其更改为[readonly](或同时包含)。
路加福音

28

只读是html中定义的属性,因此请一视同仁。

如果要使其不可编辑,则需要在所使用的对象中具有readonly =“ readonly”之类的内容。而且,如果您希望它再次可编辑,您将不会有readonly =''之类的东西(如果我理解正确的话,这是不标准的)。您确实确实需要删除整个属性。

因此,在使用jquery时添加和删除它才有意义。

将内容设置为只读:

$("#someId").attr('readonly', 'readonly');

删除只读:

$("#someId").removeAttr('readonly');

这是真正对我有用的唯一选择。希望能帮助到你!


20

.attr('readonly', 'readonly')应该可以。您.attr('readonly')只返回该值,而不设置一个。


16
jQuery的attr()适用于JavaScript属性,而不适用于HTML属性,即使名称另有暗示也是如此。attr('readonly')实际上是在DOM Level 1 HTML属性readOnly上操作的,该属性是一个布尔值,因此'true'更合适。但是,字符串“ readonly”在自动转换为布尔值时也是一个真实值,因此上面的方法仍然有效。
bobince

我认为您不想将属性设置为“ true”。.attr根据jQuery docs,该值只能是字符串或数字,而不能是布尔值:api.jquery.com/attr/#attr2此外,HTML“布尔属性”应仅是空字符串或该属性的值。我认为解决方案是使用.prop()以避免混淆。
路加福音

16

我认为“已禁用”排除了在POST上发送的输入


4
是的,它确实。正是出于这个原因,我在寻找“禁用”的替代品时发现了这个线程。
乔纳斯·斯滕维德2011年

但是您可以在发送它之前将其启用,然后再将其禁用$(document).on('submit',“ #myform”,function(e){//启用输入返回true; //如果您再次输入,则将其禁用require}它有效,我已经测试过
Geomorillo 2014年

是否允许html中的只读输入值在不使用隐藏的情况下在POST上发送?
Ajay Takur

12

您可以使用.removeAttr;禁用只读;

$('#descrip').removeAttr('readonly');

5

启用只读:

$("#descrip").attr("readonly","true");

用于禁用只读

$("#descrip").attr("readonly","");

来自api.jquery.com/attr “从jQuery 1.6开始,.attr()方法对未设置的属性返回未定义的。要检索和更改DOM属性,例如表单元素的选中,选定或禁用状态,使用.prop()方法。”
大卫·克拉克

1
该属性不应设置为字符串“ true”。这可能会起作用,但在技术上不正确。(请参阅上面我的先前评论。)
路加福音

不要使用这个建议,这里有更好的建议。“ true”设置不正确,删除也不正确。
MiFiHiBye

4

使用setAttribute属性。在示例中请注意,如果选择1,则在文本框上应用readonly属性,否则将其删除为readonly属性。

http://jsfiddle.net/baqxz7ym/2/

document.getElementById("box1").onchange = function(){
  if(document.getElementById("box1").value == 1) {
    document.getElementById("codigo").setAttribute("readonly", true);
  } else {
    document.getElementById("codigo").removeAttribute("readonly");
  }
};

<input type="text" name="codigo" id="codigo"/>

<select id="box1">
<option value="0" >0</option>
<option value="1" >1</option>
<option value="2" >2</option>
</select>

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.