第一章 基础知识

第六节 事件处理

    如果激发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章。