【问题标题】:How to prevent user from typing in text field without disabling the field?如何防止用户在不禁用该字段的情况下输入文本字段?
【发布时间】:2011-08-05 05:03:30
【问题描述】:

我试过了:

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

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

});

但它会在输入字母后稍微删除输入的文本。有没有办法阻止用户在不禁用文本字段的情况下完全输入文本?

【问题讨论】:

  • keydown()keypress() 更有效吗?

标签: javascript jquery html


【解决方案1】:

一个很容易被忽视的非Javascript替代方案:你能用readonly属性代替disabled属性吗?它可以防止编辑输入中的文本,但浏览器对输入的样式不同(不太可能“将其变灰”) 例如<input readonly type="text" ...>

【讨论】:

  • 只读属性没有值,它只需要存在于HTML 4.01HTML5 中。唯一需要值的情况是在有效的 XHTML 文档中(这在网络上极为罕见)。
  • 这是完全正确的 RobG,我应该提到这一点。还想提一下,这个属性应该适用于 textarea 元素,我认为它也适用于复选框/收音机输入。
  • 这种方法有一个缺点。用户仍然可以单击该字段,使其看起来好像是可编辑的。如果他们按退格键删除其中的内容,则可能会触发浏览器的“后退”功能。体验不好。
  • 如果对用户体验有顾虑,或者如果只读字段的默认样式非常丑陋,请采用渐进增强方法并使用 CSS 使其更明显不可编辑:@987654323 @
  • 没有听说过这个属性。还是帮了我,谢谢!
【解决方案2】:

如果您不希望该字段看起来“禁用”或smth,只需使用此:

onkeydown="return false;"

和greengit和Derek说的基本一样,只是短了一点

【讨论】:

  • 我必须在 addEventListener 中 e.preventDefault();
  • 更短:onkeydown="return false"
  • 请注意,这不会阻止用户使用鼠标粘贴文本。
  • 这在使用日期选择器时非常完美,例如,可以防止用户输入日期并实际使用日期选择器。但正如@gsanta 所说,他们仍然可以粘贴文本,所以只要确保也有后端验证 :)
  • 在 ASP.NET 网站上,将文本框设置为只读会导致回发时文本丢失。在这种情况下,这是更好的解决方案。
【解决方案3】:
$('input').keydown(function(e) {
   e.preventDefault();
   return false;
});

【讨论】:

  • 实际上,我有一个出生日期字段,我想防止用户输入这个字段,所以对我来说你的答案很好!如果我使用“只读”属性,则用户将无法单击输入,并且通过单击输入弹出 DOB .. :) 干杯!!!!谢谢
  • @treecoder:很好的例子。但是如果我想在阻止输入之前包含条件检查怎么办?例如,我想阻止输入从“a”到“z”的所有字符,包括小写和大写,以及“@”符号。应允许所有其他符号和数字。我该如何使用你上面写的 jQuery 函数来做到这一点?
【解决方案4】:
$('input').keypress(function(e) {
    e.preventDefault();
});

【讨论】:

  • 这只会阻止输入,而您仍然可以使用箭头键等。谢谢!
【解决方案5】:

如果您想阻止用户添加任何内容,但要为他们提供擦除字符的能力:

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

将输入的maxlength 属性设置为"0" 使得用户无法添加内容,但仍可以随意删除内容


但如果你想让它真正恒定不变:

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

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      对于纯 CSS 解决方案,请尝试在输入上设置 pointer-events: none

      【讨论】:

      • 独特的创意解决方案
      【解决方案8】:

      标记

      <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 中实现选项卡功能并防止编辑。
      【解决方案9】:

      我喜欢添加一个也适用于动态 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 中(使用单个“只读”属性是不可能的)。

      从类中删除元素:

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

      或使用 Jquery:

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

      或切换类:

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

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

      【讨论】:

        【解决方案10】:

        只需对控件标签使用 onkeydown="return false" 如下所示,它不会接受来自用户的值。

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

        【讨论】:

          【解决方案11】:

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

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

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

          如果您只关心保持输入为空,则此方法效果最佳。如果你想维护一个特定的值,你必须在其他地方(在数据属性中?)跟踪它,因为当收到input 事件时它不可用。

          const inputEl = document.querySelector('input');
          
          inputEl.addEventListener('input', (event) => {
            event.target.value = '';
          });
          &lt;input type="text" /&gt;

          在 Safari 10、Firefox 49、Chrome 54、IE 11 中测试。

          【讨论】:

            【解决方案12】:

            最好的解决方案是在用户点击输入后取消焦点,使其成为只读

              onFocus={e => e.target.blur()}
            

            【讨论】:

            • 虽然这段代码可以回答这个问题,但最好在不介绍其他代码的情况下解释它是如何解决问题的,以及为什么要使用它。从长远来看,纯代码的答案没有用处。
            • 见“Explaining entirely code-based answers”。虽然这在技术上可能是正确的,但它并不能解释为什么它可以解决问题或应该是选择的答案。除了帮助解决问题,我们还应该进行教育。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-28
            • 2016-06-10
            • 2012-06-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多