按键事件翻译:QQlan
比较强大的交互式类型是通过键盘的按键来控制. 你能利用几乎所有的键的压下和释放效果. 记住, Netscape的UNIX版本Communicator 4.0 控制键盘的能力. 如果你要制作基于键击的javascript效果, 那么, 它在UNIX和Linux操作系统下会无效.
首先必须理解初试化. 这里是一个简单的初始化"onKeydown"事件.
document.onkeydown = keyDown
当代码被borswer读取并且有一个键盘的键被按下, 就调用
 KeyDown() function. 两个brorswer对于处理被按下的键有所不同.  我们先单独举例.
 Netscape 响应该事件, Netscape比IE要复杂一些. 你不得不多写一行不断的检查是否有键被按下. 如果不增加这一行, 它将和其他的事件, 比如mousedown混淆起来.
document.onkeydown = keyDown
if (ns4) document.captureEvents(Event.KEYDOWN)
keyDown必须递交一个隐藏变量 -- 我使用字母"e" ,因为这是一般多数的表示方法.
function keyDown(e)
这个"e"表示被安下的键.  你可以使用
 which  属性找到被按下的是哪个键.
 e.which 这行将获得该键的指针编码 -- 不是被按下的字母或者数字. 转换编码成为数字, 你还需要使用:
 String.fromCharCode(e.which) 现在把它们放在一起. 我们写一个function, 弹出一个message, 显示被按下的键的keycode和真正的键符.
function keyDown(e) {
    var keycode = e.which
    var realkey = String.fromCharCode(e.which)
    alert("keycode: " + keycode + "\nrealkey: " + realkey)
}
document.onkeydown = keyDown
document.captureEvents(Event.KEYDOWN)
查看范例 
www.dansteinman.com/dynduo/examples/keystrokes-n.html (Netscape only) 
 Internet Explorer IE写法类似但是你不用使用"e"值. 
你可以用 
 window.event.keyCode 代替 [b] e.which 转换成真实的键值用法相同: 
 String.fromCharCode(event.keyCode). 
function keyDown() {
    var keycode = event.keyCode
    var realkey = String.fromCharCode(event.keyCode)
    alert("keycode: " + keycode + "\nrealkey: " + realkey)
}
document.onkeydown = keyDown
document.onkeydown = keyDown
查看范例: 
www.dansteinman.com/dynduo/examples/keystrokes-ie.html  (Internet Explorer only) 
合二为一如果你同时打开两个browser, 你会发现效果几乎相同.  除了由于两个browser使用不同的字符集, 所以他们显示出不同的keycodes. 由于这个原因你不得不为两个browser分别写代码, 没有捷径可走.
我的建议是使用keycodes, 而彻底忘记真正显示的键值. 下面的一段代码中, 如果你使用NS
-- 把
 nKey 赋值给keycode, 把
 ieKey  赋值为0; 如果使用IE, 那么
 ieKey 赋值给keycode, 把
 nKey  赋值为0. 然后它显示最后的结果.
function keyDown(e) {
    if (ns4) {var nKey=e.which; var ieKey=0}
    if (ie4) {var ieKey=event.keyCode; var nKey=0}
    alert("nKey:"+nKey+" ieKey:" + ieKey)
}
document.onkeydown = keyDown
if (ns4) document.captureEvents(Event.KEYDOWN)
查看范例: 
www.dansteinman.com/dynduo/examples/keystrokes-both.html现在好东东来也....
 通过按键移动现在你可以使用键盘激活移动functions. 首先检查哪个键被按下, 然后调用functions移动你的object. 下面的例子中, 我使用字母"A" 激活sliding function (滑动程序). 对于"A"键, 它的nKey是97, ieKey是65. 我所要做的就是检查这两个值, 然后调用"slide"子程序.
