原文1:http://www.cnblogs.com/silence516/archive/2013/01/25/2876611.html

原文2:http://www.cnblogs.com/leolai/archive/2012/08/01/2618386.html


英文输入法:
 
事件触发顺序:keydown - > keypress - > keyup

 
中文输入法:
 
firfox:输入触发keydown,回车确认输入触发keyup
chrome:输入触发keydown、keyup,回车确认输入只触发keydown
IE:输入触发keydown、keyup,回车确认输入触发keydown,keyup
Safari:输入触发keydown、keyup,回车确认输入触发keydown,keyup
opera:输入触发keydown、keyup,回车确认输入触发keydown,keyup
 
keypress事件不能对系统功能键(例如:后退、删除等,其中对中文输入法不能有效响应)进行正常的响应,
keydown和keyup均可以对系统功能键进行有效的拦截,但事件截获的位置不同。
 
键盘中的键分为字符(可打印)键和功能键(不可打印),系统功能键包括如下:
Esc、Tab、Caps Lock、Shift、Ctrl、Alt、Enter、Backspace、Print Screen、Scroll Lock、Pause Break、Insert、Delete、Home、End、Page Up、Page Down, F1 through F12,Num Lock、The Arrow Keys。
 
keypress响应系统功能键总结:
Firefox:支持 Esc、Enter、Backspace、Pause Break、Insert、Delete、Home、End、Page Up、Page Down、F1 through F12、The Arrow Keys
Chrome:支持Enter
Oprea:支持Enter
Safari:支持Enter
IE:支持Esc、Enter
 
ps:
firefox:上下左右键会触发kepress.
 
chrome: 上下左右键不会触发kepress.
 
oprea:上下左右键不会触发kepress.
 
safari:上下左右键不会触发kepress.
 
IE:上下左右键不会触发kepress.
 
================================================================================
keyCode(键码), which, charCode(字符编码)
 
keydown: 获得keyCode, charCode=0
 
keypress: 字符(英文区分大小写+数字  / * , .  ...等非功能键),keyCode=0 ,获取charCode值, 反之获取keyCode, charCode=0
 
keyup: 获得keyCode, charCode=0
 
jquery 中 event.which = original.charCode != null ? original.charCode : original.keyCode;
 
 
总结:回车、上下左右、等功能键keydown、keypress、keyup都获取keyCode,并且值相等。
 
 
开启大写情况,keydown、keypress(字母,主键盘数字、回车)、keyup,which值相等,小写kepress获取的which不同于keypress、keyup。
 
keypress事件的keyCode对字母的大小写敏感,而keydown、keyup事件不敏感
keypress事件的which值无法区分主键盘上的数字键和附键盘数字键的,而keydown、keyup的which值对主附键盘的数字键敏感。
IE(ie9以下)只有一个属性KeyCode属性,当为keydown和keyup
事件是,keycode属性表示你具体按下的键(也称为virtual
keycode),当捕捉的是keypress事件时keyCode属性指的是你键入的字符(character code)   
 
标准浏览器中情况有些不同,event对象包含一个keyCode属性和一个charCode属性,keydown和keyup事
件的时候,keyCode表示的就是你具体按的键,charCode为0;当捕捉的是keypress事件时,keyCode为0,charCode指的
是你按下的字符,鉴于IE和FF中的区别,如果你比较懒的话,建议只使用keydow和keyup事件
 
 
/**
本文所涉及浏览器(除ie)都为最新版本
**/

用户在使用键盘时会触发键盘事件。目前,对键盘事件的支持主要遵循的是DOM0级。

  在英文输入法下,所有浏览器都遵循以下三个事件:

  1. keydown: 当用户按下任意键时触发,而且按住不放的话,会重复触发此事件。
  2. keypress: 当用户按下字符键时触发,而且按住不放的话,会重复触发此事件。按下Esc键也会触发这个事件,Safari3.1之前的版本按下非字符键时也触发。
  3. keyup: 当用户释放键时触发。

  在中文输入法下,浏览器之间则表现得不一致,主要情况如下:

  1. IE,Chrome,Safari:触发keydown和keyup, 不触发keypress。
  2. Firefox:首次按下按键时触发keydown,不触发keypress。在停止输入法并改变文本框内容(如按下回车或者空格键)后会触发keyup。
  3. Opera:keydown, keypress和keyup都不触发。
  4. PS : 只有在触发keyup事件才能获得修改后的文本值。

  所有元素都支持以上三个事件,一般情况下只有在文本框时才经常用到。

  键盘事件的触发过程具体是这样的: 在用户按下键盘上的一个字符键时, 首先会触发keydown事件,然后是keypress事件,最后是keyup事件。其中,keydown和keypress事件是在文本框发生变化之前 被触发;而keyup在文本框发生变化之后被触发。如果用户按下一个键不放,就会重复触发keydown和keypress事件。在用户按下一个非字符键时,首先触发keydown事件,然后就是keyup事件。如果用户按下一个键不放,就会重复触发keydown。

  当我们监听这三个事件时,最想得到的数据信息就是键码(keyCode)字符编码(charCode)了。

  键码(keyCode)

  在发生keydown和keyup事件时,event对象的keyCode属性会包含一个代码,keyCode属性的值就是小写字母或数字对应的ASCII码(点击这里查看ASCII码表),在程序中可通过如下代码来获得keyCode值:

//EventUtil是一个封装的对象,用来处理跨浏览器事件
var textbox = document.getElementById('myText');
EventUtil.addHandler(textbox,'keydown',function(event){
event = event || window.event;
alert(event.keyCode);
});

  以下是keydown和keypress事件存在的一些特殊情况:

  • 在FF和Opera中,按分号键时keyCode值为59,但IE,Chrome和Safari则返回186
  • 在Safari3之前的版本中,上、下、左、右箭头和上翻(PageUp)、下翻(PageDown)键返回大于63000的值。

  字符编码(charCode)

  在发生keypress事件时,FF、Chrome和Safari的event对象都支持一个charCode属性,charCode属性的值 就是按下的字符键对应的ASCII编码,这个属性在按下非字符键或发生keydown和keyup事件时值为0;IE和Opera则是在keyCode中 保存字符键的ASCII编码。所以,要想跨浏览器获得字符编码,代码如下:

//获取字符编码
var getCharCode = function(event){
var charcode = event.charCode;
if(typeof charcode == "number" && charcode != 0){
return charcode;
}else{
//在中文输入法下 keyCode == 229 || keyCode == 197(Opera)
return event.keyCode;
}
};

  这个方法首先检查charCode属性是否包含数值(在不支持这个属性的浏览器中,值为undefined),在判断是否等于0(兼容keydown和keyup事件),如果条件成立,则返回改值,否则返回keyCode的值。之前的例子获取字符编码如下:

var textbox = document.getElementById('myText');
EventUtil.addHandler(textbox,'keydown',function(event){
event = event || window.event;
alert(getCharCode(event));
});

  在得到了字符编码后,可以使用String.fromCharCode()将其转换为实际的字符。

  键盘事件的应用

  1、 过滤输入——屏蔽某些字符的输入

  达到的效果:只能输入数字,输入其他字符没有反应。不屏蔽辅助输入的按键,如退格键,方向键,复制,粘贴等。

  原理很简单:在文本框修改前,获取字符编码,判断合理性,不成立则阻止键盘的默认事件。看起来很简单,但由于浏览器的兼容问题,实现起来还是有点难度。代码如下:

var handler= function(e){
e = e || window.event;
var charcode = typeof e.charCode == 'number' ? e.charCode : e.keyCode;
var re = /\d/;
//FF和safari3.1以前版本会对方向键、退格键、删除键触发keypress事件 charcode > 9 可修复此Bug
//!e.ctrlKey 不屏蔽Ctrl+C,Ctrl+V
if(!re.test(String.fromCharCode(charcode)) && charcode > 9 && !e.ctrlKey){
//阻止默认事件
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
}
};
EventUtil.addHandler(textbox,'keypress',handler);
//监听粘贴事件
EventUtil.addHandler(textbox,'paste',function(e){
e = e || window.event;
var clipboardData = e.clipboardData || window.clipboardData;
if(!/^\d*$/.test(clipboardData.getData('text'))){
//阻止默认事件
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
}
});

  在这个例子的基础上加以修改和调整,就可以应用于放过或屏蔽任何输入文本框的字符。

  很遗憾,还有一个bug未能解决,就是在中文输入法时keypress事件失效问题。

  针对中文输入法的Bug,目前找到的解决办法是:在文本框加入属性style="ime-mode:disabled" IE和FF下可禁用输入法;在Chrome,Safar下可为文本框添加keydown事件,判断event.keyCode是否等于299,是的话就阻 止keydown默认事件,这种方法对IE也有效。而对于Opera则没有找到解决办法。

  路漫漫其修远兮,吾将上下求索!

input keyup 500ms 延时输入 事件处理

