Javascript键盘事件
- keydown和keyup事件(低级事件),当用户在键盘上按下或者释放按键时,会发生keydown和keyup事件。它们由辅助键、功能键和字母键产生,如果用户按键时间足够长会导致它开始重复,那么keyup事件到达之前会收到多个keydown事件。
- 事件对象有个数字属性keyCode,对于可打印字符,keyCode值时按键上出现的字符的Unicode编码。对于字母键,无论是否开启大写,总是返回大写的keyCode,数字键盘也一样,对于是否按下shift,返回的总是一样的。
- 事件对象有altKey、ctrKey、metaKey、shiftKey属性,当对应的辅助键被按下,它们会被设置为true。
- 3级dom事件草案,定义了新的事件对象属性key,它会以字符串的形式包含键名。如果是可打印字符,key属性仅仅是这个打印字符,如果是功能键,则会类似’F2’、’Home’、’Left’这样子的值。
- keypress事件(较高级事件),它表示产生了一个可打印字符,表示输入的单个字符,以数字Unicode编码的形式,所以必须用String.fromCharCode()把它转换成字符串。
- 大多数浏览器,事件对象的keyCode属性指定了输入的字符编码。可用
var char = String.fromCharCode( event.keyCode )
获取字符。但是firefox使用的是charCode属性,获取字符需要var char = String.fromCharCode( event.charCode )
,而且在firefox中,产生非打印字符时也触发keypress事件(大多数浏览器只有产生了可打印字符时,触发keypress事件),所以为了区分这种情况,可用存在charCode属性,但是值为0做检测。
- 大多数浏览器,事件对象的keyCode属性指定了输入的字符编码。可用
- textinput事件(高级事件),3级DOM事件规范草案定义,不管来源(例如:键盘、黏贴、或拖放形式的数据传输、亚洲语言输入法、声音或手写识别系统),无论何时用户输入文本时,都会触发。textinput事件尚未得到支持,但Webkit浏览器支持非常类似的textInput事件。规范的textinput事件和Webkit的textInput事件都有相似的事件对象:
- 事件对象有一个data属性,用于保存输入的文本。
- 事件对象的inputMethod属性,用于指定输入源,不过尚未实现。
可通过取消textinput、textInput、和keypress事件来阻止字符的输入。一个例子,用来过滤用户输入
例1-1:
|
|
keypress和textinput事件是在新输入的文本真正插入到聚焦的文档元素前触发,所以这些事件处理程序能够取消事件和组织文本插入。
浏览器也实现了在文本插入到元素后才触发的input事件类型input。虽然这些事件不能取消,不能指定事件对象中的最新文本,但它们能以某种形式提供元素文本内容发生改变的通知。例如,想确保输入框中输入的任何文本都是大写的,可以,例1-2:
姓氏:<input type="text"oninput="this.value=this.value.toUpperCase();">
html5标准化了input,除IE外的浏览器都支持它。在IE中,可以使用不标准的propertychange事件检测文本输入元素的value属性改变来实现相似的效果。
使用propertychange事件探测文本输入
1234567891011121314151617function forceToUpperCase(element) {if (typeof element === "string") element = document.getElementById(element);element.oninput = upcase;element.onpropertychange = upcaseOnPropertyChange; //简易案例:用于input事件的处理程序function upcase(event) {this.value = this.value.toUpperCase();}//疑难案例:用于propertychange事件的处理程序function upcaseOnPropertyChange(event) {var e = event || window.event; //如果value属性发生改变if (e.propertyName === "value") { //移除onpropertychange处理程序,避免循环调用this.onpropertychange = null; //把值都变成大写this.value = this.value.toUpperCase(); //然后恢复原来的propertychange处理程序this.onpropertychange = upcaseOnPropertyChange;}}}
参考资料:
《JavaScript权威指南》第六版 p670