【问题标题】:keypress event not working properly in safari and in Firefox with jQuery 1.3keypress 事件在 safari 和 Firefox 中与 jQuery 1.3 无法正常工作
【发布时间】:2010-01-12 20:16:52
【问题描述】:

代码sn-p是here

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

更新:

this page says的最底端:

如果您需要检测这些键,请帮自己一个忙,在 onkeydown/up 上搜索它们的 keyCode,同时忽略 onkeypress 和 charCode。

看起来按键不是很可靠。

更新2:

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

【问题讨论】:

  • 我以前听说过keypress 就是这样,使用更明确的事件,如keydownkeyup 会更好,并且导致的问题更少。
  • 为什么很多人都用keydown,keyup不是更有意义吗?

标签: jquery


【解决方案1】:

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

例如,小写“a”会被 keydown 和 keyup 报告为 65,但被 keypress 报告为 97。

更糟糕的是,对于没有在屏幕上写入内容的内容,Safari 不会触发按键事件——这就是箭头键不起作用的原因。然而,Firefox 确实会触发箭头键的按键事件。两者都是规范的合理实现,所以不要期望任何一个都会改变。这就是为什么有人建议坚持使用 keydown 或 keyup。

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

  • Firefox 注册一个 keydown 事件并重复 keypress 事件(注意:只需按一次键将注册一个 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');
    });

【讨论】:

    猜你喜欢
    • 2015-08-22
    • 2015-06-10
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    相关资源
    最近更新 更多