当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《HTML文本输入仅允许数字输入》经验,为你挑选了27个好方法。

有没有一种快速的方法来设置HTML文本输入()只允许数字键击(加'.')?



1> inspite..:
JavaScript的

注意:这是一个更新的答案.下面的评论是指使用密钥代码搞乱的旧版本.

下面的脚本中的函数允许您对文本使用任何类型的输入过滤器setInputFilter,包括各种数字过滤器.这将正确处理自IE 9以来的复制+粘贴,拖放,键盘快捷键,上下文菜单操作,不可键入的键,光标位置,所有键盘布局和所有浏览器.请注意,您仍然必须进行服务器端验证!

在JSFiddle上自己尝试一下.

// 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(document.getElementById("myTextBox"), function(value) {
  return /^\d*\.?\d*$/.test(value); // Allow digits and '.' only, using a RegExp
});

您可能想要使用的一些输入过滤器:

数值(正面和负面):
setInputFilter

数值(仅限正数):

数值(正数且达到特定限制):
step

浮点值(允许两者minmax小数分隔符):
e

货币值(即最多两位小数):
E

十六进制值:

jQuery的

还有一个jQuery版本.请参阅此答案或在JSFiddle上自行尝试.

HTML 5

HTML 5有一个原生解决方案setInputFilter(参见规范),但请注意浏览器支持有所不同:

大多数浏览器仅在提交表单时验证输入,而不是在输入时验证.

大多数移动浏览器不支持setInputFilter,step属性.

Chrome(版本71.0.3578.98)仍然允许用户输入字符minmax进入字段.另见这个问题.

Firefox(版本64.0)和Edge(EdgeHTML版本17.17134)仍然允许用户在该字段中输入任何文本.

在w3schools.com上亲自尝试一下.

更复杂的验证选项

如果你想做一些其他验证的点点滴滴,这可能很方便:

https://gist.github.com/nbouvrette/84ef4f498ac06cdd5b60

http://www.javascript-coder.com/html-form/javascript-form-validation.phtml

https://github.com/lockevn/html-numeric-input

https://github.com/jonstipe/number-polyfill


输入类型编号不能用于使您的输入仅接受数字.它适用于指定"项目数"的输入.例如,Chrome会添加两个小箭头,以便将数量减少一个.适当的仅数字输入是对HTML的一种荒谬的遗漏.
type ="number"实际上不会阻止在字段中输入无效文本; 看起来您甚至可以将垃圾数据剪切并粘贴到字段中,即使是在chrome中也是如此.
仍然不支持Firefox 21(我甚至不谈IE9或更早版本......)
我要添加的唯一内容是更改Ctrl + A行以包含MacOSX用户:`(e.keyCode == 65 &&(e.ctrlKey === true || e.metaKey === true))`
虽然这是一个不错的选择,但仍然可以输入/,多个点,其他运算符等字符.
jQuery变体允许键盘布局上的其他符号,其中数字行上还有其他符号,例如AZERTY键盘或立陶宛键盘.
shift键被脚本阻止,我正在使用IMAC,我的键盘需要转换才能发布数字,在我的情况下不是很有用.

2> geowa4..:

使用这个DOM


而这个脚本

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();
  }
}


这段代码几乎没有问题.你可以输入.不止一次,第二次它不允许删除密钥,任何解决方案?
eeepc 900上的德语设置.好的可用的一些关键不起作用: - 退格键(keyCode:8) - 左右导航键(keyCode:37,38)也可以复制和粘贴...
大多数人都会关心,因为脚本错误显示在您的网站上反映不佳.
我关心退格,删除和箭头不工作.如果你删除"theEvent.keycode ||",并添加:"if(/ [ - 〜]/&&!regex.test(key)){"那么它确实更好(无论如何对于ASCII/UTF).但那时它不会拒绝中文字符!:)
这允许有人将随机内容粘贴到输入中
更改为**if(theEvent.preventDefault)theEvent.preventDefault();**因为并非所有浏览器都支持
@Sam我刚刚在正则表达式之前开始执行此操作:if(evt.key =="Backspace"|| evt.key =="Del")return true;

3> 小智..:

我一直在努力寻找一个很好的答案,我们迫切需要,但缺乏这一点,这两个是我能想出的最简洁的方法:


如果您不喜欢在删除之前显示一秒钟的未接受字符,则下面的方法是我的解决方案.请注意许多其他条件,这是为了避免禁用各种导航和热键.如果有人知道如何使这个变得紧凑,请告诉我们!



