限制输入字段中的字符

Restrict characters in input field

提问人:user3459377 提问时间:3/28/2014 最后编辑:FWDekkeruser3459377 更新时间:11/26/2022 访问量:77480

问:

有没有办法阻止用户在输入字段中写入特定字符?我尝试了下面的代码,但是当用户输入不允许的字符时,它们会出现一小段时间,然后消失。我希望输入在写入无效字符时保持不变。

我想使用,因为其他限制方法似乎不适用于移动设备。我想解决的问题是字符在被删除之前短暂出现。onchange

function checkInput(ob) {
  const invalidChars = /[^0-9]/gi;

  if(invalidChars.test(ob.value)) {
    ob.value = ob.value.replace(invalidChars, "");
  }
};
<input class="input" maxlength="1" onChange="checkInput(this)" onKeyup="checkInput(this)" type="text" autocomplete="off" />

JavaScript jQuery 验证

评论

3赞 iJade 3/28/2014
为什么不设置 type='password'....
1赞 mahemoff 3/28/2014
无论如何,它应该是 type=“input” 而不是 class=“input”。(如果要设置样式,请使用 [type=“input”])
1赞 mahemoff 3/28/2014
您可以使用 html5 “pattern” 属性来强制执行正则表达式
1赞 Vinod Louis 3/28/2014
只需在“OnKeyPress”事件上调用函数
1赞 mplungjan 3/28/2014
HTML 中 Cancel the keydown 的可能重复项

答:

1赞 Ashwani Panwar 3/28/2014 #1

检查此代码,

$('.input').keypress(function(e) {
    var a = [];
    var k = e.which;

    for (i = 48; i < 58; i++)
        a.push(i);

    if (!(a.indexOf(k)>=0))
        e.preventDefault();
});

2赞 Niklas 3/28/2014 #2

这里有一个你可以尝试的小技巧:演示

它的作用是将每个输入文本涂成白色,然后根据您的要求将其改回黑色。如果您可以忍受输入有效字符时出现的一点延迟。

function checkInput(ob) {
    var invalidChars = /[^0-9]/gi
    if (invalidChars.test(ob.value)) {
        ob.value = ob.value.replace(invalidChars, "");
    }
    else {
        document.getElementById('yourinput').style.color = '#000';
    }
};

function hideInput(ob) {
    document.getElementById('yourinput').style.color = '#FFF';
};

[HTML全文]

<input id="yourinput" class="input" maxlength="1" onKeydown="hideInput(this)" onKeyup="checkInput(this)" type="text" autocomplete="off" />

CSS的

input {color:#FFF;}

评论

0赞 user3459377 3/28/2014
有什么方法可以在不使用css的情况下做到这一点吗?当您按下我根本不想显示的受限制字符时,它只是一个延迟
0赞 user3459377 3/28/2014
你的回答很好,正如你所说,这是一个小小的黑客,但我仍然想知道我怎样才能毫不拖延地使用这段代码
1赞 Niklas 3/28/2014
是的,我正在尝试其他一些事情,但我似乎无法摆脱滞后。
9赞 dfsq 3/28/2014 #3

按键和粘贴事件的组合可以做一个技巧:

var text = document.getElementById('text');
text.onkeypress = text.onpaste = checkInput;

function checkInput(e) {
    var e = e || event;
    var char = e.type == 'keypress' 
        ? String.fromCharCode(e.keyCode || e.which) 
        : (e.clipboardData || window.clipboardData).getData('Text');
    if (/[^\d]/gi.test(char)) {
        return false;
    }
}
<input class="input" maxlength="10" id="text" type="text" autocomplete="off" />

此代码可防止键入或粘贴除数字以外的任何内容。此外,没有闪烁,无效字符不会显示。

适用于 IE7+。

演示:http://jsfiddle.net/VgtTc/3/

评论

1赞 FWDekker 11/23/2022
此代码不适用于拖放,并且已弃用,并且可能应该是 .我认为现代方法是处理 beforeinput 事件以通用方式拒绝无效输入e.keyCodee.whichreturn falsee.preventDefault()
14赞 CJ Ramki 3/28/2014 #4

你可以用试试这个,

$('.input').keyup(function () {
    if (!this.value.match(/[0-9]/)) {
        this.value = this.value.replace(/[^0-9]/g, '');
    }
});

SEE THIS FIDDLE DEMO

更新:

你可以试试这个代码,

$(document).ready(function() {
    $(".input").keydown(function (e) {
        // Allow: backspace, delete, tab, escape and enter
        if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110]) !== -1 ||
             // Allow: Ctrl+A
            (e.keyCode == 65 && e.ctrlKey === true) || 
             // Allow: home, end, left, right
            (e.keyCode >= 35 && e.keyCode <= 39)) {
                 // let it happen, don't do anything
                 return;
        }
        // Ensure that it is a number and stop the keypress
        if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
            e.preventDefault();
        }
    });
});

