有没有一种快速的方法来设置 HTML 文本输入(<input type=text />)只允许数字击键(加“.”)?

有帮助吗?

解决方案

注: 这是一个更新的答复。下面的评论中提到一个旧的版本,摆弄键码.

JavaScript

setInputFilter 功能下允许使用 任何 种输入过滤器上的文字 <input>, ,包括各种数字过滤器(见下文)。

与大多数其他的解决方案,这个 正确支持 复制贴,拖+下降,所有快捷键,所有上下文的菜单的操作,所有非该键键(例如光标和导航键),插入的位置,所有键盘布局的所有语言的和平台, 所有的浏览器由于即9.

自己试试 在JSFiddle.

// Restricts input for the given textbox to the given inputFilter.
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);
      }
    });
  });
}

// Restrict input to digits and '.' by using a regular expression filter.
setInputFilter(document.getElementById("myTextBox"), function(value) {
  return /^\d*\.?\d*$/.test(value);
});

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

  • 整数 值(积极的唯):
    /^\d*$/.test(value)
  • 整数 值(积极的和特定的限制):
    /^\d*$/.test(value) && (value === "" || parseInt(value) <= 500)
  • 整数 值(正面和负面的):
    /^-?\d*$/.test(value)
  • 浮点 值(允许 ., as decimal separator):
    /^-?\d*[.,]?\d*$/.test(value)
  • 货币 值(即最多两个小数位数):
    /^-?\d*[.,]?\d{0,2}$/.test(value)
  • A-Z 只有(即基本的拉丁字母):
    /^[a-z]*$/i.test(value)
  • 拉丁字母 只有(即英语和大多数欧洲语言,看到 https://unicode-table.com 对于细节约Unicode character范围):
    /^[a-z\u00c0-\u024f]*$/i.test(value)
  • 十六 值:
    /^[0-9a-f]*$/i.test(value)

注意,你仍然 必须 做服务器验证!

jQuery

还有一个jQuery版本。看看 这个答案 或者自己尝试一下 在JSFiddle.

HTML5

HTML5有机溶液 <input type="number"> (见的 说明书),但是注意浏览器支持的变化:

  • 大多数浏览器将只验证输入时提交形式,而不是打字的时候.
  • 大多数移动的浏览器 不支持 step, minmax 属性。
  • 铬(版本71.0.3578.98)仍然允许的用户输入的人物 eE 进入该领域。也见 这个问题.
  • 火狐(版本64.0)和边缘(EdgeHTML版17.17134)仍然允许的用户输入 任何 案文进入该领域。

自己试试 上w3schools.com.

其他提示

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

我已经搜索漫长而艰难的一个很好的答案,我们迫切需要<input type="number",但短期的是,这2个是最简洁的方法,我能想出:

<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="text" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" />

和一个例子,这对我的伟大工程:

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:

<input type="input" id="edit1" value="0" size="5" maxlength="5" />

这里是

一个的jsfiddle示例

HTML5已经<input type=number>,这听起来适合你。目前,只有Opera支持它本身,但具有JavaScript实现项目

这里大部分答案都使用密钥 - 事件的弱点。

许多问题的答案会限制你做键盘宏文本选择的能力,复制粘贴+,更不受欢迎的行为,其他人似乎依赖于特定的jQuery插件,这是杀苍蝇用机枪。

这个简单的解决方案似乎是最适合我的跨平台,无论投入机制(击键,复制粘贴+,右击复制粘贴+,语音到文本等)。所有的文本选择键盘宏将仍起作用,它甚至会限制那些设置由脚本一个非数字值的能力。

function forceNumeric(){
    this.value(this.value.replace(/[^\d]+/g,''));
}
$('body').on('propertychange input', 'input.numeric-text', forceNumeric);

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

<input type="number" />

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

<input type="text" onkeypress="return isNumberKey(event);">

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

<input id="numbersOnly" pattern="[0-9.]+" type="text">

警告:有些浏览器不支持此尚未

的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

<input type="text" onkeydown="validateNumber(event);"/ >

2级的解决方案:

使用一种形式的验证(例如具有 jQuery验证插件

的onblur期间执行的检查(即,当用户离开该场)的输入场的情况下,与正则表达式:

<script type="text/javascript">
function testField(field) {
    var regExpr = new RegExp("^\d*\.?\d*$");
    if (!regExpr.test(field.value)) {
      // Case of error
      field.value = "";
    }
}

</script>

<input type="text" ... onblur="testField(this);"/>

所以简单....

<强> //在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;
}

<强>在形式输入:

<input type=text name=form_number size=20 maxlength=12 onkeypress='return isNumberKey(event)'>

使用输入最大。 (这些上述允许有12位数字)

一个更安全的方法是检查输入的值,而不是劫持按键,并试图以过滤的键码。

此方式,用户可以自由使用键盘箭头,修改键,退格键,删除,使用非标准keyboars,用鼠标粘贴,使用拖放文本,即使使用辅助输入。

在下面脚本允许正数和负数

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] : '';
  }
}
<input id="number" value="-3.1415" placeholder="Type a number" autofocus>

