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

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

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

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

    数据质量功能已经开发完毕,但是要实现单元测试覆盖率80%以上,其他的还好,只是这个工具类实在让我摸不着头脑,其实工具类的单元测试是最简单的,只是自己想复杂了而已: 无返回值模拟: 有返回值模拟: 异常 ...

  2. js使用sessionStorage、cookie保存token

    本文是参考别人的博客写的,图片直接用的别人的 1.Token:token是客户端频繁向服务器端请求数据,服务器频繁的去数据库查询用户名和密码进行对比,判断用户名和密码正确与否,并作出相应的提示,在这样 ...

  3. import this

    import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than ...

  4. 复制粘贴容易犯的错误 eclipse

    有时候复制原有的代码到xml文件中,会提示某文件没有找到,一般该文件名字改成别的了,这时候为了解决这问题一般需要对这个文件重命名

  5. WCF 与 Windows Store Client App

    首先复习下WCF: WCF实际上是构建了一个框架,这个框架实现了在互联系统中各个Application之间如何通信.使得Developers和Architect在构建分布式系统中,无需在考虑如何去实现 ...

  6. xml约束的概念

    1 xml 约束的概念 XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML ...

  7. 字符串方法 split() & replace()

    split() 语法:stringObject.split(separator) 功能:把一个字符串分割成字符串数组 返回值:Array 说明:separator 是必须的,分隔符. var str= ...

  8. SELECT INTO创建临时表

    SELECT INTO创建临时表 SQL Server临时表有两种类型:本地和全局.它们在名称.可见性以及可用性上有区别.本地临时表的名称以单个数字符号 (#) 打头:它们仅对当前的用户连接是可见的: ...

  9. QT5中无法包含Qtgui头文件的问题。

    今天新学QT是,从一个ppt中边看边抄边学.前几页还能理解,但到了用纯源码写空白QT工程时,便遇到了一个问题.头文件里包含 #include  <QtGui> 但是编译时总是出现下面图一中 ...

  10. mysql update受影响的行数为0或查询结果为空时

    当执行update语句时,如果受影响的行数是0,返回的也是true. $conn = new mysqli(); $sql = "update ..."; $query = $co ...