jQuery .keypress & .keydown .which

37

好的,那么.keypress和.keydown / .keyup有什么区别?目前我正在使用.keydown,该键返回一个值为38的.which值,现在如果我将其更改为.keypress,则会返回相同键的值为109。有什么区别,为什么相同键的值不同?


不同的浏览器应该产生不同的事件,但不是不同的键命令。 - SpYk3HH
我有一个JSON对象,其中包含每个按键事件,按浏览器分组。我会很快将其发布到一个Fiddle上,包括所有三个按键事件,我们可以测试一下,给我10分钟。 - SpYk3HH
5个回答

23
如果您按下一个按钮,它会触发一个 keydown 事件,释放按钮会触发一个 keyup 事件。而在这两个事件之间,通常会触发一个 keypress 事件。 keydownkeyup 描述的是哪个被更改了。而 keypress 则表示该键代表哪个字符
请注意,这一切都取决于浏览器!
请参阅此文章,了解各种浏览器上实现的键盘事件之间的差异。

21

真是太惊奇了,原来只有按键事件和这之间有所区别。哈哈

查看我的代码片段,试着输入字母"r"

http://jsfiddle.net/SpYk3/NePCm/

不知道为何之前没有注意到这个问题

找到更多信息:

http://www.quirksmode.org/js/keys.html

"这两个属性是keyCodecharCode。简单地说, keyCode表示用户按下的实际键盘键,而charCode给出所得字符的ASCII值。这些信息的位数不一定相同;例如,小写字母“a”和大写字母“A”具有相同的 keyCode,因为用户按下相同的键,但具有不同的charCode,因为所得的字符不同。

Explorer和Opera不支持charCode。但是,它们在 keyCode 中提供字符信息,但仅限于 onkeypress onkeydown-up keyCode包含键信息。


是的,这就是为什么我感到困惑的原因? - ChrisMJ
正如jbl在他的回答中指出的那样,这个页面稍微描述了一下问题,但似乎仍然没有完全回答问题。也许我读错了这个页面,但其中一点仍然指出charcode在两者上都被拉出来,只是返回一个不同的值。也许在一些旧的js文档中可以找到答案。我正在寻找,还要重写我的对象以包括按键差异。 - SpYk3HH
虽然我建议避免使用keypress,因为它的触发事件不如keydown和keyup可预测。 - SpYk3HH

14

9
在正常情况下,选择使用keyup事件:
$(document).keyup(function(e){
  console.log(e.which);
});

原因:

  1. keydown 事件在用户按住键时持续触发,而 keypresskeyup 只会触发一次。
  2. keypress 无法检测特殊键(例如 SHIFT),而 keydownkeyup 可以。

2

KeyPress事件发生在KeyDown事件之后。因此,您可以使用KeyDown来确定按下的键是什么,然后使用KeyPress来禁止该字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接