keypress事件在safari和使用jQuery 1.3的Firefox中无法正常工作

Nee*_*ngh 2 jquery

代码片段在这里

如果我用keyup或keydown替换keypress,它可以正常工作.根据jQuery文档 event.which应该工作正常.

更新:

本页的最底部:

如果你需要检测这些密钥,请自己帮忙并搜索他们的keyCode onkeydown/up,并忽略onkeypress和charCode.

看起来按键不太可靠.

UPDATE2:

keypress事件在Firefox和Safari中都有效.但是它不会检测左右箭头按键.http://docs.jquery.com/Events/keypress

MrC*_*les 9

Keypress是一个令人困惑的事件.虽然keydown和keyup会告诉你键盘上的哪个特定键已关闭或刚刚恢复,但是按键事件应该告诉你屏幕上会出现什么字符,这就是你引用的jquery文档说的原因:

例如,小写的"a"将通过keydown和keyup报告为65,但是按key按97报告.

更糟糕的是,Safari不会触发无法在屏幕上写入内容的按键事件 - 这就是为什么箭头键不起作用的原因.但是,Firefox会触发箭头键的按键事件.两者都是规范的合理实现,所以不要指望要么改变.这就是为什么有人建议坚持使用keydown或keyup.

但是,当按住某个键并且您想要使用箭头键执行此操作时,您似乎希望利用按键事件(在Firefox中)的重复方式.如果是这种情况,您需要编写一个查看keydown和keypress的处理程序.以下是浏览器对按住箭头键的两种不同方式:

  • Firefox注册了一个keydown事件,并且还重复了按键事件(注意:只需按一次键即可注册keydown和keypress事件)
  • Safari注册keydown事件并重复keydown事件

快速破解使得箭头键的工作相当好并使密钥重复工作是:

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)