@boecko感谢你,但请注意它应该是`/ [^\d] + /`.不错的解决方案.还有@ user235859
他也想允许`.`.你应该把它变成`/ [^ 0-9.]/g`
将正则表达式更改为`/ [^\d +] /`,它可以按住
好的方法,但可以通过按住一个不可接受的键来打破
输入类型="数字"将在HTML 5中出现 - 您可以使用JavaScript作为后备填充... http://www.stevefenton.co.uk/Content/Blog/Date/201105/Blog/HTML- 5-表单的数输入 - 要素/
@DEREKLEE不支持

4> billynoah..:

这是一个简单的,只允许一个十进制,但不多:



5> Vasyl..:

还有一个例子,对我很有用:

function validateNumber(event) {
    var key = window.event ? event.keyCode : event.which;
    if (event.keyCode === 8 || event.keyCode === 46) {
        return true;
    } else if ( key < 48 || key > 57 ) {
        return false;
    } else {
        return true;
    }
};

也附加到按键事件

$(document).ready(function(){
    $('[id^=edit]').keypress(validateNumber);
});

和HTML:


这是一个jsFiddle示例



6> Ms2ger..:

HTML5有,这听起来很适合你.目前,只有Opera本机支持它,但有一个项目具有JavaScript实现.



7> EJTH..:

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

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

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

function forceNumeric(){
    var $input = $(this);
    $input.val($input.val().replace(/[^\d]+/g,''));
}
$('body').on('propertychange input', 'input[type="number"]', forceNumeric);


@Atirag如果你想要小数,你可以改变正则表达式`/ [^\d,.] + /`

8> Mahendra Liy..:

我选择使用这里提到的两个答案的组合即

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode
    return !(charCode > 31 && (charCode < 48 || charCode > 57));
}


删除怎么样?你想要数字,但你可能希望人们能够在不刷新页面的情况下纠正它们......

9> james.garris..:

HTML5支持正则表达式,因此您可以使用:


警告:某些浏览器尚不支持此功能.


仅在提交时检查模式.你仍然可以输入字母.
HTML5也有``.

10> patrick..:

JavaScript的

function validateNumber(evt) {
    var e = evt || window.event;
    var key = e.keyCode || e.which;

    if (!e.shiftKey && !e.altKey && !e.ctrlKey &&
    // numbers   
    key >= 48 && key <= 57 ||
    // Numeric keypad
    key >= 96 && key <= 105 ||
    // Backspace and Tab and Enter
    key == 8 || key == 9 || key == 13 ||
    // Home and End
    key == 35 || key == 36 ||
    // left and right arrows
    key == 37 || key == 39 ||
    // Del and Ins
    key == 46 || key == 45) {
        // input is VALID
    }
    else {
        // input is INVALID
        e.returnValue = false;
        if (e.preventDefault) e.preventDefault();
    }
}

另外你可以添加逗号,句号和减号(,.-)

  // comma, period and minus, . on keypad
  key == 190 || key == 188 || key == 109 || key == 110 ||

HTML




11> 小智..:

很简单....

//在JavaScript函数中(可以使用HTML或PHP).

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}

在您的表单输入中:


输入最大值 (以上这些允许12位数字)



12> Romain Linso..:

2解决方案:

使用表单验证器(例如使用jQuery验证插件)

使用正则表达式在输入字段的onblur(即用户离开字段时)事件期间进行检查:






13> Vitim.us..:

更安全的方法是检查输入的值,而不是劫持按键并尝试过滤keyCodes.

这样用户可以自由使用键盘箭头,修改键,退格键,删除键,使用非标准键盘,使用鼠标粘贴,使用拖放文本,甚至使用辅助功能输入.

以下脚本允许正数和负数

1
10
100.0
100.01
-1
-1.0
-10.00
1.0.0 //not allowed

var input = document.getElementById('number');
input.onkeyup = input.onchange = enforceFloat;

//enforce that only a float can be inputed
function enforceFloat() {
  var valid = /^\-?\d+\.\d*$|^\-?[\d]*$/;
  var number = /\-\d+\.\d*|\-[\d]*|[\d]+\.[\d]*|[\d]+/;
  if (!valid.test(this.value)) {
    var n = this.value.match(number);
    this.value = n ? n[0] : '';
  }
}


14> Ashisha Naut..:

您可以使用模式:


在这里您可以看到完整的移动网站界面提示.



15> Shyam Shinga..:

请找下面提到的解决方案.在此用户可以可以只输入numeric值,而且用户不能能够copy,paste,dragdrop输入.

允许的角色

0,1,2,3,4,5,6,7,8,9

不允许通过事件的字符和字符

字母值

特殊字符

复制

拖动

下降

$(document).ready(function() {
  $('#number').bind("cut copy paste drag drop", function(e) {
      e.preventDefault();
  });     
});
function isNumberKey(evt) {
    var charCode = (evt.which) ? evt.which : evt.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}





