很多时候需要用到限制文本框的数字输入,试过许多方法,都不太理想,遂决定自己实现一个来玩玩。
曾经使用过的方法 通过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下,切换到微软拼音可能会造成无法输入,不知道其他系统或者其他输入法有没有这个问题( *_*) (`~~`) ====
相关推荐:
ChatGPT页面打不开怎么办?这些解决方法让你轻松访问AI助手!,分散ai
“新热度”:引领潮流的力量,如何趋势的脉搏,浙江通用网站建设特点
seo用什么写属性写,seo属于什么 ,芭田科学施肥AI
SEO策划:让你的网站迅速脱颖而出的秘诀,seo优化和技巧
为什么说seo重要,为什么说seo重要一点 ,中通智能ai是什么意思
AI免费生成文字,打造创作新时代
ChatGPT宕机恢复时间如何解决用户焦虑与技术背后的故事,ai人工智能写作火山
ChatGPT无法加载?检查您的网络设置并尝试重启ChatGPT,助您畅享无障碍智能对话体验,ai记录人
未来智能:AI智能人工软件引领数字化变革
pbootcms自动翻译插件,让你的网站轻松实现多语言覆盖,ai 镀金
seo深度优化插件是什么,深度优化手机软件 ,ai的缩写
SEO应该如何提升网站流量与排名?揭秘成功的SEO策略,肺炎疫苗推广营销
在线AI文章:为您打造全新内容创作体验
seo诊断什么意思,seo诊断a5 ,约瑟夫ai
SEO动态:2025年SEO趋势与优化技巧解析,十堰外贸网站推广费用
SEO与网络推广机构:如何选择最适合你的数字营销合作伙伴,ai写作软件性价比高吗
AI人工智能文章生成平台,释放创作无限可能
ChatGDP人工智能:未来科技赋能企业与个人的智能变革,如何用AI绘制人体
ChatGPT怎么有梯子?突破网络限制,轻松畅享AI智能,ai对唱音响
SEO总计:如何通过SEO优化实现网站流量和排名的飞跃,三元桥网站优化
整理文章的AI:提升写作效率的智能助手
SEO利用:让你的网站快速登顶,获取更多流量与客户!,延边小程序推广平台网站
ChatGPTApp怎么调大字体?提升阅读体验,让文字更清晰,推荐ai音频
SEO新人必读:从零开始SEO的核心技巧与实践指南,网站邮件推广设计
SEO代做:让你的企业轻松登顶搜索引擎,快速提升曝光率,seo 提高注册量
seo用什么法宝,列出5种seo赚钱方式 ,ai怎么更改文档样式
ChatGPT安装包Windows版:让AI助力你的工作与生活,人工智能ai不是梦在线
AI一键生成原创文章,让创作更高效更轻松!
文章生成AI:让写作轻松高效的神奇工具
ChatGPT登录界面都不显示了?可能是这些原因导致的!,上海小学ai智能课
用AI创作的文章算原创吗?深度背后的逻辑与意义
AI代谢文章:从灵感到成果的创作革命
什么叫改写-解读“改写”背后的艺术与技巧,网站制作建设模板图片
主题导航-引领互联网世界的智慧之路,大渡口网站建设方案
ChatGPT页面无法下拉?禁用浏览器扩展,轻松解决!,imba 1.6 ai
SEO就业前景如何?打造数字时代的职业新风口,常州武进区水产网站建设
ChatGPT的诞生,预示着人工智能大规模应用的时代已经来临,ai此生不渝
为什么seo吸引人,为什么seo吸引人呢 ,ai路径查找器绘制树
AI网站开发与代码创新:引领未来数字化变革的关键,ai ay规则
SEO软优化:助力网站实现流量爆发的秘密武器,延平区网页seo
怎么查一篇文章是不是AI写的?你需要这几个关键方法!
AI撰写工具的无限可能,让内容创作更高效、更精彩!
SEO排序:如何让你的网页在搜索引擎中脱颖而出,平谷抖音seo推广招聘
SEO好吗?助力网站成功的关键之道,网站优化方案范文怎么写
用AI写文章会不会查重率高?破解写作困扰的真相
Bing无法使用怎么办?解决方法及替代方案推荐!,ai文字设计教程
seo运营经理是什么,seo和运营的区别 ,皖妍ai宁慕晴o
软件AI的全称:人工智能驱动未来的关键力量
SEO职责:为网站注入流量,提升品牌竞争力,拼多多女装关键词排名
SEO联系:如何通过SEO优化提升您的网络营销效果,企业营销推广获客