jQuery:限制文本框仅输入“数字”的最佳方法是啥? (允许小数点)

Posted

技术标签:

【中文标题】jQuery:限制文本框仅输入“数字”的最佳方法是啥? (允许小数点)【英文标题】:jQuery: what is the best way to restrict "number"-only input for textboxes? (allow decimal points)jQuery:限制文本框仅输入“数字”的最佳方法是什么? (允许小数点) 【发布时间】:2010-10-27 20:40:57 【问题描述】:

限制文本框仅输入“数字”的最佳方法是什么?

我正在寻找允许小数点的东西。

我看到很多例子。但尚未决定使用哪一个。

来自 Praveen Jeganathan 的更新

没有更多的插件,jQuery 在 v1.7 中添加了自己的 jQuery.isNumeric()。 见:https://***.com/a/20186188/66767

【问题讨论】:

这是一个基于意见的问题,但非常有用。应该允许基于意见的问题。寻找此信息的人只需要知道这只是基于意见的答案。一个标签就足够了。 【参考方案1】:

如果您想限制输入(而不是验证),您可以使用键事件。像这样:

<input type="text" class="numbersOnly" value="" />

还有:

jQuery('.numbersOnly').keyup(function ()  
    this.value = this.value.replace(/[^0-9\.]/g,'');
);

这会立即让用户知道他们不能输入字母字符等,而不是稍后在验证阶段。

您仍然需要验证,因为输入可能通过使用鼠标剪切和粘贴来填充,或者可能通过可能不会触发关键事件的表单自动完成器来填充。

【讨论】:

+1 - 我打算提出同样的建议。值得注意的是,这种形式的验证可以在每次击键时进行,而不是在最后一次。我唯一要添加的是某种形式的警告,即用户输入的内容被拒绝。简单地不显示字母会让太多人认为他们的键盘坏了。或许可以巧妙地改变背景或边框颜色.. 只要用户知道您的应用实际上正在做某事。 同意。我在tarbuilders.com 有一个例子。如果您单击“联系人”,表单会即时检查用户输入,如果有效,则会出现绿色边框和复选标记。无效 -> 红色和“x” 请参阅this answer 修复箭头键问题。 请注意,您仍然可以通过单击鼠标右键 > 粘贴来粘贴字符和字母。解决此问题的一种简单方法是:$doc.on('keyup blur input propertychange', 'input[name="price"]', function()$(this).val($(this).val().replace(/[^0-9\.]/g,''));); CRAP,如果我写数字,即“123”,然后按字母键,即“a”,它会清空输入...【参考方案2】:

更新

有一个新的非常简单的解决方案:

它允许您在文本&lt;input&gt; 上使用任何类型的输入过滤器, 包括各种数字过滤器。这将正确处理 复制+粘贴、拖放、键盘快捷键、上下文菜单操作、 不可键入的键和所有键盘布局。

查看this answer 或亲自尝试on JSFiddle。

jquery.numeric 插件

我已经使用jquery.numeric 插件成功实现了许多表单。

$(document).ready(function()
    $(".numeric").numeric();
);

此外,这也适用于 textareas!

但是,请注意,Ctrl+A、复制+粘贴(通过上下文菜单)和拖放将不会按预期工作。

html 5

随着对 HTML 5 标准的更广泛支持,我们可以对 input 元素使用 pattern 属性和 number 类型来限制仅输入数字。在某些浏览器(尤其是 Google Chrome)中,它也可以限制粘贴非数字内容。有关number 和其他较新输入类型的更多信息,请访问here。

【讨论】:

此插件不允许您在 Opera 中使用退格键。 @Darryl 源代码只有几十行,所以我确定对其进行修改以使其变得微不足道。我刚刚找到了这个插件并对其进行了修改,现在只要我只想允许整数值,就有一个allowDecimal 选项。源代码非常简单而且写得很好。 这在复制粘贴到type="number"的输入字段时不起作用。 @Tallmaris 这确实是一个非常古老的问题和答案。 HTML 发生了很多变化,应予以考虑。 嗨@TheVillageIdiot,你是对的。我不想在评论中显得粗鲁(这可能有点干):) 事实是我看到了一些最近的 cmets,所以我只是想澄清一下,目前这可能不是最好的解决方案问题。【参考方案3】:

我认为最好的答案是上面的那个。

