很多时候需要用到限制文本框的数字输入,试过许多方法,都不太理想,遂决定自己实现一个来玩玩。
曾经使用过的方法
通过onkeydown事件来控制只允许数字:
  1. <input onkeydown="return event.keyCode>=48&&event.keyCode<=57||event.keyCode>=96&&event.keyCode<=105" />

onkeydown事件控制起来相对比较麻烦,上面的简化版很多键都没有涉及到,操作体验比较糟糕。
jQuery的两个插件使用起来还是比较灵活的,能够满足大部分需要,但是在控制输入长度上限制的很不灵活(或许是我没有发现灵活的使用方式?)
具体实现方法
使用maskedInput里的一部分方法来提取光标位置

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. }
  13. if (e.shiftKey || e.altKey || e.ctrlKey) {
  14. return false;
  15. }
  16. var el = e.target || e.srcElement,
  17. // 最大数字长度
  18. nl = el.getAttribute("data-numbers") || 15,
  19. // 最大小数长度
  20. dl = el.getAttribute("data-decimals") || 2,
  21. val = el.value,
  22. // "." 位置
  23. dotIndex = val.indexOf("."),
  24. rng = caret.call(el),
  25. // 光标在"."左边
  26. rLeft = rng.end <= dotIndex,
  27. // 光标在"."右边
  28. rRight = rng.begin > dotIndex;
  29. if (
  30. // 数字
  31. key >= 48 && key <= 57 ||
  32. // 数字键盘输入的数字
  33. key >= 96 && key <= 105) {
  34. if (validateValue(dotIndex, val, rLeft, rRight, nl, dl))
  35. return;
  36. // 选中部分文本再做一次处理
  37. val = val.substring(0, rng.begin) + val.substring(rng.end);
  38. dotIndex = val.indexOf(".");
  39. if (validateValue(dotIndex, val, rLeft, rRight, nl, dl))
  40. return;
  41. }
  42. else if (
  43. // ".", ","
  44. (key == 190 /*|| key == 188*/ ||
  45. // 数字键盘上的 ".", ","
  46. key == 110/*|| key == 109*/) &&
  47. // 允许输入小数
  48. dl > 0) {
  49. if (
  50. // 未输入".", 且输入的位置后面的小数位数未达到上限
  51. dotIndex == -1 && (rng.end == val.length || val.substring(rng.end).length <= dl) ||
  52. // 输过".", 且选中部分文本包含"."
  53. dotIndex > -1 && rng.begin <= dotIndex && dotIndex < rng.end)
  54. return;
  55. }
  56. return false;
  57. }
  58. // 验证输入的值
  59. function validateValue(dotIndex, val, rLeft, rRight, nl, dl) {
  60. if (
  61. // 未输入过"."
  62. dotIndex == -1 && val.length < nl ||
  63. // 光标位置在"."之前
  64. rLeft && val.substring(0, dotIndex).length < nl ||
  65. // 光标在"."之后且未达到小数上限
  66. rRight && val.substring(dotIndex + 1).length < dl)
  67. return true;
  68. return false;
  69. }
  70. // 获取光标位置
  71. function caret() {
  72. var begin, end;
  73. begin = 0 - range.duplicate().moveStart('character', -100000);
  74. end = begin + range.text.length;
  75. }
  76. return { begin: begin, end: end };
  77. }
  78. 复制代码

复制代码

使用方法
具体使用方法如下:

  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>
  7. 复制代码

复制代码

或者干脆写在html里:

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

复制代码

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

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

复制代码

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

上一篇:js实现图片放大镜预览特效
下一篇:面向对象编程的MVC模式

http://www.00h5.com/thread-2184-1-1.html

使用Javascript限制文本框只允许输入数字的更多相关文章

  1. WinForm笔记一:文本框只允许输入数字

    在WinForm的文本框中,有时候只允许数字,而不能输入除数字以外的其他字符,要调用TextBox的KeyPress事件,代码如下: //只允许输入数字 if (e.KeyChar<'0'||e ...

  2. 文本框只允许输入数字.net/javascript

    <input type="text" name="test" onKeyUp="test1.value=(this.value=this.val ...

  3. ASP.NET c# textbox 正则表达式 文本框只允许输入数字(验证控件RegularExpressionValidator )

    <input type="text" name="test" onKeyUp="test1.value=(this.value=this.val ...

  4. js限制文本框只可以输入数字

    封装了一下,要用的话直接调用下面getEvent函数即可   function getEvent() { if (document.all) { return window.event; //for ...

  5. WPF文本框只允许输入数字

    XAML代码   < TextBox Height="23" HorizontalAlignment="Left" Margin="100,5, ...

  6. html中radio单选和文本框限制只能输入数字的解决方案

    一.当html中存在多个radio单选按钮时将所有的单选按钮name属性设置为一样,就可实现每次只选中一个的效果. 二.限制文本框只能输入数字,代码如下: $(function(){ $(" ...

  7. js怎么限制文本框input只能输入数字

    1.说明 本篇文章介绍怎么使用js限制文本框只能输入数字 2.HTML代码 <!DOCTYPE html> <html xmlns="http://www.w3.org/1 ...

  8. js限制文本框input只能输入数字

    JS判断只能是数字和小数点. ,文本框只能输入数字代码(小数点也不能输入) 复制代码 代码示例:<input onkeyup="this.value=this.value.replac ...

  9. Delphi中限制文本框(TEdit)只能输入数字

    procedure Tform1.Edit1KeyPress(Sender: TObject; var Key: Char);var edt: TEdit; str, strL, strR: stri ...

随机推荐

  1. Fiddle的应用

    在Composer中输入测试的网址: 可能会发生一下情况,这意味着需要在左侧面板中选择一项,来看回应:   选择一个请求后,选择TextView,看原生的回应(Response)内容

  2. OC-深浅复制

    [OC学习-26]对象的浅拷贝和深拷贝——关键在于属性是否可被拷贝 对象的拷贝分为浅拷贝和深拷贝, 浅拷贝就是只拷贝对象,但是属性不拷贝,拷贝出来的对象和原来的对象共用属性,即指向同一个属性地址. 深 ...

  3. 搭建一个 简易的php版 todolist

    我记得以前使用 wunderlist 但是国外..后来用了半年. 挺方便的.但是.后来慢慢忘了这工具存在 缺少了todolist.效率折半.. so.我搭建了个简单的todolist.  :mytin ...

  4. hibernate spring sturts2配置

    <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hi ...

  5. 【深入浅出jQuery】源码浅析2--使用技巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  6. cf D George and Interesting Graph

    题意:给你一个有趣图的定义:在这个图中有一个根,根与每个点都有边和回边,除了根之外,其他的点的出度和入度都为2,然后给你一个图让你经过几步操作可以使此图变为有趣图,操作为:删边或者加边. 思路:枚举根 ...

  7. 一个Java对象到底占多大内存

    最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...

  8. c语言小练习(蛮好玩的)

    1.求三个数的平均数,要求保留三位小数位 #include <conio.h> #include<stdio.h> int main(){ int a,b,c; float a ...

  9. 数据结构(线段树):BZOJ 1103 [POI2007]大都市meg

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1791  Solved: 925[Submit][Stat ...

  10. 数据结构(跳跃表):NOI 2004 郁闷的出纳员

    郁闷的出纳员 [问题描述] OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常, ...