编辑:我删除了我的老答案,因为我认为现在是过时

请查看以下提到的解决方案。在这个用户可能只进入 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;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" class="form-control" name="number" id="number" onkeypress="return isNumberKey(event)" placeholder="Enter Numeric value only">

让我知道,如果它不工作的。

可以使用图案为这样:

<input id="numbers" pattern="[0-9.]+" type="number">

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

如果要建议字母或数字可以使用<input type="number">之间的设备(可能是移动电话)。

使用jQuery和替换(),而不是在寻找event.keyCode或event.which短而甜实现:

$('input.numeric').live('keyup', function(e) {
  $(this).val($(this).val().replace(/[^0-9]/g, ''));
});
该类型信暂时出现和CTRL / CMD + A似乎表现有点奇怪

只有小的副作用。

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代码:

<input type='text' name='price' value='0' onkeypress='validate(event)'/>

完美地工作,因为退格键码是8和正则表达式表达不让它,所以它的绕过错误一种简单的方法:)

只是一个其他变体与jQuery使用

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

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

<input type="number" name="somecode" onkeypress="return isNumberKey(event)"/>

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

<input type="text" class="form-control" id="phone" name="phone" placeholder="PHONE" spellcheck="false" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');">

只是使用类型= “数字”立即这个属性在大多数浏览器支持

<input type="number" maxlength="3" ng-bind="first">

您也可以输入值(其被视为默认字符串)比较本身被迫为数字,如:

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

然而,需要的是结合到像KEYUP等事件。

<input name="amount" type="text" value="Only number in here"/> 

<script>
    $('input[name=amount]').keyup(function(){
        $(this).val($(this).val().replace(/[^\d]/,''));
    });
</script>

使用这DOM:

<input type = "text" onkeydown = "validate(event)"/>

和这个脚本:

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

...或者这个脚本,而不个使用两个 for's...

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属性。问题将是在谷歌的铬浏览器。

与属性"onkeypress",标签将会无法控制的与"preventDefault"在,但是,有的属性"onkeydown",标签成为可控制的!

ASCII码TAB=>9

第一个脚本中有不少代码比第二,然而,列ASCII characters必须有所有的钥匙。

第二个脚本是远远大于第一,但阵列并不需要所有的钥匙。第一位在每个位置阵列的次数每位会阅读。每个读,将增加1到下一个。例如:




NCount=0

48+NCount=48

NCount++

48+NCount=49

NCount++

...

48+NCount=57




在这种情况下的数字键是只有10(0-9),但是如果他们是1百万不会感到创建一个列有所有这些钥匙。

ASCII码:

  • 8==>(退格);
  • 46=>(删除);
  • 37=>(左箭);
  • 39=>(右箭);
  • 48-57=>(号码);
  • 36=>(家庭);
  • 35=>(结束);

这是一种改进的功能:

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

的最佳方式(允许所有类型的数字 - 真实负,正实,整数负,正整数)是:

