JS中同步显示并分割输入的数字字符串

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

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

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

这种效果中,仿造的就是输入银行卡子类的,故只能够输入数字,需要禁用用户输入的其它字符下面是几种实现方式。先贴上HTML和CSS代码:

 1     <html>
 2         <head>
 3             <style type="text/css">
 4                 #gaoLiang{
 5                     width:400px;
 6                     height:50px;
 7                     font-family:Candara;
 8                     color:red;
 9                     font-size:20px;
10                     text-align:center;
11                     line-height:50px;
12                     display:none;/*这个层模式是隐藏的*/
13                     border:1px solid red;
14                 }
15             </style>
16         </head>
17
18         <body>
19             <div id="gaoLiang"></div>
20             卡号:<input type="text" id="kaHao" />
21         </body>
22     </html>

实现方式一:只是利用键盘的 onkeydown 事件

这个事件是在用户按下键盘后触发,也就是说,此时界面上是没有用户输入的数据的,但是可以通过event事件对象来获得用户输入的数据。要解决的问题就是手动的将用户输入的数据给拼接显示到界面上去,还有就是要考虑到用户选择删除的时候是通过退格键删除还是用鼠标选中以后删除。JS代码如下:

 1     document.getElementById(‘kaHao‘).onkeydown = kaHao;//注册事件方法
 2
 3     function kaHao(evt){
 4         var e = evt || window.event;
 5         //如果用户输入的非数字或者退格键就阻止输入
 6         if((e.keyCode < 48 || e.keyCode>57) && e.keyCode != 8){
 7             return false;
 8         };
 9         //拿到当前文本框中已经存在的值
10         var value = this.value;
11         //判断输入的是否是退格键
12         if(e.keyCode == 8){
13             //如果是退格键就删除选中的文本或者最后一个。因为在Keydown事件中,是先执行代码后改变界面的值
14             var s="";
15             //拿到用户选择的要删除的文本
16             if(typeof this.selectionStart == ‘number‘){
17                 s = this.value.substring(this.selectionStart,this.selectionEnd);
18             }else if( document.selection.createRange ){//IE8 及以下
19                  s = document.selection.createRange().text;
20             };
21             //如果没有选择长度就为0,那么就删除最后一个
22             if(s.length == 0){
23                 s = value.charAt(value.length-1)
24             };
25             //执行删除数据
26             value = value.replace(s,‘‘);
27         }else{
28             //如果不是删除键就把当前的字符个拼接上去,由于JS中加号运算优先考虑数字,所有toString()
29             //IE6~8不支持e.key的写法
30             //value = this.value.toString() + e.key;
31             value = this.value.toString() + String.fromCharCode(e.keyCode);
32         };
33
34         var line;//用来存放正则匹配的数字字符串
35         var strs=[];//存放已经提前的字符串
36         var reg = /(\d{1,4})/g;//正则。使用的是exec来匹配,可以使用replace更简单,在下一种方式中使用
37         while((line = reg.exec(value))){
38             strs.push(line[0]);
39         };
40         //按照正则,四个数为一组进行分割,由于匹配失败,返回一个null,直接导致后面的join报错,故不使用它
41         //strs = value.match(reg);
42         //在按照空格进行拼接
43         value = strs.join(‘ ‘);
44         //拿到层进行设置以及显示
45         var gao = document.getElementById(‘gaoLiang‘);
46         gao.innerHTML = value;//innerHTML基本上不存在浏览器兼容性问题,故用它
47         gao.style.display = ‘block‘;
48     };

onkeydown 方式实现

这种方式在实现上麻烦的就是在用户删除数据的时候,要进行判断,而且还存在浏览器兼容性问题。还有就是需要拼接用户输入的数据,但是它的同步性很好

实现方式二:只是利用键盘的 onkeyup 事件

在keyup事件中,相比就比较简单,引用当这个事件触发的时候,用户输入的值已经在界面上了,我们可以直接获取到。而且如果用户是删除,也不需要关系是通过鼠标选中删除还是直接按退格键删除,因为在删除键抬起的时候,界面上的数据已经删除了。代码如下:

 1     document.getElementById(‘kaHao‘).onkeyup = kaHaoTwo;//注册事件方法
 2
 3     function kaHaoTwo(evt){
 4         var e = evt || window.event;
 5
 6         //用正则去替换掉用户输入的非数字字符
 7         this.value = this.value.replace(/[^\d]*/g,‘‘);
 8
 9         //用正则去替换,(?=\d) 就是要求,如果要匹配成功,那么前面匹配的四位数字后面还必须再有以为数字。可以将后面替换的空格换成逗号或者其它字符就能够看出正则中有和没有这个匹配要求的区别
10         value = this.value.replace(/(\d{4})(?=\d)/g,‘$1 ‘)
11
12         var gao = document.getElementById(‘gaoLiang‘);
13         gao.innerHTML = value;
14         gao.style.display = ‘block‘;
15     };

onkeyup 方式实现

这种方式的实现中,有一个不好的就是,当用户输入非数字的时候,用正则去替换掉,因为输入的字符已经在界面上了,突然没有了,体验下不好。

实习方式三:综合上面两种方式

