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

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

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

这种效果中,仿造的就是输入银行卡子类的,故只能够输入数字,需要禁用用户输入的其它字符下面是几种实现方式。先贴上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. java中HashMap的基本方法使用

    遍历,添加词,等等 package test; import java.util.HashMap; import java.util.Iterator; import java.util.ArrayL ...

  2. Google Reader 快关了!!

    现在还每天用Google Reader, 每次打开都提示7月1号要关闭... 上图怀念: 控制区功能:排序.展开\收缩显示.上一条\下一条,还有下拉框下的很多功能... 列表显示 针对每个Item下的 ...

  3. 网络编程之IO模型

    IO模型的分类 blocking IO:阻塞IO nonblocking IO:非阻塞IO IO multiplexing:IO多路复用 signal driven IO:异步IO 通常情况下IO默认 ...

  4. 2018.11.24 poj3693Maximum repetition substring(后缀数组)

    传送门 后缀数组好题. 考虑枚举循环节长度lenlenlen. 然后考虑枚举循环节的起点来更新答案. 但是直接枚举每次O(n)O(n)O(n). 考虑枚举len∗k+1len*k+1len∗k+1作为 ...

  5. Java对象的克隆

    今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢 ...

  6. flask中flash不显示

    需要在html文件中body中加入下列语句 <div class='container'> <div class="row"> {% with messag ...

  7. C++IO cin

    cin cin.get() 每次只读缓冲区一个字符,不能接收空格 cin.getline() 读缓冲区一行,能够接收空格 cin.ignore(2) 忽略缓冲器2个字节 int i = cin.pee ...

  8. 最全js表单验证

    /***************************************************************** 表单校验工具类 (linjq) ***************** ...

  9. 相似性度量 Aprioir算法

    第三章 标称:转换成0,1来算,或者用非对称二元属性 二元:x1,x2的分布取00,01,10,11的二元属性个数,列表,算比例.不对称的二元属性就忽略00的属性个数 序数:转换成排位rif,度量:r ...

  10. Redis和RabbitMQ在项目中的使用

    一:Redis的使用 1.先引入pom.xml的依赖 <dependency> <groupId>redis.clients</groupId> <artif ...