2010-10-07 22 views
15

所以我看到一些关于不同浏览器的论坛帖子报告了不同的keyCodes,但是每个人似乎都避免了“为什么?”。Javascript:不同浏览器上的不同keyCodes?

我试图捕获冒号(:) keyCode,并意识到Firefox报告回e.keyCode 56.尽管Chrome报告回186(我认为就是这样)。

是否有一种在所有浏览器中获得正确keyCode的普通方法?

为什么他们不同,如​​果他们是相同的密钥?

我会更好奇是否有一种获得相同按键的国际化方式。

谢谢。

+0

http://www.quirksmode.org/js/keys.html – galambalazs 2010-10-07 16:17:05

+1

@galambalazs,此图表不包括冒号和分号。这让我感到惊讶。 PPK通常在这类事情之上。 – 2010-10-07 17:02:42

+0

http://unixpapa.com/js/key.html有冒号和分号,看起来非常详尽。 – ruffin 2013-01-04 14:02:17

回答

11

请参阅http://unixpapa.com/js/key.html了解为什么他们有不同的密钥。我不知道采用国际化的方式来匹配键。

+1

包含的链接的结论部分包含一些信息,可以帮助您实施通用解决方案 - 取决于您的情况。 – 2010-10-07 16:13:39

+0

你把我联系到的好文章。 – 2010-10-07 16:51:19

11

这取决于您是否对用户按下了哪个物理键或用户键入了哪个字符感兴趣。如果是后续字符,则可以在所有主要浏览器(在大多数浏览器中使用keypress事件的which属性,或者在IE < = 8中使用keyCode)使用该功能,但只能在keypress事件中使用。如果您使用密钥,请使用​​或keyup事件并检查keyCode属性,但确切的键码映射在浏览器之间确实有所不同。

对于所有JavaScript键相关事件的极好的解释和参考可以在http://unixpapa.com/js/key.html找到。

检测用户在所有主要的浏览器可靠地键入一个冒号字符,你可以做到以下几点:

document.onkeypress = function(e) { 
    e = e || window.event; 
    var charCode = (typeof e.which == "number") ? e.which : e.keyCode; 
    if (charCode && String.fromCharCode(charCode) == ":") { 
     alert("Colon!"); 
    } 
}; 
+0

charCode!= keyCode,除了/ [A-Z 0-9]/ – 2014-02-05 16:32:52

+0

@NathanBubna:我知道。然而,在旧的IE的'keypress'事件中,'keyCode'易混淆*是字符代码,而不是密钥代码,所有其他主流浏览器都支持'which',所以'keyCode'只用于旧IE。阅读http://unixpapa.com/js/key.html上的全部内容(链接到我的答案中)。 – 2014-02-05 17:40:50

+0

Ick。老IE再次袭击。感谢您的解释! – 2014-02-05 20:40:03

0

我想你应该做的JavaScript得到的键码“:”字符,所以脚本会知道在特定环境中它是什么。类似的问题已被要求here, in stackoverflow

1

这是一个老问题。现代的方法是使用event.key。请参阅MDN Key

+1

这仍然是目前的方式,考虑到Key仍然处于草稿状态,并且在大多数移动浏览器上都不支持http://caniuse.com/#feat=keyboardevent-key – 2017-03-01 16:34:13

+0

适合您的自我,这不是很遥远。值得注意的是,这款遥遥领先的手机浏览器Chrome为Android提供了全面的支持。最大的问题是iOS和Safari,但Safaris的支持将在下一个版本中提供。我会建议使用许多可用的polyfills之一。 – kidconcept 2017-03-01 18:53:33

+0

其实你可以使用它。它支持大多数使用的浏览器。 (http://caniuse.com/#feat=keyboardevent-key)如果属性未定义,您仍然可以使用小型后备功能。 – CodeBrauer 2017-06-08 14:52:32