JS中同步显示并分割输入的数字字符串
题目比较晦涩,来张图来说明要表达的效果:
第一张图的效果就是,用户输入一个数字,上面就显示一个大层,然后显示输入的数字,并把数字用空格按照每四位分割出来。好像在建行的网上银行上面就有这种效果。第二个图的效果就是用户在一个文本框中输入一串数字,然后再光标离开的时候,把数字按照每三位用逗号给分割开来,类似于老外的金钱输入效果。
效果一 同步显示分割分割输入
这种效果中,仿造的就是输入银行卡子类的,故只能够输入数字,需要禁用用户输入的其它字符下面是几种实现方式。先贴上HTML和CSS代码:
<html>
<head>
<style type="text/css">
#gaoLiang{
width:400px;
height:50px;
font-family:Candara;
color:red;
font-size:20px;
text-align:center;
line-height:50px;
display:none;/*这个层模式是隐藏的*/
border:1px solid red;
}
</style>
</head> <body>
<div id="gaoLiang"></div>
卡号:<input type="text" id="kaHao" />
</body>
</html>
实现方式一:只是利用键盘的 onkeydown 事件
这个事件是在用户按下键盘后触发,也就是说,此时界面上是没有用户输入的数据的,但是可以通过event事件对象来获得用户输入的数据。要解决的问题就是手动的将用户输入的数据给拼接显示到界面上去,还有就是要考虑到用户选择删除的时候是通过退格键删除还是用鼠标选中以后删除。JS代码如下:
document.getElementById('kaHao').onkeydown = kaHao;//注册事件方法 function kaHao(evt){
var e = evt || window.event;
//如果用户输入的非数字或者退格键就阻止输入
if((e.keyCode < 48 || e.keyCode>57) && e.keyCode != 8){
return false;
};
//拿到当前文本框中已经存在的值
var value = this.value;
//判断输入的是否是退格键
if(e.keyCode == 8){
//如果是退格键就删除选中的文本或者最后一个。因为在Keydown事件中,是先执行代码后改变界面的值
var s="";
//拿到用户选择的要删除的文本
if(typeof this.selectionStart == 'number'){
s = this.value.substring(this.selectionStart,this.selectionEnd);
}else if( document.selection.createRange ){//IE8 及以下
s = document.selection.createRange().text;
};
//如果没有选择长度就为0,那么就删除最后一个
if(s.length == 0){
s = value.charAt(value.length-1)
};
//执行删除数据
value = value.replace(s,'');
}else{
//如果不是删除键就把当前的字符个拼接上去,由于JS中加号运算优先考虑数字,所有toString()
//IE6~8不支持e.key的写法
//value = this.value.toString() + e.key;
value = this.value.toString() + String.fromCharCode(e.keyCode);
}; var line;//用来存放正则匹配的数字字符串
var strs=[];//存放已经提前的字符串
var reg = /(\d{1,4})/g;//正则。使用的是exec来匹配,可以使用replace更简单,在下一种方式中使用
while((line = reg.exec(value))){
strs.push(line[0]);
};
//按照正则,四个数为一组进行分割,由于匹配失败,返回一个null,直接导致后面的join报错,故不使用它
//strs = value.match(reg);
//在按照空格进行拼接
value = strs.join(' ');
//拿到层进行设置以及显示
var gao = document.getElementById('gaoLiang');
gao.innerHTML = value;//innerHTML基本上不存在浏览器兼容性问题,故用它
gao.style.display = 'block';
};
onkeydown 方式实现
这种方式在实现上麻烦的就是在用户删除数据的时候,要进行判断,而且还存在浏览器兼容性问题。还有就是需要拼接用户输入的数据,但是它的同步性很好
实现方式二:只是利用键盘的 onkeyup 事件
在keyup事件中,相比就比较简单,引用当这个事件触发的时候,用户输入的值已经在界面上了,我们可以直接获取到。而且如果用户是删除,也不需要关系是通过鼠标选中删除还是直接按退格键删除,因为在删除键抬起的时候,界面上的数据已经删除了。代码如下:
document.getElementById('kaHao').onkeyup = kaHaoTwo;//注册事件方法 function kaHaoTwo(evt){
var e = evt || window.event; //用正则去替换掉用户输入的非数字字符
this.value = this.value.replace(/[^\d]*/g,''); //用正则去替换,(?=\d) 就是要求,如果要匹配成功,那么前面匹配的四位数字后面还必须再有以为数字。可以将后面替换的空格换成逗号或者其它字符就能够看出正则中有和没有这个匹配要求的区别
value = this.value.replace(/(\d{4})(?=\d)/g,'$1 ') var gao = document.getElementById('gaoLiang');
gao.innerHTML = value;
gao.style.display = 'block';
};
onkeyup 方式实现
这种方式的实现中,有一个不好的就是,当用户输入非数字的时候,用正则去替换掉,因为输入的字符已经在界面上了,突然没有了,体验下不好。
实习方式三:综合上面两种方式
结合上面两种方式的优点,可以再keydown下面判断用户的非法输入,在keyup里面对数据进行替换,代码如下:
document.getElementById('kaHao').onkeydown = kaHaoThreeDown;
document.getElementById('kaHao').onkeyup = kaHaoThreeUp; function kaHaoThreeDown(evt){
var e= evt || window.event;
if((e.keyCode > 57 || e.keyCode<48) && e.keyCode!=8){
return false;
};
}; function kaHaoThreeUp(){
var gao = document.getElementById('gaoLiang');
gao.innerHTML = this.value.replace(/(\d{4})(?=\d)/g,'$1 ');
gao.style.display = 'block';
};
效果二 在用户输入完成后将数字按照从右到左分割
用户输入完成,就代表的是失去了焦点,可以注册一个onblur事件来完成。由于采用的是正则,而正则默认的是从左向右匹配(也许可以是从右向左匹配,不过我不清楚),题目的要求是从右向左分割,所有代码中先对字符串进行了一个反转处理,分割成功后在进行一个翻转就OK了。JS中的代码如下:
docuemnt.getElementById('nums').onblur = splitNum; function splitNum(evt){
var value = this.value;
//先替换到所有的除了小数点以外的非数值数值
value = value.replace(/[^(\d.)]*/g,'');
//字符串没有反转方法,故需要先转成数组
value = value.split('').reverse().join('');
//可以尝试不加正则后面的(?=\d),在输入的数字刚好是3的整数倍时就会出现问题
value = value.replace(/(\d{3})(?=\d)/g,'$1,');
this.value = value.split('').reverse().join('');
};
JS中同步显示并分割输入的数字字符串的更多相关文章
- JS中同步和异步
首先,我们要知道,JavaScript的本质是一门浏览器脚本语言,在执行的时候是一行一行的执行,只有前面的代码执行完了才会执行后面的代码.JS是单线程语言指的就是这个意思. 同步和异步其实在进行任务执 ...
- angular.js 中同步视图和模型数据双向绑定,$watch $digest $apply 机制
Angular.js 中的特性,双向绑定. 让视图的改变直接反应到数据中,数据的改变又实时的通知到视图,如何做到的? 这要归功于 scope 下面3个重要的方法: $watch $digest $ap ...
- 在HTML中限制input 输入框只能输入纯数字
限制 input 输入框只能输入纯数字 onkeyup = "value=value.replace(/[^\d]/g,'')" 使用 onkeyup 事件,有 bug ,那就是在 ...
- JS中同步与异步的理解
你应该知道,javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条流水线,仅仅是一条流 ...
- Three.js中如何显示帧速【转】
https://blog.csdn.net/hannahlwh1988/article/details/36876295 Step1:src中添加: <script src="js/s ...
- js中同步与异步处理方法
在使用异步请求时,有时需要将异步请求的结果返回给另一个js函数,此种情况下会出现未等异步请求返回请求结果,该发送请求所在js函数已经执行完后续操作,即已经执行return ,这样会导致return的结 ...
- js中同步与异步请求方式
异步请求方式: $.ajax({ url : 'your url', data:{name:value}, cache : false, async : true, type : "POST ...
- JS中同步与异步
不讲过多定义,举两个例子说明下 例一: console.log(100); setTimeout(function(){ console.log(200); },1000); console.log( ...
- js中div显示和隐藏钮为什么页面总是跳一下到最上面
<div class="menu_left"> <ul > <li id="t1" style="background- ...
随机推荐
- 数据库MySQL 之 索引原理与慢查询优化
数据库MySQL 之 索引原理与慢查询优化 浏览目录 索引介绍方法类型 聚合索引辅助索引 测试索引 正确使用索引 组合索引 注意事项 查询计划 慢查询日志 大数据量分页优化 一.索引介绍方法类型 1. ...
- Clover相关知识
-f 重建驱动缓存 darkwake=4 有深度睡眠有关的设置,不懂 kext-dev-mode=1 启用第三方驱动,比较重要. dart=0 修复因开启 VT-d 导致系统启动时SMC五国错误,系统 ...
- ueditor编辑器视频上传不能预览的问题
ps:来源 https://blog.csdn.net/eadela/article/details/76264168 修改ueditor.all.js文件 ueditor.all.js,17769行 ...
- Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) D. Minimum path(字典序)
https://codeforces.com/contest/1072/problem/D 题意 给你一个n*n充满小写字母的矩阵,你可以更改任意k个格子的字符,然后输出字典序最小的从[1,1]到[n ...
- MySQL/Oracle视图的创建与使用
1.什么是视图? 视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成. 2.视图的特点. 视图中的数据并不属于视图本身,而是属于基本的表,对视 ...
- gj13 asyncio并发编程
13.1 事件循环 asyncio 包含各种特定系统实现的模块化事件循环 传输和协议抽象 对TCP.UDP.SSL.子进程.延时调用以及其他的具体支持 模仿futures模块但适用于事件循环使用的Fu ...
- 如何在MYSQL下所有指定数据库名下执行SQL
mysql下用户库比较多,都有统一的命名格式,希望在这些所有用户库执行脚本,更新数据,或者查询数据 可以采用以下存储过程实现 DROP PROCEDURE IF EXISTS `sp_execalld ...
- 动态样式CSS
<link>标签可以把外部css样式引入HTML页面 <style>元素用于指定嵌入的样式 通过修改link的href属性,改变引入的css样式 function loadSt ...
- MarkDown总结
转载自:https://www.jianshu.com/p/q81RER:做了一些部分修改: 一:总纲 1.所有的格式均要空格,如#后面加个空格,-后面加空格,1.后面加空格等等: 2.双向包裹的不能 ...
- ubuntu 设置DNS
sudo vi /etc/resolv.conf #加入nameserver 114.114.114.114