- keypress: 当输入字符键时触发,但现在有些浏览器按下功能键是也能触发,而且按住不放的话,会重复触发此事件。
- keydown: 当用户按下任意键时触发,而且按住不放的话,会重复触发此事件。
- keyup: 当用户释放时触发。
不同浏览器触发keypress事件的情况
-
key Internet Explorer Firefox Opera Google Chrome and Safari Alphanumeric, +, -, *, /, ENTER, SPACE yes yes yes yes ALT, CTRL, META, SHIFT no no yes no ESC yes yes yes no Fn, cursor left, up, right and down keys, Insert, Delete, Home, End, Page Up, Page Down, Backspace no yes yes no
在中文输入法下,浏览器之间则表现得不一致,主要情况如下:
- IE,Chrome,Safari:触发keydown和keyup, 不触发keypress。
- FireFox:首次按下按键时触发keydown,不触发keypress。在停止输入法并改变文本框内容(如按下回车或者空格键)后会触发keyup。
- Opera:keydown, keypress和keyup都不触发。
- ps:只有在触发keyup事件才能获得修改后的文本值。
- 所有元素都支持以上三个事件,一般情况下只有在文本框时才经常用到。
- 键盘事件的触发过程具体是这样的: 在用户按下键盘上的一个字符键时,首先会触发keydown事件,然后是keypress事件,最后是keyup事件。其中,keydown和keypress事件是在文本框发生变化之前被触发;而keyup在文本框发生变化之后被触发。如果用户按下一个键不放,就会重复触发keydown和keypress事件。在用户按下一个非字符键时,首先触发keydown事件,然后就是keyup事件。如果用户按下一个键不放,就会重复触发keydown。
- 当我们监听这三个事件时,最想得到的数据信息就是键码(keyCode)和字符编码(charCode)了。
- keyCode与keyCode的区别:keyCode属性的值与ASCII码中对应小写字母或者数字的编码相同。因此,数字键7的keyCode值为55,而字母A健的keyCode值为65——与Shift键的状态无关;
- 不同浏览器对得到keyCode 和charCode的兼容性不同
-
在IE下:
- 支持keyCode
- 不支持which和charCode,二者值为 undefined
在Firefox下:- 支持keyCode,除功能键外,其他键值始终为 0
- 支持which和charCode,二者的值相同
-
- 支持keyCode和which,二者的值相同
- 不支持charCode,值为 undefined
- 键码(keyCode)
- 在发生keydown和keyup事件时,event对象的keyCode属性会包含一个代码,keyCode属性的值就是小写字母或数字对应的ASCII码,在程序中可通过如下代码来获得keyCode值:
-
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事件意味着按下的键会影响到屏幕中文本的显示。在发生keypress事件时,FF、Chrome和Safari的event对象都支持一个charCode属性,这个属性只有发生在keypress事件时才发生。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则没有找到解决办法。
相关推荐
`KeyDown`、`KeyPress`和`KeyUp`是三个主要的键盘事件,各有其特点和用途。 `KeyDown`事件在用户按下任意键时触发,无论该键是否产生字符。这个事件发生在控件有焦点的情况下,即使按下的是非打印键,如箭头键、...
### C# WinForm中的KeyDown, KeyPress和KeyUp事件相关知识点 #### 一、按键的类型与识别 在C# WinForm应用中,处理用户的键盘输入是常见需求之一。Windows窗体通过引发键盘事件来响应用户的键盘操作。这些事件主要...
然而,由于键盘事件的keydown、keyup、keypress在不同浏览器中的兼容性问题,开发者通常会选择使用compositionstart、compositionend以及input事件来监听文本输入。特别是对于中文输入法,由于在按下回车、shift、...
例如,当按下小写字母"a"时,Firefox的`keydown`和`keyup`事件中`keyCode`为65,而`keypress`事件中`charCode`为97。但在Chrome和IE中,`keydown`事件中的`keyCode`也为65,`keypress`事件中`charCode`同样为97,...
JS 键盘事件可以分为三种类型:keydown、keypress 和 keyup,它们分别对应 onkeydown、onkeypress 和 onkeyup 这三个事件句柄。在这三个事件类型中,keydown 和 keyup 比较底层,而 keypress 比较高级。 浏览器的...
在本文中,我们首先介绍了JavaScript中处理键盘按键事件的三种不同类型的事件:keydown、keypress和keyup,以及它们对应的事件句柄onkeydown、onkeypress和onkeyup。这些事件类型在处理按键时是有顺序和差异的:首先...
在WinForm应用开发中,处理键盘输入事件时,常常会遇到`KeyDown`、`KeyPress`和`KeyUp`这三个事件。了解它们之间的顺序和差异对于编写响应用户输入的代码至关重要。以下是对这三个事件的详细解析: 1. **顺序**: ...
按键事件主要包括`keydown`、`keypress`和`keyup`,分别代表键按下、键被按下并释放前的状态以及键释放。此外,本文还讨论了不同浏览器之间的差异性及其处理方式。 #### 1. 键盘按键事件基础 - **`keydown`**:此...
3. keypress事件主要用来接收字母、数字等ANSI字符,而keydown和keyup事件过程可以处理不被keypress识别的击键,如功能键(F1-F12)、编辑键、定位键以及这些键和键盘换档键的组合等。 特别地,在处理组合键如Ctrl+...
首先,我们需要明确浏览器中与键盘事件相关的主要类型,它们分别是keydown、keypress和keyup事件。keydown事件在按键按下时触发,而keypress事件紧随其后,在按键被按下并能够产生可打印字符时触发。keyup事件则在...
事件对象`event`在`keydown`、`keypress`和`keyup`中具有通用属性,如`altKey`、`ctrlKey`和`shiftKey`,它们指示是否有Alt、Ctrl或Shift键与其他键一起被按下,这些属性在Firefox和IE中都可用。 **第二部分:兼容...
首先,浏览器的键盘事件主要包括三种类型:keydown、keypress 和 keyup。keydown 事件在用户按下键盘键时触发,keyup 事件则在用户释放键时触发。keypress 事件通常用于处理字符输入,它会在用户按下可打印字符时...
这两个参数通常与`KeyPress`、`KeyDown`和`KeyUp`等键盘事件相关联,帮助程序员捕获和响应用户的键盘操作。 `KeyAscii`变量在`KeyPress`事件中使用,它代表了用户按下的是哪个ASCII字符。ASCII码是一种基于拉丁字母...
KeyCode是键盘事件(如keydown、keyup、keypress)中的一种属性,它代表了用户按下或释放的键的唯一标识。每个键都有一个对应的KeyCode值,这些值通常是整数,可以被JavaScript、Java、C#等编程语言用于识别用户按...
常见的键盘事件有`keydown`、`keyup`和`keypress`。`keydown`事件在用户按下键盘键时触发,`keyup`则在用户释放键时触发,`keypress`主要针对字符键的按下,通常忽略非打印键。 二、JavaScript中的`event.keyCode` ...
为了方便实用,开发者会编写或使用现有的库来处理这些键盘事件,比如在JavaScript中,可以使用`keydown`、`keyup`和`keypress`事件来监听用户的键盘操作。这些事件会触发回调函数,此时可以在函数内部获取到`keycode...
在JavaScript中,可以通过监听`keydown`、`keyup`或`keypress`事件来获取用户按下的按键信息。其中,`event.keyCode`属性用于获取按键对应的ASCII码或特殊按键的标识符。 #### Keycode概述 `keyCode`是`...
用js实现键盘记录,要关注浏览器的三种按键事件类型,即keydown,keypress和keyup,它们分别对应onkeydown、onkeypress和onkeyup这三个事件句柄。一个典型的按键会产生所有这三种事件,依次是keydown,keypress,...
本教程主要关注二级VB程序设计中的键盘事件,包括KeyPress、KeyDown和KeyUp事件,以及如何利用这些事件处理用户输入。 ### 第一节:KeyPress事件 KeyPress事件是针对键盘输入的,它会在用户按下并释放一个键时触发...
例如,如果你想要在用户按下“Enter”键时执行某个操作,你可以监听`KeyDown`事件,并检查`KeyCode`属性是否等于13,因为“Enter”的虚拟键码是13。 为了使用`KeyDown`事件,你需要在VB中为你的控件或窗体添加事件...