结合上面两种方式的优点,可以再keydown下面判断用户的非法输入,在keyup里面对数据进行替换,代码如下:

 1     document.getElementById(‘kaHao‘).onkeydown = kaHaoThreeDown;
 2     document.getElementById(‘kaHao‘).onkeyup = kaHaoThreeUp;
 3
 4     function kaHaoThreeDown(evt){
 5         var e= evt || window.event;
 6         if((e.keyCode > 57 || e.keyCode<48) && e.keyCode!=8){
 7             return false;
 8         };
 9     };
10
11     function kaHaoThreeUp(){
12         var gao = document.getElementById(‘gaoLiang‘);
13         gao.innerHTML =  this.value.replace(/(\d{4})(?=\d)/g,‘$1 ‘);
14         gao.style.display = ‘block‘;
15     };

效果二 在用户输入完成后将数字按照从右到左分割

用户输入完成,就代表的是失去了焦点,可以注册一个onblur事件来完成。由于采用的是正则,而正则默认的是从左向右匹配(也许可以是从右向左匹配,不过我不清楚),题目的要求是从右向左分割,所有代码中先对字符串进行了一个反转处理,分割成功后在进行一个翻转就OK了。JS中的代码如下:

 1     docuemnt.getElementById(‘nums‘).onblur = splitNum;
 2
 3     function splitNum(evt){
 4         var value = this.value;
 5         //先替换到所有的除了小数点以外的非数值数值
 6         value = value.replace(/[^(\d.)]*/g,‘‘);
 7         //字符串没有反转方法,故需要先转成数组
 8         value = value.split(‘‘).reverse().join(‘‘);
 9         //可以尝试不加正则后面的(?=\d),在输入的数字刚好是3的整数倍时就会出现问题
10         value = value.replace(/(\d{3})(?=\d)/g,‘$1,‘);
11         this.value = value.split(‘‘).reverse().join(‘‘);
12     };

JS中同步显示并分割输入的数字字符串,布布扣,bubuko.com

时间: 2024-10-10 07:04:29

JS中同步显示并分割输入的数字字符串的相关文章

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

Angular.js 中的特性,双向绑定. 让视图的改变直接反应到数据中,数据的改变又实时的通知到视图,如何做到的? 这要归功于 scope 下面3个重要的方法: $watch $digest $apply 他们的区别是什么,我们来介绍下: $watch 这是一个监听 scope 上数据的监听器 方法说明: $scope.$watch('参数',function(newValue,oldValue){ //逻辑处理 }) 上面我们就是创建了一个监听器. ‘参数’ 就是$scope对象下的一个对象

js中同步与异步处理方法

在使用异步请求时,有时需要将异步请求的结果返回给另一个js函数,此种情况下会出现未等异步请求返回请求结果,该发送请求所在js函数已经执行完后续操作,即已经执行return ,这样会导致return的结果为空字符. 总结:若要在使用ajax请求后处理发送请求返回的结果,最好使用同步请求. 例如:以下例子会出现返回结果不正确的情况,因为ajax异步请求还未执行完,函数已经执行return了, function fn(){ var result = " "; $.ajax({ url : '

1、DB中的null在js中的显示结果

记录是为了更好的成长! 之前一直没弄明白DB中是null的话在前台怎么判断,到底是null还是undefined?做demo测试结果如下: DB: name  =  nullJS:  name  =  nullconsole.dir(name)  ---->>>>   null console.dir(name == null)  ---->>>> true console.dir(name == undefined) ---->>>>

JS中同步与异步

不讲过多定义,举两个例子说明下 例一: console.log(100); setTimeout(function(){ console.log(200); },1000); console.log(300); 上面代码就是一个异步过程,结果是: 它先打印出100和300,一秒后再打印出200. 例二: console.log(100); alert(200); console.log(300); 上面代码是一个同步过程,它先打印出100,然后确认弹窗后,再打印出300. 由上例子可以知道, 同

js中同步与异步请求方式

异步请求方式: $.ajax({ url : 'your url', data:{name:value}, cache : false, async : true, type : "POST", dataType : 'json/xml/html', success : function (result){ do something.... } }); 同步请求方式: $.ajax({ url : 'your url', data:{name:value}, cache : false

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

<div class="menu_left"> <ul > <li id="t1" style="background-image:url(images/t2.gif);" > <a href="#" id="first" onclick="infoList('first');" >中心动态</a></li> <

显示剩余可输入的数字

一.引入css 1 .clsShowInfoWindow { 2 BORDER-RIGHT: #8AB3F4 3px solid; 3 PADDING-RIGHT: 0em; 4 BORDER-TOP: #8AB3F4 3px solid; 5 PADDING-LEFT: 0em; 6 FONT-SIZE: smaller; 7 font-family:Verdana, Arial, Helvetica; 8 font-size:12px; 9 Z-INDEX: 101; 10 PADDING-

js中得计算问题算式结果拼接成字符串怎么解决

如题:经常遇到类似问题 一种:自定义的弱类型 var savNum=0; var num=$("#numU").val();//jsp页面获得得值 savNum=parseInt(savNum)+parseInt(num); $(".cartNum").text(savNum);//最后改变jsp页面得值,text()是输出文本值,html()是当成html元素解析 二种:混合双精度类型 //自动计算的函数function productCount(){ var $

字符串中找出连续出现的最大数字字符串

#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; #include<string> int main() { string s1; while (getline(cin, s1)) { int newlen = 0;//统计数字字符的长度 int max=0;//数字字符的最大长度 auto start = s1.begin(); auto finish = s1.begin(); s