jQuery('.numbersOnly').keyup(function ()   
    this.value = this.value.replace(/[^0-9\.]/g,''); 
);

但我同意箭头键和删除按钮将光标捕捉到字符串的末尾有点痛苦(因此在测试中它被踢回给我)

我添加了一个简单的更改

$('.numbersOnly').keyup(function () 
    if (this.value != this.value.replace(/[^0-9\.]/g, '')) 
       this.value = this.value.replace(/[^0-9\.]/g, '');
    
);

这样,如果有任何按钮不会导致文本被更改,请忽略它。有了这个,你可以点击箭头并删除而不跳到最后,但它会清除任何非数字文本。

【讨论】:

为了获得更好的性能,创建一个带有替换结果的 var,而不是运行两次。 keypress 可以用来进一步简化这一点,因为显然keyupkeydown 触发任何键盘键,而keypress only 触发“字符" 键(因此 触发箭头和删除键)。请参阅此答案以供参考:***.com/a/1367720/1298685 接受多于一位的小数。如何只接受一位小数。我已申请金额文本字段。它也需要 12.5.6。如何限制一分。 @IanCampbell 按键意味着您可以输入一个不会被删除的字符开头。不会工作。 Keydown 做同样的事情。我只能用 keyup 让它工作。【参考方案4】:

jquery.numeric 插件有一些我已通知作者的错误。它允许在 Safari 和 Opera 中使用多个小数点,并且您不能在 Opera 中键入退格键、箭头键或其他几个控制字符。我需要正整数输入,所以最后我只写了自己的。

$(".numeric").keypress(function(event) 
  // Backspace, tab, enter, end, home, left, right
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      isControlKey)  // Opera assigns values for control keys.
    return;
   else 
    event.preventDefault();
  
);

【讨论】:

使用此代码根本无法输入 0。在 Mac 上使用 Chrome 和 FF 测试。 我更新了这个以接受 0 位数字 (48 == event.which && ($(this).val() > 0 )) || // 第一个数字没有 0 这是一个很好的解决方案,但它缺少小数,只需添加 (46 == event.which && !($(this).val().includes("."))) || 根本无法输入 0。【参考方案5】:

没有更多的插件,jQuery 已经实现了自己的jQuery.isNumeric(),在 v1.7 中添加。

jQuery.isNumeric( value )

判断其参数是否为数字。

样本结果

$.isNumeric( "-10" );     // true
$.isNumeric( 16 );        // true
$.isNumeric( 0xFF );      // true
$.isNumeric( "0xFF" );    // true
$.isNumeric( "8e5" );     // true (exponential notation string)
$.isNumeric( 3.1415 );    // true
$.isNumeric( +10 );       // true
$.isNumeric( 0144 );      // true (octal integer literal)
$.isNumeric( "" );        // false
$.isNumeric();          // false (empty object)
$.isNumeric( NaN );       // false
$.isNumeric( null );      // false
$.isNumeric( true );      // false
$.isNumeric( Infinity );  // false
$.isNumeric( undefined ); // false

这是一个如何将 isNumeric() 与事件侦听器绑定的示例

$(document).on('keyup', '.numeric-only', function(event) 
   var v = this.value;
   if($.isNumeric(v) === false) 
        //chop off the last char entered
        this.value = this.value.slice(0,-1);
   
);

【讨论】:

+1 表示没有插件。我想添加一个细微的变化以允许数千个分隔符。代替 var v = this.value; 将其更改为 var v = this.value.replace(/,/g,''); 。像21,345,67.800 这样的数字太考虑了。 有谁知道这是如何检查数字的?它使用键码还是正则表达式?如果您考虑不同的键盘布局,这一点很重要。 这非常接近。但是,如果您按住字符键,它不会正确运行检查。角色将“奔跑”。试试这个:$(document).on('keyup keypress', '#somethingSomething', function() var aValue = $(this).val(); if($.isNumeric(aValue) === false) $(this).val(aValue.slice(0,-1)); );【参考方案6】:

上面提到的 numeric() 插件在 Opera 中不起作用(您不能退格、删除甚至使用后退或前进键)。

JQuery 或 javascript 中的以下代码都可以完美运行(而且只有两行)。

JQuery:

