Shift 是唯一可以改变 keyCode 值的键吗?

Is Shift the only key that can change the value of keyCode?

我正在编写一些 javascript 来处理键盘输入。在我的代码中,我假设 keyCode for keyPress event != keyCode for keyDown event 当且仅当按住 shift 键时。

这是一个正确的假设吗?或者是否有其他键满足此条件?具体来说,我担心其他键盘布局,例如 AZERTY 和 QWERTZ。

假设是错误的。你看,只要你按下一个键,就会触发 keydown 事件。 keypress 事件仅在所述键输出可打印字符时触发。

也就是说,按 az 之间的一个键,例如 "a" 将生成:

  1. keydown 密钥代码为 65 (A)
  2. keypress 密钥代码 97 (a)

所以一般情况下它们是不相等的。而按 "SHIFT + a" 将生成:

  1. keydown keyCode 16 (Shift)
  2. keydown 密钥代码为 65 (A)
  3. keypress 密钥代码 65 (A)

因此当按下 shift 键时它们是相等的。

对于数字键,行为是相反的。按“1”将生成

  1. keydown 密钥代码为 49 (1)
  2. keypress 密钥代码 49 (1)

因此它们在不按 Shift 键的情况下是相等的,而按 "SHIFT+1" 将生成:

  1. keydown keyCode 16 (Shift)
  2. keydown 密钥代码为 49 (1)
  3. keypress 密钥代码为 33 (!)

因此当按下 Shift 键时它们不相等。

启用大写锁定,默认情况下会将字母设置为大写,因此 keydownkeypress 的 keyCodes 将相等。 CAPS LOCK 不会影响数字键,因此它们对于 keydownkeypress.

的键码仍然相同

其他事件修饰符(例如 CTRL、ALT 以及它们与 SHIFT 的组合)不会生成可打印字符,因此虽然会触发 keydown 事件,但不会触发 keypress 事件火.

我做了一个小jsFiddle example来比较事件。当 keypress 和 keydown 被同时触发时,我添加了一些额外的逻辑来配对事件。