很多时候需要用到限制文本框的数字输入,试过许多方法,都不太理想,遂决定自己实现一个来玩玩。
曾经使用过的方法
通过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. Vim及VimScript资料总结《转载》

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   Vim教程 入门 Vim 实用技术 Learning the vi and Vim Editors A Byte of ...

  2. java项目导出jar文件时指定main方法的类

    需要先运行一下main函数,eclipse的Export-->Runnable JAR File ---> 下的Launch configuration下拉列表才会有记录.如果想要删除下拉 ...

  3. iscc2016-basic-find-to-me

    额 第一题就暴力搜索了 已知仿射加密变换为c=(11m+8)mod26,试对密文sjoyuxzr解密 #include <stdio.h> int main(void) { int m,c ...

  4. js实现

    1,核心 ECMAScript 2,文档对象模型DOM 3,浏览器对象模型BOM

  5. 误差逆传播(error BackPropagation, BP)算法推导及向量化表示

    1.前言 看完讲卷积神经网络基础讲得非常好的cs231后总感觉不过瘾,主要原因在于虽然知道了卷积神经网络的计算过程和基本结构,但还是无法透彻理解卷积神经网络的学习过程.于是找来了进阶的教材Notes ...

  6. 用C++进行函数式编程

    http://www.programmer.com.cn/12717/   文 / John Carmack 译 / 王江平 <Quake>作者Carmack认为追求函数式的程序设计有着实 ...

  7. CN消息的来源——父窗口不知道怎么处理,于是把这个消息加上CN_BASE在分发到实际的子窗体

    VCL存在一些非API消息以供其内部使用,为什么要这样做呢?这要从WM_COMMAND & WM_NOTIFY消息说起,我们说WM_COMMAND消息并不是直接发给实际产生消息的窗体,而是发送 ...

  8. insert 加的锁

    ?INSERT sets an exclusive lock on the inserted row. This lock is an index-record lock, not a next-ke ...

  9. LVM 命令集总结

    PV 命令 下面的命令是在与物理卷相关的操作中最常用的命令: lsdev 列出ODM中的设备. chdev 修改设备的特征. mkdev 增加一个设备到系统中. chpv 修改物理卷的状态. lspv ...

  10. IMAP与POP3的区别

    POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件.标记已读等),不会反馈到服务器上.比如通过客户端收取了邮箱中的2封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有 ...