$(document).ready(function() 
    $('.key-numeric').keypress(function(e) 
            var verified = (e.which == 8 || e.which == undefined || e.which == 0) ? null : String.fromCharCode(e.which).match(/[^0-9]/);
            if (verified) e.preventDefault();
    );
);

Javascript:

function isNumeric(e)

    var keynum = (!window.event) ? e.which : e.keyCode;
    return !((keynum == 8 || keynum == undefined || e.which == 0) ? null : String.fromCharCode(keynum).match(/[^0-9]/));

当然,这仅适用于纯数字输入(加退格、删除、前进/后退键),但可以轻松更改为包含点和减号。

【讨论】:

小键盘也是不允许的【参考方案7】:

您可以使用Validation plugin 及其number() 方法。

$("#myform").validate(
  rules: 
    field: 
      required: true,
      number: true
    
  
);

【讨论】:

仅供参考 - number() 不适用于指数数字。【参考方案8】:

号码输入限制不需要长代码,试试这个代码。

它还接受有效的 int 和 float 两个值。

Javascript 方法

onload =function() 
  var ele = document.querySelectorAll('.number-only')[0];
  ele.onkeypress = function(e) 
     if(isNaN(this.value+""+String.fromCharCode(e.charCode)))
        return false;
  
  ele.onpaste = function(e)
     e.preventDefault();
  
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

jQuery 方法

$(function()

  $('.number-only').keypress(function(e) 
	if(isNaN(this.value+""+String.fromCharCode(e.charCode))) return false;
  )
  .on("cut copy paste",function(e)
	e.preventDefault();
  );

);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

更新

以上答案适用于最常见的用例 - 将输入验证为数字。

但下面是特殊用例的代码sn-p

允许负数 在删除之前显示无效的击键。

$(function()
      
  $('.number-only').keyup(function(e) 
        if(this.value!='-')
          while(isNaN(this.value))
            this.value = this.value.split('').reverse().join('').replace(/[\D]/i,'')
                                   .split('').reverse().join('');
    )
    .on("cut copy paste",function(e)
    	e.preventDefault();
    );

);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

【讨论】:

【参考方案9】:

下面是我用来阻止击键的内容。这只允许数字 0-9 和小数点。易于实现,代码不多,而且工作起来就像一个魅力:

<script>
function isNumberKey(evt) 
    var charCode = (evt.which) ? evt.which : event.keyCode;
    if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) 
        return false;
     else 
        return true;
          

</script>

<input value="" onkeypress="return isNumberKey(event)">

【讨论】:

如果有人想知道 - 您可以通过从 if 语句中删除 charCode != 46 来限制小数。很好的答案! 没错,我删除了 charCode != 46 以跳过小数。谢谢kaleazy,这个答案对我很有用。 这是一个糟糕的解决方案,因为它没有考虑退格键、箭头、控制键和其他必要的击键。 我刚刚发布了一个与此类似的解决方案,但也可以处理退格、箭头并且不使用硬编码的键码。在这里查看:***.com/a/23468513/838608【参考方案10】:

作为to this suggestion 的一个小改进,您可以使用Validation plugin 及其number()、digits 和range 方法。例如,以下内容可确保您获得 0 到 50 之间的正整数:

$("#myform").validate(
  rules: 
    field: 
      required: true,
      number: true,
      digits: true,
      range : [0, 50]
    
  
);

【讨论】:

【参考方案11】:

您不会在按键时看到字母神奇的外观和消失。这也适用于鼠标粘贴。

$('#txtInt').bind('input propertychange', function () 
    $(this).val($(this).val().replace(/[^0-9]/g, ''));
);

【讨论】:

虽然不允许使用小数,但我发现这是最简单的整数方法。 对于十进制,您可以将正则表达式更新为 /[^0-9.]/g 我不需要小数。只是因为 OP 做到了,但是是的 :)【参考方案12】:

我首先尝试使用 jQuery 解决这个问题,但我对在 keyup 上删除之前实际上出现在输入字段中的不需要的字符(非数字)感到不满意。

寻找其他解决方案我发现了这个:

整数(非负数)

<script>
  function numbersOnly(oToCheckField, oKeyEvent) 
    return oKeyEvent.charCode === 0 ||
        /\d/.test(String.fromCharCode(oKeyEvent.charCode));
  
</script>

