题目比较晦涩,来张图来说明要表达的效果:

第一张图的效果就是,用户输入一个数字,上面就显示一个大层,然后显示输入的数字,并把数字用空格按照每四位分割出来。好像在建行的网上银行上面就有这种效果。第二个图的效果就是用户在一个文本框中输入一串数字,然后再光标离开的时候,把数字按照每三位用逗号给分割开来,类似于老外的金钱输入效果。

效果一 同步显示分割分割输入

这种效果中,仿造的就是输入银行卡子类的,故只能够输入数字,需要禁用用户输入的其它字符下面是几种实现方式。先贴上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中同步显示并分割输入的数字字符串的更多相关文章

  1. JS中同步和异步

    首先,我们要知道,JavaScript的本质是一门浏览器脚本语言,在执行的时候是一行一行的执行,只有前面的代码执行完了才会执行后面的代码.JS是单线程语言指的就是这个意思. 同步和异步其实在进行任务执 ...

  2. angular.js 中同步视图和模型数据双向绑定,$watch $digest $apply 机制

    Angular.js 中的特性,双向绑定. 让视图的改变直接反应到数据中,数据的改变又实时的通知到视图,如何做到的? 这要归功于 scope 下面3个重要的方法: $watch $digest $ap ...

  3. 在HTML中限制input 输入框只能输入纯数字

    限制 input 输入框只能输入纯数字 onkeyup = "value=value.replace(/[^\d]/g,'')" 使用 onkeyup 事件,有 bug ,那就是在 ...

  4. JS中同步与异步的理解

    你应该知道,javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条流水线,仅仅是一条流 ...

  5. Three.js中如何显示帧速【转】

    https://blog.csdn.net/hannahlwh1988/article/details/36876295 Step1:src中添加: <script src="js/s ...

  6. js中同步与异步处理方法

    在使用异步请求时,有时需要将异步请求的结果返回给另一个js函数,此种情况下会出现未等异步请求返回请求结果,该发送请求所在js函数已经执行完后续操作,即已经执行return ,这样会导致return的结 ...

  7. js中同步与异步请求方式

    异步请求方式: $.ajax({ url : 'your url', data:{name:value}, cache : false, async : true, type : "POST ...

  8. JS中同步与异步

    不讲过多定义,举两个例子说明下 例一: console.log(100); setTimeout(function(){ console.log(200); },1000); console.log( ...

  9. js中div显示和隐藏钮为什么页面总是跳一下到最上面

    <div class="menu_left"> <ul > <li id="t1" style="background- ...

随机推荐

  1. [Spark]What's the difference between spark.sql.shuffle.partitions and spark.default.parallelism?

    From the answer here, spark.sql.shuffle.partitions configures the number of partitions that are used ...

  2. git版本控制工具的使用(1)。

    为了使用. 感谢:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 讲解的很清晰, ...

  3. 2019.01.22 SCU4444 Travel(最短路+bfs)

    传送门 题意简述:给出一张nnn个点的完全图,有mmm条边边权为aaa其余点边权为bbb,问从111到nnn的最短路. 思路:分类讨论一波即可. (1,n)(1,n)(1,n)的边权为aaa,那么只用 ...

  4. 2018.11.04 洛谷P2679 子串(线性dp)

    传送门 为什么前几年的noipnoipnoip总是出这种送分题啊? 这个直接线性dpdpdp不就完了吗? f[i][j][k][0/1]f[i][j][k][0/1]f[i][j][k][0/1]表示 ...

  5. python3 提示 name ‘reload’ is not defined

    import importlib importlib.reload(sys)

  6. boost--signal

    1.signals2库 signals2库实现了线程安全的观察者模式,在signals2中观察者模式被称为信号/插槽(signals/slots),它是一种函数回调机制.一个信号可以关联一个或多个插槽 ...

  7. svn更新的时候出现ERROR:Previous operation has not finished,run "clean up" if it wa interrupted;进行clean up命令也报错

    报错的截图: 然后进行了clean up命令,依旧报错了: 这种情况就有两种方法去解决了,自己可以根据自己的情况选择,哪种方便选择哪种呗! 方法一: 备份自己修改的文件,删除之前download的文件 ...

  8. java se的那些细节

    局部变量:方法体内或语句块内,不能有修饰符 成员变量:与类的对象共存,可以有修饰符 类属性:与类共存,可以有修饰符 一.局部变量:必须先赋值,才能使用,如果不赋初值,则会报错,即没有默认的始使值,而基 ...

  9. attachEvent方法绑定事件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. Word图片上传控件卸载教程-Xproer.WordPaster

      卸载教程:      卸载控件-IE          Windows XP          Windows 7(x86)          Windows 7(x64)      卸载控件-C ...