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


852

有没有一种快速的方法来将HTML文本输入(<input type=text />)设置为仅允许数字键击(加'。')?


81
这里的许多解决方案仅在按键时起作用。如果人们使用菜单粘贴文本,或者将文本拖放到文本输入中,则这些操作将失败。我以前被那个咬过。小心!
Bennett McElwee,

83
@JuliusA-无论如何,您始终 始终需要服务器端验证。
斯蒂芬·P

46
<input type="text" onkeypress='return event.charCode >= 48 && event.charCode <= 57'></input>
Droogans

14
@Droogans注意,这还会禁用任何其他键,例如TAB转到下一个输入,或者其他与输入不直接相关的快捷方式(如cmd + R)直接与网站相关(如果输入集中)。
亚历杭德罗·佩雷斯

1
如果您对插件没问题,请使用NumericInput。演示:jsfiddle.net/152sumxu/2此处更多详细信息stackoverflow.com/a/27561763/82961
Faiz

Answers:


1137

注意:这是更新的答案。下面的注释指的是一个旧版本,其中包含了密钥代码。

的JavaScript

在JSFiddle上尝试一下。

您可以<input>使用以下setInputFilter功能过滤文本的输入值(支持Copy + Paste,Drag + Drop,键盘快捷键,上下文菜单操作,不可键入的键,插入符号的位置,不同的键盘布局以及自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版本。

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">(请参见规范),但是请注意,浏览器支持有所不同:

  • 大多数浏览器将仅在提交表单时验证输入,而不在键入时验证输入。
  • 大多数移动浏览器不支持stepminmax属性。
  • Chrome(版本71.0.3578.98)仍然允许用户输入字符eE输入字段。也看到这个问题
  • Firefox(版本64.0)和Edge(EdgeHTML版本17.17134)仍然允许用户在字段中输入任何文本。

在w3schools.com上尝试一下。


4
虽然这将是一个不错的选择,这仍然允许进入像/,多点,其他运营商等角色
马亨德拉丽雅

6
仍不受Firefox 21支持(我什至不谈论IE9或更早版本...)
JBE

67
输入类型数字并不意味着要使您的输入仅接受数字。它用于指定“项目数”的输入。例如,Chrome添加了两个小箭头,以增加数字,减少一个。适当的仅数字输入是对HTML的一种荒谬的省略。
Erwin 2013年

9
type =“ number”实际上并不能阻止在该字段中输入无效的文本;看来您甚至可以将垃圾数据剪切并粘贴到该字段中,即使是在chrome中也是如此。
完美主义者

6
我唯一要添加的是更改Ctrl + A行以包括MacOSX用户:(e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true))
MForMarlon 2015年

280

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

12
eeepc 900上的德语设置。某些用于良好可用性的键不起作用:-退格键(keyCode:8)-左侧和右侧导航键(keyCode:37,38)也可以复制和粘贴...
Michael Piendl

11
大多数人都在乎,显示脚本错误反映在您的网站上效果很差。
罗伯特·耶普森

14
此代码的几个问题。您可以输入。不止一次,第二次不允许删除密钥,有什么解决办法吗?
coure2011 2011年

4
我关心退格键,删除键和箭头不起作用。如果删除“ theEvent.keycode ||”,并添加:“ if(/ [-〜] / &&!regex.test(key)){”,那么它的效果更好(无论如何对于ASCII / UTF)。但是,它不会拒绝汉字!:)
Sam Watkins

4
这允许某人将随机内容粘贴到输入中
Vitim.us 2012年

136

我一直在努力寻找这个问题的好答案,我们非常需要它<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) )">

4
输入type =“ number”出现在HTML 5中-您可以将JavaScript用作后备polyfill
Fenton

5
好的方法,但是可以通过按住不可接受的键来破坏
Scott Brown

8
将正则表达式更改为/[^\d+]/,它可以按住
boecko 2012年