<form name="myForm">
<p>Enter numbers only: <input type="text" name="myInput" 
    onkeypress="return numbersOnly(this, event);" 
    onpaste="return false;" /></p>
</form>

来源:https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onkeypress#Example 实例:http://jsfiddle.net/u8sZq/

小数点(非负数)

要允许一个小数点,你可以这样做:

<script>
  function numbersOnly(oToCheckField, oKeyEvent)         
    var s = String.fromCharCode(oKeyEvent.charCode);
    var containsDecimalPoint = /\./.test(oToCheckField.value);
    return oKeyEvent.charCode === 0 || /\d/.test(s) || 
        /\./.test(s) && !containsDecimalPoint;
  
</script>

来源:刚刚写了这个。似乎正在工作。 实例:http://jsfiddle.net/tjBsF/

其他自定义

要允许输入更多符号,只需将这些符号添加到用作基本字符代码过滤器的正则表达式中。 要实现简单的上下文限制,请查看输入字段 (oToCheckField.value) 的当前内容(状态)

您可能有兴趣做的一些事情:

只允许一位小数 仅当位于字符串开头时才允许减号。这将允许负数。

不足之处

插入符号位置在函数内部不可用。这大大减少了您可以实现的上下文限制(例如,没有两个相等的连续符号)。不确定访问它的最佳方式是什么。

我知道标题要求使用 jQuery 解决方案,但希望有人会发现这很有用。

【讨论】:

【参考方案13】:

感谢戴夫·亚伦·史密斯的帖子

我编辑了您的答案以接受数字部分的小数点和数字。这项工作非常适合我。

$(".numeric").keypress(function(event) 
  // Backspace, tab, enter, end, home, left, right,decimal(.)in number part, decimal(.) in alphabet
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39,110,190];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (96 <= event.which && event.which <= 106) || // Always 1 through 9 from number section 
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      (96 == event.which && $(this).attr("value")) || // No 0 first digit from number section
      isControlKey)  // Opera assigns values for control keys.
    return;
   else 
    event.preventDefault();
  
);

【讨论】:

【参考方案14】:
   window.jQuery.fn.ForceNumericOnly =
       function () 

           return this.each(function () 
               $(this).keydown(function (event) 
                   // Allow: backspace, delete, tab, escape, and enter
                   if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
                       // Allow: Ctrl+A
                       (event.keyCode == 65 && event.ctrlKey === true) ||
                       // Allow: home, end, left, right
                       (event.keyCode >= 35 && event.keyCode <= 39)) 
                       // let it happen, don't do anything
                       return;
                    else 
                       // Ensure that it is a number and stop the keypress
                       if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) 
                           event.preventDefault();
                       
                   
               );
           );
       ;

并将其应用于您想要的所有输入:

$('selector').ForceNumericOnly();

【讨论】:

【参考方案15】:

这个函数做同样的事情,使用了上面的一些想法。

$field.keyup(function()
    var val = $j(this).val();
    if(isNaN(val))
         val = val.replace(/[^0-9\.]/g,'');
         if(val.split('.').length>2) val =val.replace(/\.+$/,"");
    
    $j(this).val(val); 
);
显示视觉反馈(不正确的字母在消失之前出现) 允许小数 捕获多个“.” 左/右 del 等没有问题。

【讨论】:

【参考方案16】:

根据 CanIUse 截至 2015 年 10 月,HTML5 支持输入类型编号,全球浏览器支持率 88% 以上。

<input type="number" step="0.01" min="0" name="askedPrice" id="askedPrice" />

这不是 JQuery 相关的解决方案,但优点是在手机上 android 键盘将针对输入数字进行优化。

或者,可以使用带有新参数“pattern”的输入类型文本。 HTML5 规范中的更多细节。

我认为它比 jquery 解决方案更好,因为在这个问题中提供的 jquery 解决方案不支持千位​​分隔符。如果你可以使用html5。

JSFiddle: https://jsfiddle.net/p1ue8qxj/

【讨论】:

【参考方案17】:

/* 这是我的跨浏览器版本 How to allow only numeric (0-9) in HTML inputbox using jQuery? */

