HTML 文本输入仅允许数字输入

IT技术 javascript jquery html
2021-01-19 21:13:14

是否有一种快速的方法可以将 HTML 文本输入 ( <input type=text />) 设置为仅允许输入数字键(加上“.”)?

6个回答

注意:这是一个更新的答案。下面的评论指的是一个旧版本,它弄乱了键码。

JavaScript

在 JSFiddle 上自己尝试一下

您可以<input>使用以下setInputFilter功能过滤文本的输入值(支持复制+粘贴、拖放、键盘快捷键、上下文菜单操作、不可键入的键、插入符号位置、不同的键盘布局以及自 IE 9 以来的所有浏览器) :

// Restricts input for the given textbox to the given inputFilter function.
function setInputFilter(textbox, inputFilter) {
  ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
    textbox.addEventListener(event, function() {
      if (inputFilter(this.value)) {
        this.oldValue = this.value;
        this.oldSelectionStart = this.selectionStart;
        this.oldSelectionEnd = this.selectionEnd;
      } else if (this.hasOwnProperty("oldValue")) {
        this.value = this.oldValue;
        this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
      } else {
        this.value = "";
      }
    });
  });
}

您现在可以使用该setInputFilter函数来安装输入过滤器:

setInputFilter(document.getElementById("myTextBox"), function(value) {
  return /^\d*\.?\d*$/.test(value); // Allow digits and '.' only, using a RegExp
});

有关更多输入过滤器示例,请参阅JSFiddle 演示另请注意,您仍然必须进行服务器端验证!

typescript

这是一个 TypeScript 版本。

function setInputFilter(textbox: Element, inputFilter: (value: string) => boolean): void {
    ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
        textbox.addEventListener(event, function(this: (HTMLInputElement | HTMLTextAreaElement) & {oldValue: string; oldSelectionStart: number | null, oldSelectionEnd: number | null}) {
            if (inputFilter(this.value)) {
                this.oldValue = this.value;
                this.oldSelectionStart = this.selectionStart;
                this.oldSelectionEnd = this.selectionEnd;
            } else if (Object.prototype.hasOwnProperty.call(this, 'oldValue')) {
                this.value = this.oldValue;
                if (this.oldSelectionStart !== null &&
                    this.oldSelectionEnd !== null) {
                    this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
                }
            } else {
                this.value = "";
            }
        });
    });
}

jQuery

还有一个 jQuery 版本。看到这个答案

HTML 5

HTML 5 有一个本机解决方案<input type="number">(参见规范),但请注意浏览器支持各不相同:

  • 大多数浏览器只会在提交表单时验证输入,而不是在输入时验证。
  • 大多数移动浏览器不支持step,minmax属性。
  • Chrome(版本 71.0.3578.98)仍然允许用户输入字符eE进入字段。另请参阅此问题
  • Firefox(版本 64.0)和 Edge(EdgeHTML 版本 17.17134)仍然允许用户在字段中输入任何文本。

在 w3schools.com 上亲自尝试一下

尽管这将是一个不错的选择,但这仍然允许输入诸如 /、多个点、其他运算符等字符。
2021-03-12 21:13:14
type="number" 实际上并不能阻止在字段中输入无效文本;似乎您甚至可以将垃圾数据剪切并粘贴到该字段中,即使在 chrome 中也是如此。
2021-03-16 21:13:14
我唯一要添加的是更改 Ctrl+A 行以包含 MacOSX 用户: (e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true))
2021-03-16 21:13:14
jQuery 变体允许在数字行上有其他符号的键盘布局上使用其他符号,例如 AZERTY 键盘或立陶宛键盘。
2021-03-21 21:13:14
Firefox 21 仍然不支持(我什至不谈论 IE9 或更早版本......)
2021-03-28 21:13:14

使用这个 DOM

<input type='text' onkeypress='validate(event)' />

还有这个脚本

