用户在使用键盘时会触发键盘事件。目前,对键盘事件的支持主要遵循的是DOM0级。
在英文输入法下,所有浏览器都遵循以下三个事件:
- keydown: 当用户按下任意键时触发,而且按住不放的话,会重复触发此事件。
- keypress: 当用户按下字符键时触发,而且按住不放的话,会重复触发此事件。按下Esc键也会触发这个事件,Safari3.1之前的版本按下非字符键时也触发。
- keyup: 当用户释放键时触发。
在中文输入法下,浏览器之间则表现得不一致,主要情况如下:
- 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)
在发生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则没有找到解决办法。
路漫漫其修远兮,吾将上下求索!
相关推荐
1、KeyPress主要用来接收字母、数字等ANSI字符 KeyDown 和 KeyUP 事件过程通常可以捕获键盘除了PrScrn所有按键(这里不讨论特殊键盘的特殊键 2、KeyPress 只能捕获单个字符 KeyDown 和KeyUp 可以捕获组合键。...
3. keypress事件主要用来接收字母、数字等ANSI字符,而keydown和keyup事件过程可以处理不被keypress识别的击键,如功能键(F1-F12)、编辑键、定位键以及这些键和键盘换档键的组合等。 特别地,在处理组合键如Ctrl+...
在本文中,我们首先介绍了JavaScript中处理键盘按键事件的三种不同类型的事件:keydown、keypress和keyup,以及它们对应的事件句柄onkeydown、onkeypress和onkeyup。这些事件类型在处理按键时是有顺序和差异的:首先...
首先,浏览器的键盘事件主要包括三种类型:keydown、keypress 和 keyup。keydown 事件在用户按下键盘键时触发,keyup 事件则在用户释放键时触发。keypress 事件通常用于处理字符输入,它会在用户按下可打印字符时...
其中,keydown事件在用户按下键盘上的任意键时触发,keypress事件在按键被按下并产生字符时触发,keyup事件则在键盘键被释放时触发。本文主要关注keydown事件的监听。 要监听全局的键盘按下事件,可以使用jQuery中...
首先,我们需要明确浏览器中与键盘事件相关的主要类型,它们分别是keydown、keypress和keyup事件。keydown事件在按键按下时触发,而keypress事件紧随其后,在按键被按下并能够产生可打印字符时触发。keyup事件则在...
jQuery库简化了DOM操作和事件处理,使代码更简洁。我们可以使用`.on()`方法绑定键盘事件: ```javascript $(document).on('keydown', function(event) { console.log('Key pressed:', event.which); // jQuery中的...
- **现代浏览器**:大多数现代浏览器都支持标准的事件处理机制,但在某些细节上仍存在差异。 #### 八、扩展阅读 除了本文提到的内容外,还有许多其他相关知识点值得进一步探索,例如: - **键盘事件冒泡与捕获阶段*...
为了实现跨浏览器的键盘事件处理,我们需要检测浏览器类型。可以通过`navigator.userAgent`属性来识别浏览器: ```javascript function detectBrowser() { var userAgent = navigator.userAgent; if (userAgent....
`keydown`事件在按键被按下时触发,`keyup`事件在按键被释放时触发,而`keypress`事件通常用于识别字符输入,它在键盘按下并释放后,且产生的字符可以被程序识别时触发。 要监听这些键盘事件,我们可以使用...
记住,虽然大部分键盘事件处理在客户端进行,但通过`__doPostBack`函数,仍然可以连接到服务器端进行进一步的数据处理和逻辑控制。 以上就是关于“asp.net控制键盘keycode事件”的详细解释,希望能帮助你理解和掌握...
首先,键盘事件包括`keydown`、`keypress`、`input`和`keyup`。当用户按下键盘上的键时,通常会按照`keydown` -> `keypress` -> `input` -> `keyup`的顺序触发这些事件。然而,这个顺序并不是在所有情况下都适用,...
例如,在JavaScript中,我们可以使用`addEventListener`函数监听键盘事件,如`keydown`、`keyup`和`keypress`。在Python中,如果是在命令行环境下,可以使用`sys.stdin.readline()`来读取用户输入;如果是图形界面...
综上所述,处理键盘事件时,`keypress`和`keyup`是通用的事件,适用于大部分键盘交互;而`onpropertychange`虽然在某些情况下有用,但其局限性较大,通常推荐使用`input`事件来替代,以实现跨浏览器的文本输入监听。...
综上所述,JavaScript提供了丰富的键盘事件处理机制,使得开发者可以根据用户的行为做出响应,从而提高网页的交互性和用户体验。正确掌握和使用这些键盘事件,对于开发复杂的应用和游戏至关重要。
本文主要介绍了JavaScript中处理按键事件的方法,并探讨了如何让这些事件处理程序兼容不同类型的浏览器。按键事件主要包括`keydown`、`keypress`和`keyup`,分别代表键按下、键被按下并释放前的状态以及键释放。此外...
JavaScript提供了多种键盘事件,包括`keydown`、`keyup`和`keypress`。它们各自对应键盘上按键的不同状态: - `keydown`:当用户按下任意一个键时触发,无论是否产生字符。 - `keyup`:当用户释放一个键时触发。 ...
- 对于复杂的键盘事件处理逻辑,可以使用第三方库简化开发过程。 通过本文的详细介绍,相信您已经对JS中的键盘事件有了较为全面的理解。在实际项目开发中,合理运用这些知识将会使您的应用更加友好、实用。
这些事件包括`keydown`、`keyup`和`keypress`。在HTML5模拟的键盘页面中,当用户在实体键盘上按下键时,对应的虚拟键盘按钮会通过动画效果(如显示圆点)来响应这个事件,这通常是通过JavaScript事件监听器实现的。...