event.keycode没有在firefox中返回正确的值

时间:2011-09-07 08:13:13

标签: javascript jquery events keypress keycode

我正在尝试使用以下代码在输入框中按下space-bar时触发js方法。

  <input id="j1" /> 

  $('#j1').keypress (function (event){
       alert(event.keycode)
  });

在firefox中,只有在按下enter时才会返回正确的值,其他键的值每次只返回 0 。在IE / chrome中,这非常有效。

5 个答案:

答案 0 :(得分:26)

在非IE浏览器中,您希望which事件中的charCodekeypress属性而不是keyCode属性。 keypress事件用于检测键入的字符,而keyupkeydown用于检测物理键(在这些事件中,keyCode适用于所有主要浏览器。)

var charCode = (typeof event.which == "number") ? event.which : event.keyCode;

但是,jQuery通过使用类似于此的代码来规范化keypress事件的which属性,所以在jQuery中你只需要

var charCode = event.which;

关于关键事件的(很多)更多细节,请参阅http://unixpapa.com/js/key.html

答案 1 :(得分:7)

问题不是所有浏览器在按键上都有相同的实现。解决方案是检查key注册的所有可能位置。在这种情况下:event.keycodeevent.which

有关详细信息,请参阅此帖子

jQuery Event Keypress: Which key was pressed?

修改

最后挖出我的旧函数,这是我使用的实际代码:

evt = (evt) ? evt : event;
var charCode = evt.which || evt.charCode || evt.keyCode || 0;

答案 2 :(得分:2)

如果“event.keyCode”没有返回正确的值,那么对于Firefox,您可以使用“ event.charCode”

  

var keyValue = event.charCode || event.keyCode;

答案 3 :(得分:1)

KeyboardEvent.keyCode:

  

keypress事件的价值因浏览器而异。 IE和   Google Chrome设置了KeyboardEvent.charCode值。 Gecko设置为0   按下的键是可打印的键,否则它设置相同的keyCode   作为keydown或keyup事件

所以从Firefox的角度来看,它实际上已经返回了正确的值。见the docs

keyCodewhichkeyIdentifiercharCode已弃用

  

此功能已从Web标准中删除。虽然有些浏览器可能仍然支持它,但它正处于存在的过程中   下降。避免使用它并尽可能更新现有代码;

keyIdentifier在IE和Firefox中没有支持,而且已经从Opera和Chrome中删除了 使用 charCode作为非标准

  

此功能不符合标准,不符合标准。不要在面向Web的生产站点上使用它:它不适用于每个用户。实现之间可能存在很大的不兼容性

那么有哪些替代方案?

予。请改用key属性

readonly attribute DOMString key
  

保持与按下的键对应的键属性值

示例: “a”,“A”,“@”,“%”,“$”,“ا”,“ب”,“ة”,“ت”,......,“1”,“2”,“3 “,”Tab“,”输入“,所有”F1“......”

除了Internet Explorer 11以外,它已获得所有主流浏览器(Firefox 52,Chrome 55,Safari 10.1,Opera 46)的支持 AltGraph的非标准密钥标识符和不正确的行为。 More info
                 如果这很重要和/或向后兼容性,那么您可以使用功能检测,如下面的代码所示:

请注意,key值与keyCodewhich属性的不同之处在于:它包含密钥的名称而不是其代码。如果您的程序需要字符代码,那么您可以使用charCodeAt()。 对于单个可打印字符,您可以使用charCodeAt(),如果您正在处理其值包含多个字符的键,例如 ArrowUp 机会是:您正在测试特殊键并采取相应的措施。因此,尝试实现一个键的值及其对应的表             代码charCodeArr["ArrowUp"]=38charCodeArr["Enter"]=13charCodeArr[Escape]=27等等,请查看Key Values及其corresponding codes

if(e.key!=undefined){
        var characterCode = charCodeArr[e.key] || e.key.charCodeAt(0);
    }else{
        /* As @Leonid suggeted   */
        var characterCode = e.which || e.charCode || e.keyCode || 0;
    }
        /* ... code making use of characterCode variable  */  

II。您还可以使用code属性:

readonly attribute DOMString code
  

保存一个标识正在按下的物理键的字符串。该   值不受当前键盘布局或修改器的影响   state,因此特定键将始终返回相同的值。

它具有与key属性类似的效果,以及类似于"keyW"的输出,用于按下按钮W按下具有QUERTY的美式键盘 布局。如果在另一个布局(AZERTY)或其他语言(希伯来语)中按下相同的按钮或与修饰符组合 (shift),key属性会相应更改,而code属性仍具有相同的值"keyW" 更多关于此here

Chrome 49,Firefox 52,Safari 10.1和Opera 46支持code属性但不支持Internet Explorer。

另见:

  1. KeyboardEvent.charCode
  2. KeyboardEvent.keyIdentifier
  3. KeyboardEvent.keyCode
  4. KeyboardEvent.which
  5. KeyboardEvent.key
  6. key property support
  7. KeyboardEvent.code
  8. code property support

答案 4 :(得分:0)

如果无论您按哪个键都得到0,请尝试使用charCode代替keyCode

发生这种情况是因为您正在调用使用whichcharCode的KeyboardEvent对象,而不是使用keyCode返回键盘Unicode值的Event对象。有关更多信息,请参阅MDN Web文档以获取有关KeyboardEvent的更多信息: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent