如何防止用户在不禁用字段的情况下输入文本字段?


79

我试过了:

$('input').keyup(function() {

   $(this).attr('val', '');

});

但输入字母后会略微删除输入的文本。是否有任何方法可以防止用户完全输入文本而无需禁用文本字段?


keydown()keypress()任何更有效?
2011年

Answers:


186

一种非Java语言的替代方案,很容易被忽略:您可以使用readonly属性代替disabled属性吗?它防止编辑输入中的文本,但是浏览器以不同的方式设置输入的样式(不太可能“变灰”),例如<input readonly type="text" ...>


3
老实说,这是最好的解决方案。
克里斯汀·曼

3
readonly属性没有值,仅需要在HTML 4.01HTML5中都存在。它唯一需要一个值的时间就是有效的XHTML文档(在网络上很少见)。
RobG 2011年

那是完全正确的RobG,我应该提到这一点。还想提到此属性应适用于textarea元素,我认为它也适用于复选框/无线电输入。
Mike Mertsock 2011年

4
这种方法有一个缺点。用户仍然可以单击该字段,使其显示为可编辑状态。如果他们按退格键删除其中的内容,则可能会触发浏览器的“后退”功能。不好的经历。
caltrop

如果您担心用户体验,或者只读字段的默认样式很丑陋,请采用渐进增强方法,并使用CSS使其更加不可编辑:jsfiddle.net/eBh5N
Mike Mertsock

63

如果您不希望该字段显示为“ disabled”或smth,请使用以下命令:

onkeydown="return false;"

这与greengit和Derek所说的基本相同,但要短一些


我必须e.preventDefault();在addEventListener中
Jim Jones

3
甚至更短:onkeydown="return false"
CoderPi '16

4
请注意,这不会阻止用户使用鼠标粘贴文本。
gsanta 2016年

2
例如,这在使用日期选择器时非常理想,以防止用户键入日期并实际使用日期选择器。但是正如@gsanta所说,他们仍将能够粘贴文本,因此只需确保还具有后端验证即可:)
MattiasH 2016年

1
在ASP.NET网站上,将文本框设置为只读会导致文本在回发时丢失。在这种情况下,这是更好的解决方案。
亚斯

30
$('input').keydown(function(e) {
   e.preventDefault();
   return false;
});

2
实际上,我有一个出生日期字段,并且我想防止用户键入该字段,因此对我来说,您的答案很好!如果我使用“只读”属性,那么用户将无法单击输入,并且通过单击输入将出现DOB弹出。和感谢
Neeraj Singh 2014年


7

如果要阻止用户添加任何内容,但要为他们提供擦除字符的功能,请执行以下操作:

<input value="CAN'T ADD TO THIS" maxlength="0" />

maxlength输入的属性设置为"0"可以使用户无法添加内容,但仍可以根据需要擦除内容


但是,如果您希望它真正恒定且不可更改:

<input value="THIS IS READONLY" onkeydown="return false" />

onkeydown属性设置为return false可使输入忽略用户keypresses从而防止其更改或影响值。


2

根据需要,可以使用另一种方法,$('input').onfocus(function(){this.blur()}); 我认为这是编写方法。我不精通jquery。


1

标记

<asp:TextBox ID="txtDateOfBirth" runat="server" onkeydown="javascript:preventInput(event);" onpaste="return false;"
                                TabIndex="1">

脚本

function preventInput(evnt) {
//Checked In IE9,Chrome,FireFox
if (evnt.which != 9) evnt.preventDefault();}

这将帮助您在DatePicker Filed中实现选项卡功能并防止编辑。
Biju kalanjoor 2015年

1

我喜欢添加一个也可以与动态javascript DOM创建(例如D3)一起使用的应用程序,无法添加:

//.attr(function(){if(condition){"readonly"]else{""}) //INCORRECT CODE !

为了防止对HTML输入DOM元素执行操作,请向类添加只读:

var d = document.getElementById("div1");
d.className += " readonly";

或在D3中:

 .classed("readonly", function(){
   if(condition){return true}else{return false}
 })

并添加到CSS或更少的版本中:

.readonly {
  pointer-events: none;
}

这个解决方案的好处是,您可以动态地打开它并在一个函数中打开它,以便可以在创建时将其集成到例如D3中(不能使用单个“ readonly”属性来实现)。

从类中删除元素:

document.getElementById("MyID").className =
  document.getElementById("MyID").className.replace(/\breadonly\b/,'');

或使用Jquery:

$( "div" ).removeClass( "readonly" )

或切换班级:

$( "div" ).toggleClass( "readonly", addOrRemove );

只是为了完整,祝您好运= ^)


1

只需使用onkeydown =“ return false”到控制标签,如下所示,它就不会接受用户的值。

    <asp:TextBox ID="txtDate" runat="server" AutoPostBack="True"
ontextchanged="txtDate_TextChanged" onkeydown="return false" >
    </asp:TextBox>

0

一种选择是将处理程序绑定到input事件。

这种方法的优点是我们不会阻止用户期望的键盘行为(例如,选项卡,向上/向下翻页等)。

另一个优点是,它还可以处理通过在上下文菜单中粘贴文本来更改输入值的情况。

如果您只关心保持输入为空,则此方法最有效。如果您要保持特定的值,则必须在其他位置(在data属性中)跟踪该值,因为在input接收到事件时该值将不可用。

const inputEl = document.querySelector('input');

inputEl.addEventListener('input', (event) => {
  event.target.value = '';
});
<input type="text" />

在Safari 10,Firefox 49,Chrome 54,IE 11中进行了测试。


0

对于仅css的解决方案,请尝试pointer-events: none在输入上进行设置。

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.