【问题标题】: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://stackoverflow.com/a/20186188/66767

【问题讨论】:

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

标签: jquery validation isnumeric


【解决方案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 触发“字符" 键(因此 触发箭头和删除键)。请参阅此答案以供参考:stackoverflow.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,这个答案对我很有用。
    • 这是一个糟糕的解决方案,因为它没有考虑退格键、箭头、控制键和其他必要的击键。
    • 我刚刚发布了一个与此类似的解决方案,但也可以处理退格、箭头并且不使用硬编码的键码。在这里查看:stackoverflow.com/a/23468513/838608
    【解决方案10】:

    作为to this suggestion 的一个小改进,您可以使用Validation plugin 及其number()digitsrange 方法。例如,以下内容可确保您获得 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. 只允许 1 个小数点。
                    2. 允许homeendarrow 键。
                    3. 允许在任何索引处使用 deletebackspace
                    4. 允许在任何索引处进行编辑(只要输入与正则表达式匹配)。
                    5. 允许 ctrl+v 和 shift+insert 进行有效输入(与右键单击 + 粘贴相同)。
                    6. 不闪烁文本值,因为未使用keyup 事件。
                    7. 在输入无效后恢复选择。

                    场景失败

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

                            优点:

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

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

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2010-09-21
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多