==================input keyup 500ms 延时输入 事件处理==================
var last;
$(".input").keyup(function(event){//.input为你的输入框
last = event.timeStamp;
//利用event的timeStamp来标记时间,这样每次的keyup事件都会修改last的值,注意last必需为全局变量
setTimeout(function(){ //设时延迟0.5s执行
if(last-event.timeStamp==0)
//如果时间差为0(也就是你停止输入0.5s之内都没有其它的keyup事件发生)则做你想要做的事
{
//做你要做的事情
}
},500);
==================input keyup 500ms 延时输入 事件处理==================

键盘事件keydown、keypress、keyup随笔整理总结(摘抄)的更多相关文章

  1. 无线端不响应键盘事件(keydown,keypress,keyup)

    今天在项目时,在android手机上使用输入法的智能推荐的词的话,不会触发keyup事件,一开始想到在focus时使用一个定时器,每隔100ms检测输入框的值是否发生了改变,如果改变了就作对应的处理, ...

  2. 键盘事件keydown、keypress、keyup随笔整理总结

    英文输入法:   事件触发顺序:keydown - > keypress - > keyup   中文输入法:   firfox:输入触发keydown,回车确认输入触发keyup chr ...

  3. 详解键盘事件(keydown,keypress,keyup)

    一.键盘事件基础 1.定义 keydown:按下键盘键 keypress:紧接着keydown事件触发(只有按下字符键时触发) keyup:释放键盘键 顺序为:keydown -> keypre ...

  4. 键盘事件keydown、keypress、keyup

    事件触发顺序:keydown - > keypress - > keyup   中文输入法:   firfox:输入触发keydown,回车确认输入触发keyup chrome:输入触发k ...

  5. keyDown keyPress keyUp 事件的区别

    keyDown keyPress keyUp  事件的区别 一 触发顺序 显而易见,事件发生的顺序是: keydown --> keypress --> keyup 当按住一个键一段时间后 ...

  6. keydown - > keypress - > keyup 用法和区别

    英文输入法:   事件触发顺序:keydown - > keypress - > keyup   中文输入法:   firfox:输入触发keydown,回车确认输入触发keyup chr ...

  7. keydown - > keypress - > keyup

    英文输入法:   事件触发顺序:keydown - > keypress - > keyup   中文输入法:   firfox:输入触发keydown,回车确认输入触发keyup chr ...

  8. keydown,keypress,keyup三者之间的区别

    最近看了Javascript高级教程中对过滤输入的介绍,想实现比如电话号码中不能包好非数值的字符,而相应文本中插入字符的操作是keypress事件,所以就想通过阻止这个事件的默认事件行为来阻止这个事件 ...

  9. 部分无线终端不响应键盘事件(keydown,keypress,keyup)的解决办法

    在无线侧实现搜索显示smartbox功能的时候,会对输入框绑定keydown.keyup.keypress事件,从而在检测到输入框的值发生改变时,发出请求拉取smartbox的内容. 但是,在iPho ...

随机推荐

  1. 对于Oracle analyze table的使用总结 . 对于Oracle analyze table的使用总结 .

    对于Oracle analyze table的使用总结 . 对于Oracle analyze table的使用总结 . analyze table 一般可以指定分析: 表,所有字段,所有索引字段,所有 ...

  2. Force.com微信开发系列(五)自定义菜单进阶及语音识别

    在上文里我们介绍了如何通过Force.com平台里为微信账号添加自定义菜单,本文里我们将进一步介绍如何查询菜单以及删除菜单的相关知识,最后会介绍微信平台如何进行语音识别的相关技术. 查询菜单 与创建菜 ...

  3. block中出现此种报错: Incompatible block pointer types initializing 'float (^__strong)(float, float)' with an expression of type 'int (^)(float, float)'

    当block(代码块)的返回值是float时,应注意的地方:定义的返回值类型一定要与return的返回值类型一样 我们以两个数的四则运算来举例 在main.m文件中的四则运算中,我采用两种返回值类型( ...

  4. IOS内存警告处理

    IPhone下每个app可用的内存是被限制的,如果一个app使用的内存超过20M,则系统会向该app发送Memory Warning消息.收到此消息后,app必须正确处理,否则可能出错或者出现内存泄露 ...

  5. SVN版本更新后,upData工程之后,Xcode 工程文件打不开解决办法

    svn更新代码后,打开xcode工程文件,会出现  xxx..xcodeproj  cannot be opened becausethe project file cannot be parsed. ...

  6. 解决win2003/2008下注册机或破解补丁程序无法运行问题

    win Server 2003/2008 64位系统均遇到注册机或破解补丁程序无法运行或报错或死机的情况,原因是win系统默认开启了文件数据执行保护导致的. (比如3DMax的破解补丁程序等...) ...

  7. 在Dynamics CRM 2015中通过3CX插件(以及3CX windows phone)拨出电话

    背景 在On-premises部署的Dynamics CRM中实现通过网页拨通客户电话的功能 要点 3CX 提供了开箱即用的Dynamics CRM Solution,只需要在Microsoft Dy ...

  8. 利用 cos 组件实现jsp中上传附件

    需求:在web功能中附件上传功能为最基本的功能之一,所以用cos组件做了一个附件上传的demo.附件上传功能的实现可以利用其它的java组件实现,相关资料网上比较多. 说明步骤:下载组件并安装 --& ...

  9. FPGA speed grade

    Altera的-6.-7.-8速度等级逆向排序,Xilinx速度等级正向排序. 不很严密地说,“序号越低,速度等级越高”这是Altera FPGA的排序方法, “序号越高,速度等级也越高”这是Xili ...

  10. java打字游戏

    小记:老早之前写的程序,今天发现之前在 csdn上写的东西的图片不显示了,搞得人好郁闷,所以把之前零星的几篇文章搬个家 游戏运行截图: 字母实体类 package com.git.game; impo ...