input的blur事件

$("#input-name").blur(function () {

    var value = $(this).val();

    if (value === '') {
return;
} if (/^[\u4e00-\u9fa5]{1,3}$/.test(value)) {
$(this).removeClass("error-class");
} else {
$(this).addClass("error-class");
} });

keyup事件

$(document).on('keyup', '.error-class', function (event) {
// Avoid revalidate the field when pressing one of the following keys
// Shift => 16
// Ctrl => 17
// Alt => 18
// Caps lock => 20
// End => 35
// Home => 36
// Left arrow => 37
// Up arrow => 38
// Right arrow => 39
// Down arrow => 40
// Insert => 45
// Num lock => 144
// AltGr key => 225 //keyup事件中需要排除掉的按键,因为这些按键并不会改变input的value
var excludedKeys = [
16, 17, 18, 20, 35, 36, 37,
38, 39, 40, 45, 144, 225
]; //event.which === 9 是键盘左侧的Tab键,当input失焦且值为空时,不需要做验证
if (event.which === 9 && $(this).val() === "" || $.inArray(event.keyCode, excludedKeys) !== -1) {
return;
} //验证输入内容,验证通过就移除报错样式error-class,反之则添加
if (/^[\u4e00-\u9fa5]{1,3}$/.test($(this).val())) {
$(this).removeClass("error-class");
} else {
$(this).addClass("error-class");
}
});

keyup事件代码是我从著名的jq表单验证插件jquery.validate.js扣出来的。

但在某些内容较为简单的页面,使用jquery.validate.js让我觉得太累赘,我就扣出来手写了这个验证,发现这里的事件绑定技巧和keyCode比较有用,特此记录一下。

事件绑定思路

首先,对input的blur事件绑定处理方法,用正则验证输入;验证通过移除报错样式error-class,反之则添加;

其次,使用$(document).on('keyup', '.error-class',function(){}) 为含有报错样式error-class的元素绑定keyup事件处理方法;

关键点就在于keyup事件处理方法要绑定在含有error-class的元素上,如果一开始对input绑定keyup事件处理方法,那么用户在敲击第一个按键时就触发了keyup事件进行正则验证,若正则要求至少3个字符,而用户只敲了一个字符便出现了报错信息,用户还没有输入完毕就提示错误这样的交互设计是不允许的。

正确的交互是:1、用户首次输入时,让其输入完毕后(即blur事件)才做正则验证,blur事件处理方法对用户的完整输入进行正则验证,反馈错误信息;2、用户根据反馈修正输入,当错误内容被修改至正确时则立即(keyup事件)移除报错样式;3、内容没有错误的input不触发keyup事件处理方法。

虽然blur事件的处理方法也会移除报错样式,但没有keyup事件处理的及时;相对blur而言,使用keyup事件可以提升页面的友好度。

另外,这里为什么不用$(".error-class").keyup()绑定事件处理方法,而是用$(document).on('keyup'),不懂的同学查一下两者的差异就明白了。

event.which、event.keyCode、event.charCode的区别

三者是之前为适应不同浏览器而产生的,其中event.which 将 event.keyCode 和 event.charCode 标准化了。JQuery官方推荐使用event.which:http://api.jquery.com/event.which/ 。

随着时代变迁,目前主流、新版的浏览器对event.which和event.keyCode都有很好的支持。

keyCode表