SOURCE

SEE UPDATED FIDDLE DEMO

针对 ANDROID 更新:

<EditText
android:id="@+id/editText1"
android:inputType="number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_marginTop="58dp"
android:layout_toRightOf="@+id/textView1"
android:maxLength="1" >
</EditText>

我想它可能会对你有所帮助......使用你可以做到这一点。android:inputType="number"

评论

0赞 user3459377 3/28/2014
当我尝试在输入中使用受限制的字符时,相同的延迟
0赞 Niklas 3/28/2014
当它甚至不起作用时,这是如何获得两个赞成票的?
0赞 user3459377 3/28/2014
@Niklas 如果您打开小提琴并键入 a、b、c、d ...你可以在那里看到一个延迟,字母显示一秒钟,试着保持一个字母也按下
0赞 user3459377 3/28/2014
是的,确实如此。谢谢CJRamki
0赞 user3459377 3/28/2014
还有 1 件事,sholdnt 允许。
1赞 Nick Bilyk 5/11/2017 #5
<input id="testInput"></input>

<script>
testInput.onchange = testInput.oninput = restrict;

function restrict() {
    testInput.value = testInput.value.replace(/[^a-z]/g, "");
}
</script>

我想出了一些稍微不同的东西。oninput 而不是 onkeyup/onkeydown,onchange 而不是 onpaste。

评论

1赞 FWDekker 11/23/2022
请注意,每次输入无效输入时,这都会重置插入符号,如果用户想要编辑输入的开头并按错误的键,这对用户来说很烦人。可以使用 beforeinput 事件在插入无效输入之前拒绝这些输入。
0赞 pixel 5/15/2021 #6

我在按键和粘贴事件上限制无效字符,例如:

<input type="text" onkeydown="validateKey(event)" onpaste="validatePaste(this, event)">  

并在选项卡或单独的 javascript 文件中定义函数来处理这些事件:

<script>
function validateKey(e) {
  switch(e.keyCode) {
    case 8,9,13,37,39:
      break;
    default:
      var regex = /[a-z .'-]/gi;
      var key = e.key;
      if(!regex.test(key)) {
        e.preventDefault();
        return false;
      }
      break;
  }
}
function validatePaste(el, e) {
  var regex = /^[a-z .'-]+$/gi;
  var key = e.clipboardData.getData('text')
  if (!regex.test(key)) {
    e.preventDefault();
    return false;
  }
}
</script>
9赞 FWDekker 11/23/2022 #7

到目前为止,给出的所有答案都至少存在以下可访问性问题之一:

  1. 它们验证键代码,这不适用于非 QWERTY 键盘布局。
  2. 它们并不涵盖所有输入法;尤其是拖放经常被遗忘。
  3. 它们会更改 ,从而重置插入符号的位置。value
  4. 他们使用 pattern 属性,但在提交表单之前,该属性不会提供反馈。

在插入输入之前实际验证输入不是更好的主意吗?


beforeinput 事件在输入值更改之前触发。该事件具有一个属性,用于描述用户要添加到输入字段的内容。在事件处理程序中,只需检查属性,如果事件链包含不允许的字符,则停止该事件链。datadata

我们最终得到以下非常简单、非常短的代码。

const input = document.getElementById("input");
const regex = new RegExp("^[0-9]*$");

input.addEventListener("beforeinput", (event) => {
  if (event.data != null && !regex.test(event.data)) 
    event.preventDefault();
});
<label for="input">Enter some digits:</label>
<input id="input" />


一些结束语:

  • 可及性:清楚地说明用户期望输入的格式。例如,可以使用输入的 title 属性来显示解释预期格式的工具提示。
  • 安全:这是客户端验证,不保证在将表单发送到服务器时强制执行该模式。为此,您需要服务器端验证。

评论

2赞 E-Riz 5/23/2023
这应该是公认的答案。它不依赖于任何黑客攻击,并在元素实际更改之前正确地拦截潜在值。它还演示了如何使用变量或其他对象属性来控制允许字符的正则表达式。<input>