$(input).keypress(function (evt){
    var theEvent = evt || window.event;
    var key = theEvent.keyCode || theEvent.which;
    key = String.fromCharCode( key );
    var regex = /[-\d\.]/; // dowolna liczba (+- ,.) :)
    var objRegex = /^-?\d*[\.]?\d*$/;
    var val = $(evt.target).val();
    if(!regex.test(key) || !objRegex.test(val+key) || 
            !theEvent.keyCode == 46 || !theEvent.keyCode == 8) {
        theEvent.returnValue = false;
        if(theEvent.preventDefault) theEvent.preventDefault();
    };
}); 

这是 geowa4的溶液的扩展版本。支持minmax属性。如果该数量超出范围,先前的值将被显示。

可以在此处对其进行测试。

用法:<input type=text class='number' maxlength=3 min=1 max=500>

function number(e) {
var theEvent = e || window.event;
var key = theEvent.keyCode || theEvent.which;
if(key!=13&&key!=9){//allow enter and tab
  key = String.fromCharCode( key );
  var regex = /[0-9]|\./;
  if( !regex.test(key)) {
    theEvent.returnValue = false;
    if(theEvent.preventDefault) theEvent.preventDefault();
    }   
  }
}

$(document).ready(function(){
    $("input[type=text]").filter(".number,.NUMBER").on({
        "focus":function(e){
         $(e.target).data('oldValue',$(e.target).val());
            },
        "keypress":function(e){
                e.target.oldvalue = e.target.value;
                number(e);
            },
        "change":function(e){
            var t = e.target;
            var min = $(t).attr("min");
            var max = $(t).attr("max");
            var val = parseInt($(t).val(),10);          
            if( val<min || max<val)
                {
                    alert("Error!");
                    $(t).val($(t).data('oldValue'));
                }

            }       
    });     
});

如果输入是动态使用这样的:

$(document).ready(function(){
    $("body").on("focus","input[type=text].number,.NUMBER",function(e){
        $(e.target).data('oldValue',$(e.target).val());
    }); 
    $("body").on("keypress","input[type=text].number,.NUMBER",function(e){
        e.target.oldvalue = e.target.value;
        number(e);
    }); 
    $("body").on("change","input[type=text].number,.NUMBER",function(e){
        var t = e.target
        var min = $(t).attr("min");
        var max = $(t).attr("max");
        var val = parseInt($(t).val());         
        if( val<min || max<val)
            {
                alert("Error!");
                $(t).val($(t).data('oldValue'));
            }
    }); 
});

为了获得更好的用户体验,我的解决方案:

超文本标记语言

<input type="tel">

jQuery

$('[type=tel]').on('change', function(e) {
  $(e.target).val($(e.target).val().replace(/[^\d\.]/g, ''))
})
$('[type=tel]').on('keypress', function(e) {
  keys = ['0','1','2','3','4','5','6','7','8','9','.']
  return keys.indexOf(event.key) > -1
})

细节:

首先, 输入类型:

number 显示缩小实际输入空间的向上/向下箭头,我发现它们很难看,并且仅在数字代表数量(例如电话、区号、ID...不需要它们)tel 提供类似的无箭头数字浏览器验证

使用 [number / tel] 还有助于在移动设备上显示数字键盘。

对于 JS 验证,我最终需要 2 个函数,一个用于正常用户输入(按键),另一个用于复制+粘贴修复(更改),其他组合会给我带来糟糕的用户体验。

我用 更可靠 键盘事件.key 而不是 现已弃用 键盘事件.charCode

根据您的浏览器支持,您可以考虑使用 Array.prototype.includes() 而不是名字不好的 Array.prototype.indexOf() (对于真/假结果)

要解决此问题的一个简单的方法被实现jQuery函数与正则表达式来验证在文本框中例如键入构成特征:

您的HTML代码:

<input class="integerInput" type="text">

和使用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
            
        });
    });
<script
			  src="https://code.jquery.com/jquery-2.2.4.min.js"
			  integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
			  crossorigin="anonymous">
</script>

<input type="text" class="integerInput"/>


		

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top