function init() {
    if (ns4) block = document.blockDiv
    if (ie4) block = blockDiv.style
    block.xpos = parseInt(block.left)
    document.onkeydown = keyDown
    if (ns4) document.captureEvents(Event.KEYDOWN)
}
function keyDown(e) {
    if (ns4) {var nKey=e.which; var ieKey=0}
    if (ie4) {var ieKey=event.keyCode; var nKey=0}
    if (nKey==97 || ieKey==65) {   // if "A" key is pressed
        slide()
    }
}
function slide() {
    block.xpos += 5
    block.left = block.xpos
    status = block.xpos       // not needed, just for show
    setTimeout("slide()",30)
}
查看范例:http://www.dansteinman.com/dynduo/examples/keystrokes-slide1.html
 理解 "Active" 变量 最后的script有些局限. 一旦移动开始, 你没有办法使它停下,  而且如果按下该键次数越多, 它就移动的越快. 现在我们才修正它.
我已经使用了"active" 变量来表示当前的移动状态. ...动么? 不动么? 一旦你习惯这样的方式, 凡事垂手可得. 因为,  多数移动functions都是递归方式,  没有停止的办法, 这就是"active" 变量出现的原因.  嵌入"if" 声明到slide function中, 你能控制这个function重复还是不重复. 通常我们会写成:
function slide() {
    if (myobj.active) {
        myobj.xpos += 5
        myojb.left = myobj.xpos
        setTimeout("slide()",30)
    }
}
上例中, 只有当myobj.active的值为
 true 那么,  slide() function 才运行. 反之, myobj.active为
false, 移动将停止. 懂的了这些, 我们可以在script里增加更多的控制.
  使用 onKeyUp 和 "Active" 变量onKeyup function和 onKeyDown的用法几乎相同. 你可以同时初始化 keydown 和 keyup:
document.onkeydown = keyDown
document.onkeyup = keyUp
if (ns4) document.captureEvents(Event.KEYDOWN | Event.KEYUP)
keyUp() function也一样. 但是我们希望当按键被释放, 物体停止移动. 所以我们要把我们的block的active 变量设为0.
function keyUp(e) {
    if (ns4) var nKey = e.which
    if (ie4) var ieKey = window.event.keyCode
    if (nKey==97 || ieKey==65) block.active = false
}
我们还需要增加一些代码,  进行彻底"error"校验. 看一下下面的代码, 看你是不是能理解. keyDown function中, 
&&!block.active是:当block没被激活之前, 用来调用function的.换句话说, 如果block已经在移动, 那么就没有必要再次调用slide().  接着我们设置active的值为true, 然后移动物体. slide() function中, 使用 
 if (block.active)  声明, 只有当active值为true, 才执行移动. 用这个方法, 当我们释放按下的键, 移动将被停止.
function init() {
    if (ns4) block = document.blockDiv
    if (ie4) block = blockDiv.style
    block.xpos = parseInt(block.left)
    block.active = false
    document.onkeydown = keyDown
    document.onkeyup = keyUp
    if (ns4) document.captureEvents(Event.KEYDOWN | Event.KEYUP)
}
function keyDown(e) {
    if (ns4) {var nKey=e.which; var ieKey=0}
    if (ie4) {var ieKey=event.keyCode; var nKey=0}
    if ((nKey==97 || ieKey==65) && !block.active) {   // if "A" key is pressed
        block.active = true
        slide()
    }
}
function keyUp(e) {
    if (ns4) {var nKey=e.which; var ieKey=0}
    if (ie4) {var ieKey=event.keyCode; var nKey=0}
    if (nKey==97 || ieKey==65) {
        block.active = false   // if "A" key is released
    }
}
function slide() {
    if (block.active) {
        block.xpos += 5
        block.left = block.xpos
        status = block.xpos       // not needed, just for show
        setTimeout("slide()",30)
    }
}
查看范例:http://www.dansteinman.com/dynduo/examples/keystrokes-slide2.html
 哪个键我可以使用? 正如我先前说过的, NS和IE处理字符集有所不同. 通常, 所有的字母, 数字, 符号, 空格和Enter都工作正常. 你可以查看我的 
nKey and ieKey Finder 得到相关细节. 
 游戏控制  这里有几个游戏, 可以让你看到用我们学到的技巧可以完成这些功能.
Game Controls 1 - utilizes left/right/up/down keys to move an object in any direction 
Game Controls 2 - the controls behind my 
Follow the Leader demo 
Game Controls 3 - the controls behind my 
 StarThruster game 
-------------------------------------------------------------
5DMedia版权所有, 转载请注明出处!