防止在输入类型编号中键入非数字

IT技术 javascript html
2021-02-07 09:20:45

如果输入不是有效数字,则使用<input type=number>将导致this.value事件侦听器内部返回空字符串。你可以在http://jsfiddle.net/fSy53/看到一个例子

但是,无效字符仍然显示在输入中。

有没有办法从事件侦听器中获取实际显示的值,包括无效字符?

我的最终目标是防止用户在字段中实际输入任何非数字字符。我需要使用,type=number以便移动设备使用数字虚拟键盘。我的目标是做这样的事情this.value = this.value.replace(/[^0-9.]/g, "")keyup keypress,但这并不因为如果无效字符键入工作,从阅读this.value的回报""

6个回答

如果您不喜欢传入的键值,请尝试阻止默认行为:

document.querySelector("input").addEventListener("keypress", function (evt) {
    if (evt.which < 48 || evt.which > 57)
    {
        evt.preventDefault();
    }
});
有了这个你不能按箭头,退格等键,有扩展的解决方案存在stackoverflow.com/a/995193/691194
2021-03-17 09:20:45
keypress事件仅在文档上触发。你需要为此设置一个键盘管理器
2021-03-20 09:20:45
@GlennLane的问题是,用于换档键,如$.which相同的非换档键并在虚拟键盘,e.shiftKey没有被设置为一个值truthy。相关:stackoverflow.com/questions/19964074/...
2021-03-27 09:20:45
@megawac 你有引用吗?这与我的经验相反。OP 表示防止非数字内容是目标,我认为这是正确的方法:在它发生之前阻止它并且不要担心 .value
2021-03-29 09:20:45
不对。按键触发输入元素,气泡记录
2021-04-01 09:20:45

您可以通过防止非数字值发生 keyPress 事件来实现此目的

例如(使用 jQuery)

$('.input-selector').on('keypress', function(e){
  return e.metaKey || // cmd/ctrl
    e.which <= 0 || // arrow keys
    e.which == 8 || // delete key
    /[0-9]/.test(String.fromCharCode(e.which)); // numbers
})

这说明了所有不同类型的输入(例如,从数字键盘输入的代码与键盘的代码不同)以及退格键、箭头键、control/cmd + r 重新加载等

e.which == 46 for dot key 如果需要浮动
2021-03-26 09:20:45
箭头键代码是 37 到 40 stackoverflow.com/questions/20863329/...
2021-04-10 09:20:45

请注意e.whiche.keyCodee.charCode已弃用:https : //developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/which

我更喜欢e.key

document.querySelector("input").addEventListener("keypress", function (e) {
    var allowedChars = '0123456789.';
    function contains(stringValue, charValue) {
        return stringValue.indexOf(charValue) > -1;
    }
    var invalidKey = e.key.length === 1 && !contains(allowedChars, e.key)
            || e.key === '.' && contains(e.target.value, '.');
    invalidKey && e.preventDefault();});

该函数不与在Firefox(控制码干扰BackspaceTab通过检查字符串长度,等等): e.key.length === 1

它还可以防止在开头和数字之间出现重复的点: e.key === '.' && contains(e.target.value, '.')

不幸的是,它并不能阻止最后出现多个点: 234....

似乎没有办法应对。

我喜欢这种方法。它很干净而且效果很好。它的一个问题是它会阻止Ctrl+R(重新加载当前页面)Ctrl+A等内容。我相信添加!e.ctrlKey支票是安全的
2021-04-10 09:20:45

其他答案似乎比必要的更复杂,因此我将他们的答案调整为这个简短而甜蜜的功能。

function allowOnlyNumbers(event) {
  if (event.key.length === 1 && /\D/.test(event.key)) {
    event.preventDefault();
  }
}

它不会改变任何箭头、回车、移位、ctrl 或 tab 键的行为,因为这些事件的键属性的长度比单个字符长。它还使用简单的正则表达式来查找任何非数字字符。

那么如果有人想要十进制数呢?比如10.01这并不妨碍1.1.1提交。
2021-04-07 09:20:45
inputs[5].addEventListener('keydown', enterNumbers);

function enterNumbers(event) {
  if ((event.code == 'ArrowLeft') || (event.code == 'ArrowRight') ||
     (event.code == 'ArrowUp') || (event.code == 'ArrowDown') || 
     (event.code == 'Delete') || (event.code == 'Backspace')) {
     return;
  } else if (event.key.search(/\d/) == -1) {
    event.preventDefault();
  }
}

在这种情况下,按下非数字按钮时输入字段的值保持不变,并且仍然删除,退格,箭头上下左右工作正常,可用于修改数字输入。