使用Javascript限制文本框只允许输入数字

http://bbs.html5cn.org/thread-10944-1-1.html


很多时候需要用到限制文本框的数字输入,试过许多方法,都不太理想,遂决定自己实现一个来玩玩。

曾经使用过的方法
通过onkeydown事件来控制只允许数字:


  1. <input οnkeydοwn="return event.keyCode>=48&&event.keyCode<=57||event.keyCode>=96&&event.keyCode<=105" />
复制代码

通过jQuery插件Masked Input: http://digitalbush.com/projects/masked-input-plugin/
通过jQuery插件MeioMask: https://github.com/fabiomcosta/jquery-meiomask
onkeydown事件控制起来相对比较麻烦,上面的简化版很多键都没有涉及到,操作体验比较糟糕。
jQuery的两个插件使用起来还是比较灵活的,能够满足大部分需要,但是在控制输入长度上限制的很不灵活(或许是我没有发现灵活的使用方式?)

具体实现方法
使用maskedInput里的一部分方法来提取光标位置
使用stackoverflow上提供的通用方法来处理键盘的敲击: http://stackoverflow.com/questions/469357/html-text-input-allow-only-numeric-input
更新:参考 http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes 上列出的keycode 然后再自定义两个属性来设置输入的数字、小数长度:



  • data-numbers控制数字输入的长度
  • data-decimals控制小数输入的长度
最终全部代码实现如下:

  1. function validateDigitsOnly(evt) { 
  2. var e = evt || window.event, 
  3. key = e.keyCode || e.which; 

  4. if ( 
  5. // Backspace, Tab, Enter, Esc, Delete 
  6. key == 8 || key == 9 || key == 13 || key == 27 || key == 46 || 
  7. // Ctrl + A 
  8. (key == 65 && event.ctrlKey === true) || 
  9. // Home, End, 四个方向键 
  10. key >= 35 && key <= 40) { 
  11. return; 


  12. if (e.shiftKey || e.altKey || e.ctrlKey) { 
  13. return false; 


  14. var el = e.target || e.srcElement, 
  15. // 最大数字长度 
  16. nl = el.getAttribute("data-numbers") || 15, 
  17. // 最大小数长度 
  18. dl = el.getAttribute("data-decimals") || 2, 
  19. val = el.value, 
  20. // "." 位置 
  21. dotIndex = val.indexOf("."), 
  22. rng = caret.call(el), 
  23. // 光标在"."左边 
  24. rLeft = rng.end <= dotIndex, 
  25. // 光标在"."右边 
  26. rRight = rng.begin > dotIndex; 

  27. if ( 
  28. // 数字 
  29. key >= 48 && key <= 57 || 
  30. // 数字键盘输入的数字 
  31. key >= 96 && key <= 105) { 
  32. if (validateValue(dotIndex, val, rLeft, rRight, nl, dl)) 
  33. return; 

  34. // 选中部分文本再做一次处理 
  35. val = val.substring(0, rng.begin) + val.substring(rng.end); 
  36. dotIndex = val.indexOf("."); 
  37. if (validateValue(dotIndex, val, rLeft, rRight, nl, dl)) 
  38. return; 

  39. else if ( 
  40. // ".", "," 
  41. (key == 190 /*|| key == 188*/ || 
  42. // 数字键盘上的 ".", "," 
  43. key == 110/*|| key == 109*/) && 
  44. // 允许输入小数 
  45. dl > 0) { 
  46. if ( 
  47. // 未输入".", 且输入的位置后面的小数位数未达到上限 
  48. dotIndex == -1 && (rng.end == val.length || val.substring(rng.end).length <= dl) || 
  49. // 输过".", 且选中部分文本包含"." 
  50. dotIndex > -1 && rng.begin <= dotIndex && dotIndex < rng.end) 
  51. return; 


  52. return false; 


  53. // 验证输入的值 
  54. function validateValue(dotIndex, val, rLeft, rRight, nl, dl) { 
  55. if ( 
  56. // 未输入过"." 
  57. dotIndex == -1 && val.length < nl || 
  58. // 光标位置在"."之前 
  59. rLeft && val.substring(0, dotIndex).length < nl || 
  60. // 光标在"."之后且未达到小数上限 
  61. rRight && val.substring(dotIndex + 1).length < dl) 
  62. return true; 
  63. return false; 


  64. // 获取光标位置 
  65. function caret() { 
  66. var begin, end; 
  67. if (this.setSelectionRange) { 
  68. begin = this.selectionStart; 
  69. end = this.selectionEnd; 
  70. } else if (document.selection && document.selection.createRange) { 
  71. var range = document.selection.createRange(); 
  72. begin = 0 - range.duplicate().moveStart('character', -100000); 
  73. end = begin + range.text.length; 

  74. return { begin: begin, end: end }; 
  75. }
复制代码

使用方法

具体使用方法如下:


  1. <input type="text" id="t1" /> 
  2. <input type="text" id="t2" data-numbers="5" data-decimals="4" /> 
  3. <script> 
  4. document.getElementById("t1").onkeydown = validateDigitsOnly; 
  5. document.getElementById("t2").onkeydown = validateDigitsOnly; 
  6. </script>
复制代码

或者干脆写在html里:

  1. <input type="text" id="lwme_text_3" οnkeydοwn="return validateDigitsOnly(event)" />
复制代码

如果引入jQuery的话使用起来就更加简单了:

  1. <input type="text" class="digitsOnly" /> 
  2. ?1 $(".digitsOnly").keydown(validateDigitsOnly);
复制代码

结尾

这个方法虽然有些地方效率还不够高,而且某些键盘key的还未处理,也不排除某些情况下可能失效,但是对于大多数情况下使用已经足够了。
大家若有额外需要请自行修改,当然有更好的办法也请分享(*^__^*)
over
PS:01.18更新了一些keyCode的判断,以及错把110写成109≡(▔﹏▔)≡
另外需要注意:对于使用右键菜单或者是菜单栏粘贴进来的需要额外处理;
还有一种极端的情况:在网页中选中文字并拖动到文本框内,或者是在文本框中选中文字并拖动 ,这都需要做额外处理
对于以上两种需要额外处理的情况,比较便捷的方法是加一个验证,比如jQuery.validate之类的表单验证,否则处理起来比较麻烦

via: http://www.cnblogs.com/lwme/archive/2013/01/17/html-text-input-allow-only-numeric-input.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值