代码片段在这里
如果我用keyup或keydown替换keypress,它可以正常工作.根据jQuery文档 event.which应该工作正常.
更新:
如果你需要检测这些密钥,请自己帮忙并搜索他们的keyCode onkeydown/up,并忽略onkeypress和charCode.
看起来按键不太可靠.
UPDATE2:
keypress事件在Firefox和Safari中都有效.但是它不会检测左右箭头按键.http://docs.jquery.com/Events/keypress
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');
});
Run Code Online (Sandbox Code Playgroud)