11
@boecko对此表示感谢,但请注意,它应该/[^\d]+/改为。好的解决方案。同样@ user235859
Mosselman

11
他也想允许.。您实际上应该做到/[^0-9.]/g
Qsario 2012年

93

这是一个简单的值,它只允许一个小数,但不能再多:

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


12
手柄:复制粘贴+,可拖放,只允许1位小数,标签,删除,退格-用这一个
Mathemats

是否可以提取oninput内部的此逻辑以便可以全局使用?
ema

@ema-是的,在这里查看我的其他答案该答案显示了如何使用类来应用规则。
Billynoah

如果在角度形式上使用此值,则该值将不会在形式控制值中更新。
Ale_info

太棒了 我将事件更改为this.value = this.value.replace(/ [^ 0-9 .-] / g,'').replace(/(\..*)\./ g,'$ 1')。 replace(/ ^ 0 + / g,'').replace(/(?<!^)-/ g,''); 这样,它仅在开头处理-,而在数字开头不允许使用0。
brenth

54

还有一个例子,对我来说非常有用:

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示例


粘贴的文字呢?
詹森·埃伯西

调用此函数时为什么会显示“事件未定义”?
文森特

1
当event.keyCode始终返回0时,这在Firefox上不起作用。我用新代码修复了:function validateNumber(event){var key = event.which || event.charCode || event.keyCode || 0; if(key == 8 || key == 46 || key == 37 || key == 39){返回true; } else if(key <48 || key> 57){返回false;}返回true; };
阮阮

1
正如@Jessica所说,您可以添加撇号甚至百分号。
亚历杭德罗·纳瓦

1
很接近!但确实允许多于一个小数。
kross

52

HTML5具有<input type=number>,它听起来很适合您。当前,只有Opera本身支持它,但是有一个项目具有JavaScript实现。


这是定义哪些浏览器支持此属性的文档: caniuse.com/input-number。撰写本文时,Chrome和Safari都完全支持此类型字段。IE 10具有部分支持,而Firefox不支持。
内森·华莱士

唯一的问题type=number是IE9不支持
J Rod Rod

@JRod有一个填充工具为老IE。更多信息在这里
jkdev '16

6
第一个问题是type=number允许使用echar,因为它考虑e+10为数字。第二个问题是您不能限制输入中最大字符数。
哈坎·菲斯蒂克(HakanFıstık),

另一个问题是,如果类型是数字,那么我将无法获得将类型设置为例如“ tel”的好处。
ScottyBlades

49

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

许多答案会限制您使用键盘宏进行文本选择,复制+粘贴以及更多不良行为的能力,其他答案似乎取决于特定的jQuery插件,该插件使用机枪杀死苍蝇。

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

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

需要jQuery 1.7+。这是一个更完整的答案,因为它考虑了通过“复制”的帐户输入。而且它也更简单!
Memochipan 2015年

另一种正则表达式:replace(/[^\d]+/g,'')用空字符串替换所有非数字。不需要“ i”(不区分大小写)修饰符。
Memochipan 2015年

这应该放在最上面,因为标签中的“ onkey”事件处理程序不应再传播...
gpinkas 2015年

这绝对是最好的答案,但是它不允许带有十进制数字的数字。任何想法如何工作?
Atirag '16

6
@Atirag如果您想使用小数,则可以更改正则表达式/[^\d,.]+/
EJTH 2013年

41

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

<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);">


极好的答案... +1。您还可以将if语句减少为: return !(charCode > 31 && (charCode < 48 || charCode > 57));
schadeck 2013年

7
怎么删除呢?您需要数字,但您可能希望人们能够在不刷新页面的情况下对其进行更正...
Martin Erlic

39

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

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

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


7
HTML5也有<input type=number>
Mathias Bynens

真正。您应该将此作为答案。糟糕,@ Ms2ger已经拥有。
james.garriss 2011年

<input type = number>在某些浏览器中添加了用于增加和减少的箭头,因此当我们希望避免使用微调器时,这似乎是一个不错的解决方案
Ayrad 2013年