$("#inputPrice").keydown(function(e)
    var keyPressed;
    if (!e) var e = window.event;
    if (e.keyCode) keyPressed = e.keyCode;
    else if (e.which) keyPressed = e.which;
    var hasDecimalPoint = (($(this).val().split('.').length-1)>0);
    if ( keyPressed == 46 || keyPressed == 8 ||((keyPressed == 190||keyPressed == 110)&&(!hasDecimalPoint && !e.shiftKey)) || keyPressed == 9 || keyPressed == 27 || keyPressed == 13 ||
             // Allow: Ctrl+A
            (keyPressed == 65 && e.ctrlKey === true) ||
             // Allow: home, end, left, right
            (keyPressed >= 35 && keyPressed <= 39)) 
                 // let it happen, don't do anything
                 return;
        
        else 
            // Ensure that it is a number and stop the keypress
            if (e.shiftKey || (keyPressed < 48 || keyPressed > 57) && (keyPressed < 96 || keyPressed > 105 )) 
                e.preventDefault();
            
        

  );

【讨论】:

【参考方案18】:

只需通过 parseFloat() 运行内容。它会在输入无效时返回NaN

【讨论】:

【参考方案19】:

您可以使用 autoNumeric from decorplanit.com 。它们对数字以及货币、四舍五入等都有很好的支持。

我在 IE6 环境中使用过,只对 css 进行了一些调整,并且相当成功。

例如,可以定义一个 css 类 numericInput,它可以用来用数字输入掩码装饰您的字段。

改编自 autoNumeric 网站:

$('input.numericInput').autoNumeric(aSep: '.', aDec: ','); // very flexible!

【讨论】:

autoNumeric 绝对是正确的选择【参考方案20】:

如果您使用的是 HTML5,则无需费力地执行验证。只需使用 -

<input type="number" step="any" />

step属性允许小数点有效。

【讨论】:

不是这样,Firefox 和 Opera 允许非数字文本输入 @MichaelDeMutis 你说得对,它允许非数字文本输入,但在 FF 中验证失败(我还没有机会在 Opera 中进行测试)。【参考方案21】:

我认为这是解决这个问题的好方法,而且非常简单:

$(function() 
    var pastValue, pastSelectionStart, pastSelectionEnd;

    $("input").on("keydown", function() 
        pastValue          = this.value;
        pastSelectionStart = this.selectionStart;
        pastSelectionEnd   = this.selectionEnd;
    ).on("input propertychange", function() 
        var regex = /^[0-9]+\.?[0-9]*$/;

        if (this.value.length > 0 && !regex.test(this.value)) 
            this.value          = pastValue;
            this.selectionStart = pastSelectionStart;
            this.selectionEnd   = pastSelectionEnd;
        
    );
);

例子: JSFiddle

涵盖的场景

这里的大多数类似建议至少有一个失败,或者需要大量代码才能涵盖所有这些场景。

    只允许 1 个小数点。 允许homeendarrow 键。 允许在任何索引处使用 deletebackspace。 允许在任何索引处进行编辑(只要输入与正则表达式匹配)。 允许 ctrl+v 和 shift+insert 进行有效输入(与右键单击 + 粘贴相同)。 不闪烁文本值,因为未使用keyup 事件。 在输入无效后恢复选择。

场景失败

0.5 开头并仅删除零将不起作用。这可以通过将正则表达式更改为/^[0-9]*\.?[0-9]*$/ 来解决,然后添加一个模糊事件以在文本框以小数点开头时添加0(如果需要)。请参阅此advanced scenario,以更好地了解如何解决此问题。

插件

我创建了这个简单的jquery plugin 来简化此操作:

$("input").limitRegex(/^[0-9]+\.?[0-9]*$/);

【讨论】:

【参考方案22】:

最好的方法是在失去焦点时检查文本框的内容。

您可以使用正则表达式检查内容是否为“数字”。

或者您可以使用验证插件,它基本上会自动执行此操作。

【讨论】:

正则表达式为 /^\d*\。0,1\d+$/【参考方案23】:

检查此查找代码以供数据库使用:

function numonly(root)
    >>var reet = root.value;
    var arr1 = reet.length;
    var ruut = reet.charAt(arr1-1);
    >>>if (reet.length > 0)
        var regex = /[0-9]|\./;
        if (!ruut.match(regex))
            var reet = reet.slice(0, -1);
            $(root).val(reet);
        >>>>
    

//Then use the even handler onkeyup='numonly(this)'

【讨论】:

【参考方案24】:

