代码段为here
如果我用keyup或keydown替换keypress,它可以正常工作。根据{{3}} event.which应该工作正常。
更新
jQuery documentation的最低点:
如果你需要检测这些密钥,请自己帮忙并搜索他们的keyCode onkeydown / up,并忽略onkeypress和charCode。
看起来按键不太可靠。
UPDATE2:
keypress事件在Firefox和Safari中都有效。但是它不会检测左右箭头按键。 this page says
答案 0 :(得分:9)
Keypress是一个令人困惑的事件。虽然keydown和keyup会告诉你键盘上的哪个特定键已关闭或刚刚恢复,但是按键事件应该告诉你屏幕上会出现什么字符,这就是你引用的jquery文档说的原因:
例如,小写的“a”将通过keydown和keyup报告为65,但是按key按97报告。
更糟糕的是,Safari不会触发无法在屏幕上写入内容的按键事件 - 这就是为什么箭头键不起作用的原因。但是,Firefox会触发箭头键的按键事件。两者都是规范的合理实现,所以不要指望要么改变。这就是为什么有人建议坚持使用keydown或keyup。
但是,当按住某个键并且您想使用箭头键执行此操作时,您似乎希望利用按键事件的重复方式(在Firefox中)。如果是这种情况,您需要编写一个查看keydown和keypress的处理程序。以下是浏览器对按住箭头键的两种不同方式:
快速破解使得箭头键工作得相当好并让密钥重复发挥作用是:
function moveItem(evt) {
// do something with `this` and evt.keyCode here...
}
$(document.documentElement)
.keypress(function(evt) {
if ($.data(this, '_lastKeyEvent') != 'keydown') {
// since firefox will do both a keydown and a keypress for the first
// keydown, we ignore the very first keypress
moveItem.call(this, evt);
}
$.data(this, '_lastKeyEvent', 'keypress');
})
.keydown(function(evt) {
moveItem.call(this, evt);
$.data(this, '_lastKeyEvent', 'keydown');
});