16> 小智..:

如果您想在alpha或数字之间建议设备(可能是手机),您可以使用.



17> Tarmo..:

使用jQuery和replace()而不是查看event.keyCode或event.which的简短而甜蜜的实现:

$('input.numeric').live('keyup', function(e) {
  $(this).val($(this).val().replace(/[^0-9]/g, ''));
});

键入的字母暂时出现的小副作用和CTRL/CMD + A似乎表现得有点奇怪.



18> Mile Mijatov..:

再举一个例子,你可以在输入字段中添加唯一号码,不能




19> 小智..:

JavaScript代码:

function validate(evt)
{
    if(evt.keyCode!=8)
    {
        var theEvent = evt || window.event;
        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();
            }
        }
    }

HTML代码:


完美的工作,因为退格键代码是8,正则表达式不允许它,所以这是一个绕过错误的简单方法:)



20> 小智..:

input type="number" 是HTML5属性.

在另一种情况下,这将帮助您:

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}




21> Shurok..:

只是使用jQuery的另一个变种

$(".numeric").keypress(function() {
    return (/\d/.test(String.fromCharCode(event.which) ))
});



22> Sai Gopi N..:

现在使用type ="number"这个属性支持大多数浏览器




23> cincplug..:

您还可以将输入值(默认情况下视为字符串)与强制为数字的自身进行比较,如:

if(event.target.value == event.target.value * 1) {
    // returns true if input value is numeric string
}

但是,您需要将其绑定到事件,如键盘等.



24> Voidcode..:
 




25> Ehsan Chavos..:

这是一个改进的功能:

function validateNumber(evt) {
  var theEvent = evt || window.event;
  var key = theEvent.keyCode || theEvent.which;
  if ((key < 48 || key > 57) && !(key == 8 || key == 9 || key == 13 || key == 37 || key == 39 || key == 46) ){
    theEvent.returnValue = false;
    if (theEvent.preventDefault) theEvent.preventDefault();
  }
}



26> 小智..:

使用此DOM:


这个脚本:

validate = function(evt)
{
    if ([8, 46, 37, 39, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 35, 36].indexOf(evt.keyCode || evt.which) == -1)
    {
        evt.returnValue = false;
        if(evt.preventDefault){evt.preventDefault();}
    }
}

...或者这个脚本,没有indexOf,使用两个for...

validate = function(evt)
{
    var CharValidate = new Array("08", "046", "039", "948", "235");
    var number_pressed = false;
    for (i = 0; i < 5; i++)
    {
        for (Ncount = 0; Ncount < parseInt(CharValidate[i].substring(0, 1)) + 1; Ncount++)
        {
            if ((evt.keyCode || evt.which) == parseInt(CharValidate[i].substring(1, CharValidate[i].lenght)) + Ncount)
            {
                number_pressed = true;
            }
        }
    }
    if (number_pressed == false)
    {
        evt.returnValue = false;
        if(evt.preventDefault){evt.preventDefault();}
    }
}

我使用onkeydown属性而不是onkeypress,因为onkeydown属性是在onkeypress属性之前检查的。问题可能出在Google Chrome浏览器中。

使用属性“ onkeypress”,在Google chrome上使用“ preventDefault”将无法控制TAB,但是使用属性“ onkeydown”将TAB变为可控制!

TAB的ASCII码=> 9

第一个脚本的代码少于第二个脚本的代码,但是,ASCII字符数组必须具有所有键。

第二个脚本比第一个脚本大得多,但是数组不需要所有键。数组每个位置的第一个数字是每个位置将被读取的次数。对于每个读数,将增加1至下一个读数。例如:




NCount = 0

48 + NCount = 48

NCount + +

48 + NCount = 49

NCount + +

...

48 + NCount = 57




如果数字键只有10(0-9)个,但是如果它们是100万个,则用所有这些键创建数组是没有意义的。

ASCII码:

8 ==>(退格);

46 =>(删除);

37 =>(向左箭头);

39 =>(向右箭头);

48-57 =>(数字);

36 =>(主页);

35 =>(结束);



27> AleKennedy..:

解决此问题的一种简单方法是实现jQuery函数,以使用正则表达式验证文本框中键入的字符,例如:

您的html代码:


以及使用jQuery的js函数

$(function() {
    $('.integerInput').on('input', function() {
      this.value = this.value
        .replace(/[^\d]/g, '');// numbers and decimals only

    });
});


$(function() {
    $('.integerInput').on('input', function() {
      this.value = this.value
        .replace(/[^\d]/g, '');// numbers and decimals only

    });
});
推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有