keypress和keydown事件及keyCode和keyChar

二:keypress和keydown事件:

现只在IE10、chrome(版本 32.0.1700.107 m)、firefox(25.0.1)中测试了。

  IE8 chrome firefox
$(document).keydown() yes yes yes
$('window').keydown() no yes yes
$('body').keydown() no yes yes

keypress的表现与上表一致。
不仅keypress和keydown得到的按键值不同,不同浏览器的返回值event.keyCode、event.charCode也不同:

    Q键 q键 Caps Lock键 Tab键 左方向键 数字1键 Enter键 空格键 F5键
key
down
key
press
key
down
key
press
key
down
key
press
key
down
key
press
key
down
key
press
key
down
key
press
key
down
key
press
key
down
key
press
key
down
key
press
IE10 keyCode 81 81 81 113 20 -- 9 -- 37 -- 49 49 13 13 32 32 116 --
charCode  0 81   0 113   --  0 --   0  --  0  49  0  13   32  0 -- 
chrome keyCode 81 81 81 113 20 -- 9 9 37 -- 49 49 13 13 -- 32 116 --
charCode 81   113  0 --   0  9 --   0 --   13  --  32  -- 
firefox keyCode 81 0 81 0 20 -- 9 9 37 37    49  0 13 13 32 0 116 116
charCode  0 81   113 --   0  0  0 49   0  0 32   0  0

(还有一个event.whice:A non-standard property, the hybrid of charCode and keyCode, with the sole purpose to confuse a developer.
But in the zoo of key events it also plays a good role. Particulary, it helps to get the character. )

还有一些属性:shiftKey, ctrlKey, altKey, metaKey,布尔类型的值,检测按键是否是shift、ctrl、alt、Command(Mac only).

可以看出对于keyCode:

keydown几乎对所有按键都有返回值,且对大小写字母的返回值相同;

kepress似乎对只对字母按键有返回值,且对大小写字母的返回值不一样.

关于keydown、keypress、keyup的区别,参考http://javascript.info/tutorial/keyboard-events,上面写的很详细,摘录如下:

对于keydown,任何按键事件都能触发它,并返回scan-code(按键本身固有的数字代码,所有同一个键的scan-code肯定相同);

对于keypress,只保证character keys(字符按键)事件能触发它,并返回char-code(按键的unicode字符,区分大小写按键,charCode只在keypress中返回。js中的str.charCodeAt() 方法就可返回指定位置的字符的 Unicode 编码)。

For all keys except ';', '=' and '-' different browsers use same key code.。

看了上面的表是不是觉得有点......,参考网页中还给出了keypress的事件代码

如何获取键入的字符值和数字值:

// only keypress event
function getChar(event) {
  if (event.which == null) {
    return String.fromCharCode(event.keyCode) // IE
  } else if (event.which!=0 && event.charCode!=0) {
    return String.fromCharCode(event.which) // the rest
  } else {
    return null // special key
  }
}

测试IE10、chrome、firefox有效。

由于String.fromCharCode对special keys 会返回weird results.所有不能直接return String.fromCharCode(event.keyCode||event.charCode)。

如何获取包含特殊键在内的组合键:

以ctrl+e为例:

document.onkeydown = function(e) {
  e = e || event;
  if ((e.ctrlKey && e.keyCode == 'E'.charCodeAt(0)) ) {
   //do something
}

由于keyCode对大小写字符返回的都是大写字母值,所以e.keyCode == 'E'.charCodeAt(0)对e和E都能识别。

测试IE10、chrome、firefox有效。(如果先按住E,再同时按ctrl,则都无效)

上一篇:libevent总结学习


下一篇:Access删除某一字段重复的数据但是要保留一条