第一章 基础知识
第六节 事件处理
如果激发keydown事件的那个按键会打印出某个字符,那么浏览器将会在触发keyup事件之前先产生keypress事件。如果在一段时间内持续地按住某个可以打印出字符的键,那么浏览器就会在keydown与keyup事件之间产生一系列的keypress事件。
按键监听器的实现方法同鼠标监听器类似。可以将某个函数赋值给document或window对象的onkeydown、onkeyup或onkeypress变量,也可以用keydown、keyup或keyPress作为第一个参数,用指向某个函数的引用作为第二个参数,来调用addEventListener()方法。
想要弄清楚按下的到底是哪个键,这是个非常复杂的事情。原因有两个。第一,全世界各种语言里有海量的字符,你必须将拉丁字母、亚洲语言中的表意字符(Asian ideographic characters),以及印度的许多种语言都考虑在内。这只是举了几个例子而已,要支持所有的语言,将是难以置信的。
第二,虽说浏览器与键盘已经存在很久了,但直到DOM Level 3规范出现,键值码(key code)才被标准化。现在很少有浏览器支持这个规范。总而言之,要想弄清楚被按下的到底是哪个键或哪个组合键序列,是一笔糊涂账。
不过,在绝大多数情况下,都可以使用如下两条简单的对策来处理这个问题:
·处理keydown与keyup事件时,看看浏览器传给事件监听器的那个事件对象中keyCode属性的值。一般来说,如果是可打印的字符,那么属性值就会是其ASCII码。请注意刚才那句话中的“一般”。有一个网站不错,你可以在处理不同浏览器传过来的键值码时参考该页面:http://bit.ly/o3b1L2。键盘事件所产生的事件对象,也包含下述boolean属性:
·altKey
·ctrlKey
·metaKey
·shiftKey
·由于浏览器只会在产生可打印字符时才触发keypress事件,所以,在处理该事件时,可以放心地使用如下方式来获取字符:
var key = String.fromCharCode(event.which);
通常来说,除非要在canvas中实现字符控制功能,否则处理鼠标事件的场合要远远多于处理键盘事件。键盘事件的另一个常见用途,就是在游戏之中处理按键动作。那个话题我们将在第9章之中讨论。
1.6.3 触摸事件
随着智能手机与平板电脑的出现,HTML规范也加入了对触摸事件的支持。要了解更多有关触摸事件处理的信息,请参阅本书第11章。