字母和数字键的键码值(keyCode)
按键 键码 按键 键码 按键 键码 按键 键码
A 65 J 74 S 83 1 49
B 66 K 75 T 84 2 50
C 67 L 76 U 85 3 51
D 68 M 77 V 86 4 52
E 69 N 78 W 87 5 53
F 70 O 79 X 88 6 54
G 71 P 80 Y 89 7 55
H 72 Q 81 Z 90 8 56
I 73 R 82 0 48 9 57
数字键盘上的键的键码值(keyCode) 功能键键码值(keyCode)
按键 键码 按键 键码 按键 键码 按键 键码
0 96 8 104 F1 112 F7 118
1 97 9 105 F2 113 F8 119
2 98 * 106 F3 114 F9 120
3 99 + 107 F4 115 F10 121
4 100 Enter 108 F5 116 F11 122
5 101 - 109 F6 117 F12 123
6 102 . 110        
7 103 / 111        
控制键键码值(keyCode)
按键 键码 按键 键码 按键 键码 按键 键码
BackSpace 8 Esc 27 Right Arrow 39 -_ 189
Tab 9 Spacebar 32 Dw Arrow 40 .> 190
Clear 12 Page Up 33 Insert 45 /? 191
Enter 13 Page Down 34 Delete 46 `~ 192
Shift 16 End 35 Num Lock 144 [{ 219
Control 17 Home 36 ;: 186 \| 220
Alt 18 Left Arrow 37 =+ 187 ]} 221
Cape Lock 20 Up Arrow 38 ,< 188 '" 222
多媒体键码值(keyCode)
按键 键码 按键 键码 按键 键码 按键 键码
音量加 175            
音量减 174            
停止 179            
静音 173            
浏览器 172            
邮件 180            
搜索 170            
收藏 171            

keycode表出处:水木 http://www.cnblogs.com/hsapphire/archive/2009/12/16/1625642.html

记录JavaScript中使用keyup事件做输入验证(附event.keyCode表)的更多相关文章

  1. 在javascript中如何取消事件冒泡

    如果在javascript中只希望事件发生在它的目标而不是在它的父元素上,即取消它的冒泡事件的发生,该如何做?因为按照javascript发生事件的顺序,它由两个阶段:分别从根元素--父元素--目标元 ...

  2. JavaScript中常用的事件

    .onclick事件 点击事件(onclick并不是js中的方法,onclick只是浏览器提供js的一个dom接口,让js可以操作dom,所以onclick大小写都是没问题的,比如HTML代码就不用区 ...

  3. JavaScript中冒泡与事件委托

    冒泡 事件触发后事件流的三个阶段按顺序依次是: 1.捕获阶段 2.目标阶段 3.冒泡阶段 大盒子包裹小盒子,两个盒子都分别添加点击事件,当点击小盒子,两个盒子的事件都会触发. 事件委托 下级元素委托上 ...

  4. JavaScript中的方法事件和函数的方法的三种方法

    js中的很多事件  而事件相对应的就是方法(函数 )那么今天所说的就是这三种方法      已onclick事件为例 1: 基本方法 <div id="a" onclick= ...

  5. javascript设计模式实践之策略模式--输入验证

    策略模式中的策略就是一种算法或者业务规则,将这些策略作为函数进行封装,并向外提供统一的调用执行. 先定义一个简单的输入表单: <!DOCTYPE html> <html> &l ...

  6. JavaScript中的ononline事件和onoffline事件

    关于这个时间的描述到处都有,但基本上都是说离线在线什么的我一下子还没反应过来.后再在这里看到了一句话:"断开网络再联网试试,就可以看到连线的提示."这才反应过来,原来指的是网络状态 ...

  7. JavaScript中的定时事件

    这两个函数都是在给定的时间之后开始执行的,并不是立即执行. var timeId = window.setTimeout("method()",1000); //定时执行,还可以这 ...

  8. 记录一下SparkStreaming中因为使用redis做数据验证而导致数据结果不对的问题

    业务背景: 需要通过redis判断当前用户是否是新用户.当出现新用户后,会将该用户放入到redis中,以标明该用户已不是新用户啦. 出现问题: 发现入库时,并没有新用户入库,但我看了数据了,确实应该是 ...

  9. javascript中的scroll事件

    window.addEventListener('scroll',function(){ if(document.compatMode == "CSS1Compat") { ale ...

随机推荐

  1. OC 线程操作 - GCD使用 - 栅栏函数

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //同步函数无需栅栏函数 //栅栏 ...

  2. jquery 处理重新绑定插件的方法

    比如有一个slide的jquery插件,页面打开就对dom进行了绑定. <div class="expert"> <div class="expert- ...

  3. JsonConvert.SerializeObject 空值处理

    var settings = new JsonSerializerSettings() { ContractResolver= new NullToEmptyStringResolver() }; v ...

  4. Spring框架之log日志的使用

    1.Spring框架也需要引入日志相关的jar包 * 在spring-framework-3.0.2.RELEASE-dependencies/org.apache.commons/com.sprin ...

  5. (转)innodb 多版本并发控制原理详解

    转自:https://blog.csdn.net/aoxida/article/details/50689619 多版本并发控制技术已经被广泛运用于各大数据库系统中,如Oracle,MS SQL Se ...

  6. struts2值栈ValueStack中都有哪些东西?

    com.opensymphony.xwork2.dispatcher.HttpServletRequest application com.opensymphony.xwork2.dispatcher ...

  7. myeclipse svn 插件去除已经保存的密码方法

    myeclipse svn 插件去除已经保存的密码方法   删除掉C:\Documents and Settings\hao\Application Data\Subversion\auth\svn. ...

  8. 2018.10.19 NOIP模拟 加密(模拟)

    传送门 直接按hashhashhash函数反着算回去就行了. 加法用exgcdexgcdexgcd,异或直接枚举二进制位. 代码

  9. 2018.08.22 NOIP模拟 string(模拟)

    string [描述] 给定两个字符串 s,t,其中 s 只包含小写字母以及*,t 只包含小写字母. 你可以进行任意多次操作,每次选择 s 中的一个*,将它修改为任意多个(可以是 0 个)它的前一个字 ...

  10. 2018.08.06bzoj1251: 序列终结者(非旋treap)

    传送门 平衡树板子题. 直接fhqtreap打区间标记就行了. 代码: #include<bits/stdc++.h> #define N 50005 using namespace st ...