这是我刚刚完成的 sn-p(使用 Peter Mortensen / Keith Bentrup 的部分代码)对文本字段进行整数百分比验证(需要 jQuery):

/* This validates that the value of the text box corresponds
 * to a percentage expressed as an integer between 1 and 100,
 * otherwise adjust the text box value for this condition is met. */
$("[id*='percent_textfield']").keyup(function(e)
    if (!isNaN(parseInt(this.value,10))) 
        this.value = parseInt(this.value);
     else 
        this.value = 0;
    
    this.value = this.value.replace(/[^0-9]/g, '');
    if (parseInt(this.value,10) > 100) 
        this.value = 100;
        return;
    
);

这段代码:

允许使用主数字键和数字小键盘。 验证排除 Shift 数字字符(例如 #、$、% 等) 将 NaN 值替换为 0 用大于 100 的 100 个值替换

希望对有需要的人有所帮助。

【讨论】:

【参考方案25】:

在这里找到了一个很好的解决方案http://ajax911.com/numbers-numeric-field-jquery/

我只是根据我的要求将“keyup”更改为“keydown”

【讨论】:

【参考方案26】:

在输入中保持插入符号位置的其他方式:

$(document).ready(function() 
  $('.numbersOnly').on('input', function() 
    var position = this.selectionStart - 1;

    fixed = this.value.replace(/[^0-9\.]/g, '');  //remove all but number and .
    if(fixed.charAt(0) === '.')                  //can't start with .
      fixed = fixed.slice(1);

    var pos = fixed.indexOf(".") + 1;
    if(pos >= 0)
      fixed = fixed.substr(0,pos) + fixed.slice(pos).replace('.', '');  //avoid more than one .

    if (this.value !== fixed) 
      this.value = fixed;
      this.selectionStart = position;
      this.selectionEnd = position;
    
  );
);

优点:

    用户可以使用箭头键、Backspace、Delete、... 在您想粘贴数字时使用

Plunker:Demo working

【讨论】:

【参考方案27】:

我刚刚发现了一个更好的插件。 给你更多的控制权。 假设您有一个 DOB 字段,您需要它是数字但也接受“/”或“-”字符。

效果很好!

查看http://itgroup.com.ph/alphanumeric/。

【讨论】:

【参考方案28】:
    $(".numeric").keypress(function(event) 
  // Backspace, tab, enter, end, home, left, right
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      isControlKey)  // Opera assigns values for control keys.
    return;
   else 
    event.preventDefault();
  
);

这段代码对我来说效果很好,我只需要在 controlKeys 数组中添加 46 来使用句点,尽管我认为这不是最好的方法;)

【讨论】:

【参考方案29】:

我用了这个,效果很好..

ini=$("#id").val();
a=0;
$("#id").keyup(function(e)
    var charcode = (e.which) ? e.which : e.keyCode;
    // for decimal point
    if(!(charcode===190 || charcode===110))
               // for numeric keys andcontrol keys
        if (!((charcode>=33 && charcode<=57) || 
        // for numpad numeric keys
        (charcode>=96 && charcode<=105) 
        // for backspace
        || charcode==8)) 
        
            alert("Sorry! Only numeric values allowed.");
            $("#id").val(ini);
        
        // to include decimal point if first one has been deleted.
        if(charcode===8)
        
            ini=ini.split("").reverse();
            if(ini[0]==".")
            a=0;                 
        
    
    else
    
        if(a==1)
        
            alert("Sorry! Second decimal point not allowed.");
            $("#id").val(ini);
        
        a=1;
    
    ini=$("#id").val();
);


find keycodes at http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes

【讨论】:

【参考方案30】:

这很简单,我们已经有一个javascript内置函数“isNaN”。

$("#numeric").keydown(function(e)
  if (isNaN(String.fromCharCode(e.which))) 
    return false; 
  
);

【讨论】:

以上是关于jQuery:限制文本框仅输入“数字”的最佳方法是啥? (允许小数点)的主要内容,如果未能解决你的问题,请参考以下文章

html 限制文本框的“数字”输入的最佳方法是什么?

使用 jquery 验证器验证具有相同名称的多个文本框仅验证第一个输入

JQuery限制文本框只能输入数字和小数点的方法

前端jquery怎么限制文本框输入数字的大小

用Jquery控制文本框只能输入数字和字母

csharp 文本框仅限数字