34
模式仅在提交时检查。您仍然可以输入字母。
Erwin 2013年

+模式属性是什么意思?
PlanetHackers

18

的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);"/ >

在必须使用Shift键输入数字的键盘上无法正常工作(例如,欧洲AZERTY键盘)。
明智船长

谢谢男人,您真的了解一个问题!很好的例子和偏离路线的处理。或,(大多数人希望使用数字进行运算)
real_yggdrasil 2015年

这是唯一可防止粘贴非数值的方法。
李德礼

16

很简单....

//在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位数字)


不要那样做!这会阻止所有内容,小键盘,箭头键,Delete键,快捷键(例如CTRL + A,CTRL + R),甚至TAB键也确实令人讨厌!
Korri

@Korri我不关注,这似乎是个问题吗?就我而言,它确实工作正常。
2013年

第一行必须更改为:var charCode = (evt.which) ? evt.which : evt.keyCode;
peiman F.

15

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);"/>

有趣的是,我必须给正则表达式指定“ ^ \\ d \\。?\\ d * $”,但这可能是因为页面是通过XSLT转换运行的。
Paul Tomblin

我认为正则表达式不正确。我用了这条线:var regExpr = /^\d+(\.\d*)?$/;
哥斯塔

@costa不确定,例如,用户是否要输入.123(而不是0.123)?
罗曼·林索拉斯

@romaintaz。没错,但是您必须更改正则表达式,以确保在点前面没有数字的情况下,在点后面有数字。像这样:var regExpr = /^\d+(\.\d*)?$|^\.\d+$/;
哥斯达黎加

14

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

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

以下脚本允许使用正数和负数

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>

编辑:我删除了我的旧答案,因为我认为它已经过时了。


这确实似乎涵盖了大多数情况
Zia Ul Rehman Mughal


13

请找到以下提到的解决方案。在此用户可以可以只输入numeric值,而且用户不能能够copypastedragdrop输入。

允许的字符

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">

让我知道是否有效。


11

如果您想向设备(例如手机)建议字母或数字之间的距离,则可以使用<input type="number">


11

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

<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');">

10

使用jQuery和replace()的简短实现,而不是查看event.keyCode或event。哪个:

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

键入的字母会暂时出现,并且CTRL / CMD + A似乎只是一个小小的副作用。


9

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)"/>

第一行必须更改为:var charCode = (evt.which) ? evt.which : evt.keyCode;
peiman F.

9

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,而正则表达式表达式不允许它,所以这是绕过该错误的简单方法:)


9

解决此问题的一种简单方法是实现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"/>


		


8

jQuery使用的另一个变体

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

8

只需使用type =“ number”,现在此属性在大多数浏览器中均受支持

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

我没有检查数据是--1(2减去1之前的字符)。
Ngoc Nam '18

6

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

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

但是,您需要将其绑定到诸如keyup等事件。


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

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

6

我看到了一些很棒的答案,但是我喜欢它们尽可能的小而简单,所以也许有人会从中受益。我将使用javascript Number()和以下isNaN功能:

if(isNaN(Number(str))) {
   // ... Exception it is NOT a number
} else {
   // ... Do something you have a number
}

希望这可以帮助。


1
我喜欢这个!如此优雅的解决方案,不涉及正则表达式。
维·罗伯茨

这不是问题的答案,OP要求仅允许输入文本,之后不进行验证。
Timberman

是的,那是事实!但是已经有一个公认的答案,我认为这是不错的选择,但是我认为这可能会对某人有所帮助,而且它很好而且干净。
死叉

5

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

...或者这个脚本,没有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 =>(结束);

5

这是一个改进的功能:

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

4

最好的方法(允许所有类型的数字-实数负数,实数正数,iinteger负数,整数正数)是:

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

4

这是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'));
            }
    }); 
});

@UserB这不应删除任何内容。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.