javascript限制文本框只允许输入数字(曾经与现在的方法对比)


Posted in Javascript onJanuary 18, 2013

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

曾经使用过的方法

通过onkeydown事件来控制只允许数字:

<input onkeydown="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控制小数输入的长度
最终全部代码实现如下:

function validateDigitsOnly(evt) { 
var e = evt || window.event, 
key = e.keyCode || e.which; 
if ( 
// Backspace, Tab, Enter, Esc, Delete 
key == 8 || key == 9 || key == 13 || key == 27 || key == 46 || 
// Ctrl + A 
(key == 65 && event.ctrlKey === true) || 
// Home, End, 四个方向键 
key >= 35 && key <= 40) { 
return; 
} 
if (e.shiftKey || e.altKey || e.ctrlKey) { 
return false; 
} 
var el = e.target || e.srcElement, 
// 最大数字长度 
nl = el.getAttribute("data-numbers") || 15, 
// 最大小数长度 
dl = el.getAttribute("data-decimals") || 2, 
val = el.value, 
// "." 位置 
dotIndex = val.indexOf("."), 
rng = caret.call(el), 
// 光标在"."左边 
rLeft = rng.end <= dotIndex, 
// 光标在"."右边 
rRight = rng.begin > dotIndex; 
if ( 
// 数字 
key >= 48 && key <= 57 || 
// 数字键盘输入的数字 
key >= 96 && key <= 105) { 
if (validateValue(dotIndex, val, rLeft, rRight, nl, dl)) 
return; 
// 选中部分文本再做一次处理 
val = val.substring(0, rng.begin) + val.substring(rng.end); 
dotIndex = val.indexOf("."); 
if (validateValue(dotIndex, val, rLeft, rRight, nl, dl)) 
return; 
} 
else if ( 
// ".", "," 
(key == 190 /*|| key == 188*/ || 
// 数字键盘上的 ".", "," 
key == 110/*|| key == 109*/) && 
// 允许输入小数 
dl > 0) { 
if ( 
// 未输入".", 且输入的位置后面的小数位数未达到上限 
dotIndex == -1 && (rng.end == val.length || val.substring(rng.end).length <= dl) || 
// 输过".", 且选中部分文本包含"." 
dotIndex > -1 && rng.begin <= dotIndex && dotIndex < rng.end) 
return; 
} 
return false; 
} 
// 验证输入的值 
function validateValue(dotIndex, val, rLeft, rRight, nl, dl) { 
if ( 
// 未输入过"." 
dotIndex == -1 && val.length < nl || 
// 光标位置在"."之前 
rLeft && val.substring(0, dotIndex).length < nl || 
// 光标在"."之后且未达到小数上限 
rRight && val.substring(dotIndex + 1).length < dl) 
return true; 
return false; 
} 
// 获取光标位置 
function caret() { 
var begin, end; 
if (this.setSelectionRange) { 
begin = this.selectionStart; 
end = this.selectionEnd; 
} else if (document.selection && document.selection.createRange) { 
var range = document.selection.createRange(); 
begin = 0 - range.duplicate().moveStart('character', -100000); 
end = begin + range.text.length; 
} 
return { begin: begin, end: end }; 
}

使用方法
具体使用方法如下:
<input type="text" id="t1" /> 
<input type="text" id="t2" data-numbers="5" data-decimals="4" /> 
<script> 
document.getElementById("t1").onkeydown = validateDigitsOnly; 
document.getElementById("t2").onkeydown = validateDigitsOnly; 
</script>

或者干脆写在html里:
<input type="text" id="lwme_text_3" onkeydown="return validateDigitsOnly(event)" />

如果引入jQuery的话使用起来就更加简单了:
<input type="text" class="digitsOnly" />

$(".digitsOnly").keydown(validateDigitsOnly);

结尾
这个方法虽然有些地方效率还不够高,而且某些键盘key的还未处理,也不排除某些情况下可能失效,但是对于大多数情况下使用已经足够了。
大家若有额外需要请自行修改,当然有更好的办法也请分享(*^__^*)
over
PS:01.18更新了一些keyCode的判断,以及错把110写成109≡(???)≡
另外需要注意:对于使用右键菜单或者是菜单栏粘贴进来的需要额外处理
还有一种极端的情况:在网页中选中文字并拖动到文本框内,或者是在文本框中选中文字并拖动,这都需要做额外处理
对于以上两种需要额外处理的情况,比较便捷的方法是加一个验证,比如jQuery.validate之类的表单验证,否则处理起来比较麻烦
再PS:在win8下,切换到微软拼音可能会造成无法输入,不知道其他系统或者其他输入法有没有这个问题( *_*) (`~~`) ====
Javascript 相关文章推荐
Exitjs获取DataView中图片文件名
Nov 26 Javascript
基于JavaScript实现 获取鼠标点击位置坐标的方法
Apr 12 Javascript
js获取对象为null的解决方法
Nov 21 Javascript
javascript比较两个日期的先后示例代码
Dec 31 Javascript
基于js实现投票的实例代码
Aug 04 Javascript
jQuery通过ajax快速批量提交表单数据
Oct 25 Javascript
JS DOMReady事件的六种实现方法总结
Nov 23 Javascript
Javascript实现找不同色块的游戏
Jul 17 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
Sep 19 Javascript
基于ajax及jQuery实现局部刷新过程解析
Sep 12 jQuery
vue 弹出遮罩层样式实例
Jul 22 Javascript
vue如何使用外部特殊字体的操作
Jul 30 Javascript
js replace正则表达式应用案例讲解
Jan 17 #Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
Jan 17 #Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
Jan 17 #Javascript
Javascript模块化编程(一)模块的写法最佳实践
Jan 17 #Javascript
Javascript异步编程的4种方法让你写出更出色的程序
Jan 17 #Javascript
jQuery链式操作如何实现以及为什么要用链式操作
Jan 17 #Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
Jan 17 #Javascript
You might like
浅谈PHP变量作用域以及地址引用问题
2013/12/27 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
thinkPHP中create方法与令牌验证实例浅析
2015/12/08 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
srcElement表格样式
2006/09/03 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
更优雅的事件触发兼容
2011/10/24 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
javascript学习笔记(七) js函数介绍
2012/06/19 Javascript
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
bootstrap3 兼容IE8浏览器!
2016/05/02 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
修改Nodejs内置的npm默认配置路径方法
2018/05/13 NodeJs
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
详解Python中的静态方法与类成员方法
2017/02/28 Python
Python语言描述最大连续子序列和
2017/12/05 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
解决pip install psycopg2出错问题
2020/07/09 Python
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
2014年端午节活动方案
2014/03/11 职场文书
黄金搭档广告词
2014/03/21 职场文书
医学检验专业自荐信
2014/09/18 职场文书
大学生村官入党自传
2015/06/26 职场文书
消夏晚会主持词
2015/06/30 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
职工培训工作总结
2015/08/10 职场文书
使用Pytorch训练two-head网络的操作
2021/05/28 Python