function validate(evt) {
  var theEvent = evt || window.event;

  // Handle paste
  if (theEvent.type === 'paste') {
      key = event.clipboardData.getData('text/plain');
  } else {
  // Handle key press
      var key = theEvent.keyCode || theEvent.which;
      key = String.fromCharCode(key);
  }
  var regex = /[0-9]|\./;
  if( !regex.test(key) ) {
    theEvent.returnValue = false;
    if(theEvent.preventDefault) theEvent.preventDefault();
  }
}
这允许有人将随机内容粘贴到输入中
2021-03-09 21:13:14
大多数人确实关心,显示脚本错误在您的网站上反映不佳。
2021-03-10 21:13:14
eeepc 900 上的德语设置。一些用于良好可用性的键不起作用: - 退格键(keyCode:8) - 左右导航键(keyCode:37, 38)也可以复制和粘贴...
2021-03-16 21:13:14
我关心退格、删除和箭头不起作用。如果您删除“theEvent.keycode ||”,并添加:“if( /[ -~]/ && !regex.test(key) ) {” 那么它的效果会更好(无论如何对于 ASCII/UTF)。但是它不会拒绝汉字!:)
2021-03-31 21:13:14
这段代码的问题很少。你可以输入。不止一次,第二次它不允许删除键,有什么解决办法吗?
2021-04-04 21:13:14

这是一个简单的,只允许一位小数,但不能更多:

<input type="text" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*?)\..*/g, '$1');" />

尽管它可以完成@Mathemats 所说的一切,但它不处理具有多个小数的复制+粘贴。添加粘贴文本的所有小数。
2021-03-15 21:13:14
可以提取 oninput 内部的这个逻辑以便全局使用吗?
2021-03-25 21:13:14
@Simmons 先生 - 很好的收获,感谢您指出这一点。我做了一个小的调整来解决这种情况。
2021-03-25 21:13:14
处理:复制+粘贴,拖放,只允许 1 个小数,制表符,删除,退格 - 使用这个
2021-03-31 21:13:14
@ema - 是的,请在此处查看我的其他答案其中显示了如何使用 class 应用规则。
2021-04-01 21:13:14

我已经长时间努力寻找一个好的答案,我们迫切需要<input type="number",但除此之外,这两个是我能想出的最简洁的方法:

<input type="text" 
       onkeyup="this.value=this.value.replace(/[^\d]/,'')">

如果您不喜欢未接受的字符在被擦除之前的一瞬间显示,下面的方法是我的解决方案。请注意许多附加条件,这是为了避免禁用各种导航和热键。如果有人知道如何压缩它,请告诉我们!

<input type="text" 
onkeydown="return ( event.ctrlKey || event.altKey 
                    || (47<event.keyCode && event.keyCode<58 && event.shiftKey==false) 
                    || (95<event.keyCode && event.keyCode<106)
                    || (event.keyCode==8) || (event.keyCode==9) 
                    || (event.keyCode>34 && event.keyCode<40) 
                    || (event.keyCode==46) )">
input type="number" 出现在 HTML 5 中 - 你可以使用 JavaScript 作为后备polyfill ... stevefenton.co.uk/Content/Blog/Date/201105/Blog/ ...
2021-03-21 21:13:14
他也想允许.你应该真的做到/[^0-9.]/g
2021-03-27 21:13:14
好方法,但可以通过按住不可接受的键来破坏
2021-04-01 21:13:14
将正则表达式更改为/[^\d+]/按住不放即可
2021-04-04 21:13:14
@boecko 对此表示感谢,但请注意,它应该是/[^\d]+/不过很好的解决方案。还有@user235859
2021-04-07 21:13:14

这里的大多数答案都有使用键事件的弱点

许多答案会限制您使用键盘宏、复制+粘贴和更多不需要的行为进行文本选择的能力,其他答案似乎依赖于特定的 jQuery 插件,这会用机枪杀死苍蝇。

无论输入机制如何(击键、复制+粘贴、右键单击复制+粘贴、语音到文本等),这个简单的解决方案似乎最适合我跨平台。所有文本选择键盘宏仍然可以工作,它甚至会限制用户通过脚本设置非数字值的能力。

function forceNumeric(){
    var $input = $(this);
    $input.val($input.val().replace(/[^\d]+/g,''));
}
$('body').on('propertychange input', 'input[type="number"]', forceNumeric);
@Atirag 如果你想要小数,你可以改变正则表达式 /[^\d,.]+/
2021-03-18 21:13:14
另一种正则表达式:replace(/[^\d]+/g,'')用空字符串替换所有非数字。不需要“i”(不区分大小写)修饰符。
2021-04-01 21:13:14
这应该是最重要的,因为标签中的“onkey”事件处理程序不应再传播......
2021-04-06 21:13:14
这绝对是这里最好的答案,但它不允许带有十进制数字的数字。知道那是如何工作的吗?
2021-04-06 21:13:14
需要 jQuery 1.7+。这是一个更完整的答案,因为它通过“复制”考虑了输入。而且还更简单!
2021-04-08 21:13:14