【问题标题】:event.keyCode constantsevent.keyCode 常量
【发布时间】:2010-11-30 17:23:35
【问题描述】:

在 Firefox 3.5 中测试 JavaScript 时,我可以访问诸如 KeyEvent.DOM_VK_D 之类的常量,但不能在 Google Chrome 中访问。

是否有跨浏览器访问这些常量的方法?

【问题讨论】:

标签: javascript cross-browser dom-events


【解决方案1】:

如果KeyEvent object不存在,你可以定义它:

if (typeof KeyEvent == "undefined") {
    var KeyEvent = {
        DOM_VK_CANCEL: 3,
        DOM_VK_HELP: 6,
        DOM_VK_BACK_SPACE: 8,
        DOM_VK_TAB: 9,
        DOM_VK_CLEAR: 12,
        DOM_VK_RETURN: 13,
        DOM_VK_ENTER: 14,
        DOM_VK_SHIFT: 16,
        DOM_VK_CONTROL: 17,
        DOM_VK_ALT: 18,
        DOM_VK_PAUSE: 19,
        DOM_VK_CAPS_LOCK: 20,
        DOM_VK_ESCAPE: 27,
        DOM_VK_SPACE: 32,
        DOM_VK_PAGE_UP: 33,
        DOM_VK_PAGE_DOWN: 34,
        DOM_VK_END: 35,
        DOM_VK_HOME: 36,
        DOM_VK_LEFT: 37,
        DOM_VK_UP: 38,
        DOM_VK_RIGHT: 39,
        DOM_VK_DOWN: 40,
        DOM_VK_PRINTSCREEN: 44,
        DOM_VK_INSERT: 45,
        DOM_VK_DELETE: 46,
        DOM_VK_0: 48,
        DOM_VK_1: 49,
        DOM_VK_2: 50,
        DOM_VK_3: 51,
        DOM_VK_4: 52,
        DOM_VK_5: 53,
        DOM_VK_6: 54,
        DOM_VK_7: 55,
        DOM_VK_8: 56,
        DOM_VK_9: 57,
        DOM_VK_SEMICOLON: 59,
        DOM_VK_EQUALS: 61,
        DOM_VK_A: 65,
        DOM_VK_B: 66,
        DOM_VK_C: 67,
        DOM_VK_D: 68,
        DOM_VK_E: 69,
        DOM_VK_F: 70,
        DOM_VK_G: 71,
        DOM_VK_H: 72,
        DOM_VK_I: 73,
        DOM_VK_J: 74,
        DOM_VK_K: 75,
        DOM_VK_L: 76,
        DOM_VK_M: 77,
        DOM_VK_N: 78,
        DOM_VK_O: 79,
        DOM_VK_P: 80,
        DOM_VK_Q: 81,
        DOM_VK_R: 82,
        DOM_VK_S: 83,
        DOM_VK_T: 84,
        DOM_VK_U: 85,
        DOM_VK_V: 86,
        DOM_VK_W: 87,
        DOM_VK_X: 88,
        DOM_VK_Y: 89,
        DOM_VK_Z: 90,
        DOM_VK_CONTEXT_MENU: 93,
        DOM_VK_NUMPAD0: 96,
        DOM_VK_NUMPAD1: 97,
        DOM_VK_NUMPAD2: 98,
        DOM_VK_NUMPAD3: 99,
        DOM_VK_NUMPAD4: 100,
        DOM_VK_NUMPAD5: 101,
        DOM_VK_NUMPAD6: 102,
        DOM_VK_NUMPAD7: 103,
        DOM_VK_NUMPAD8: 104,
        DOM_VK_NUMPAD9: 105,
        DOM_VK_MULTIPLY: 106,
        DOM_VK_ADD: 107,
        DOM_VK_SEPARATOR: 108,
        DOM_VK_SUBTRACT: 109,
        DOM_VK_DECIMAL: 110,
        DOM_VK_DIVIDE: 111,
        DOM_VK_F1: 112,
        DOM_VK_F2: 113,
        DOM_VK_F3: 114,
        DOM_VK_F4: 115,
        DOM_VK_F5: 116,
        DOM_VK_F6: 117,
        DOM_VK_F7: 118,
        DOM_VK_F8: 119,
        DOM_VK_F9: 120,
        DOM_VK_F10: 121,
        DOM_VK_F11: 122,
        DOM_VK_F12: 123,
        DOM_VK_F13: 124,
        DOM_VK_F14: 125,
        DOM_VK_F15: 126,
        DOM_VK_F16: 127,
        DOM_VK_F17: 128,
        DOM_VK_F18: 129,
        DOM_VK_F19: 130,
        DOM_VK_F20: 131,
        DOM_VK_F21: 132,
        DOM_VK_F22: 133,
        DOM_VK_F23: 134,
        DOM_VK_F24: 135,
        DOM_VK_NUM_LOCK: 144,
        DOM_VK_SCROLL_LOCK: 145,
        DOM_VK_COMMA: 188,
        DOM_VK_PERIOD: 190,
        DOM_VK_SLASH: 191,
        DOM_VK_BACK_QUOTE: 192,
        DOM_VK_OPEN_BRACKET: 219,
        DOM_VK_BACK_SLASH: 220,
        DOM_VK_CLOSE_BRACKET: 221,
        DOM_VK_QUOTE: 222,
        DOM_VK_META: 224
    };
}

另见KeyEvent in DOM Level 3。

【讨论】:

  • 那么 Firefox 的 KeyEvent 中的常量是否有望在未来成为标准?
  • 如果KeyEvent 不存在,将抛出 ReferenceError。请改用typeof。
  • @Liam 当然。当 KeyEvent 未声明时,将抛出 ReferenceError。检查 typeof 避免它 - if (typeof KeyEvent == 'undefined')
  • 我发现这很有用,但是链接 KeyEvent in DOM Level 3 有什么关系呢?同意,我找不到任何其他明确的列表,但它与准确的列表不匹配(它说 ENTER 是 0x0c, 12,这不是当前浏览器报告的内容)。至少添加一个注释?
【解决方案2】:

Web 浏览器中键盘输入的标准化过程仅在过去 15 年左右一直在进行。原来这不是一个简单的问题。

在2010 中,W3C 在工作草案中将 KeyEvent 接口替换为 KeyboardEvent。 DOM_VK_ 键码列表没有看到进一步的标准化工作,也不太可能保持一致:一些键码在平台之间不同,甚至在同一平台上的浏览器之间也不同。 KeyboardEvent 接口试图为按键事件带来一些一致性。

但是,在撰写此评论时,browser compatibility for KeyboardEvent could be described as a disaster zone。很少有浏览器支持KeyboardEvent.key,但希望将来会变得更加一致。它是描述键的字符串,而不是数值。建议值列表是W3C Working Draft。

我找到了一个shim for KeyboardEvent.key,但它目前显然不是最新的规范。

这个故事仍有可能有一个美好的结局。

【讨论】:

    【解决方案3】:

    您也可以使用轻量级 npm 包keycode-js。这包含所有这些键码常量的列表,并且易于使用。

    这是你的使用方法,https://github.com/kabirbaidhya/keycode-js#usage

    // You may use either the numeric code value or the code to identity the key.
    console.log("Return key code:", KeyCode.KEY_RETURN);
    console.log("Return key name:", KeyCode.CODE_RETURN);
    console.log("Return key value:", KeyCode.VALUE_RETURN);
    
    // Use it in the event handler
    window.addEventListener('keyup', function(e) {
      // You may do one of these checks.
    
      // Check the code value.
      if (e.code === KeyCode.CODE_RETURN) {
        console.log('It was the Return key.');
        return;
      }
    
      // OR, check the keyCode value.
      if (e.keyCode === KeyCode.KEY_RETURN) {
        console.log('It was the Return key.');
        return;
      }
    
      // OR, check the key value.
      if (e.key === KeyCode.VALUE_RETURN) {
        console.log('It was the Return key.');
        return;
      }
    
      console.log('It was any other key.');
    });
    <script src="https://unpkg.com/keycode-js@3.1.0/dist/keycode.min.js"></script>

    这是supported constants 的列表。此列表基于MDN中列出的关键事件代码的官方列表。

    这个包无非就是这样的关键代码列表:

    exports.KEY_CANCEL = 3;
    exports.KEY_HELP = 6;
    exports.KEY_BACK_SPACE = 8;
    exports.KEY_TAB = 9;
    exports.KEY_CLEAR = 12;
    exports.KEY_RETURN = 13;
    exports.KEY_ENTER = 14;
    exports.KEY_SHIFT = 16;
    exports.KEY_CONTROL = 17;
    exports.KEY_ALT = 18;
    exports.KEY_PAUSE = 19;
    exports.KEY_CAPS_LOCK = 20;
    exports.KEY_ESCAPE = 27;
    exports.KEY_SPACE = 32;
    exports.KEY_PAGE_UP = 33;
    exports.KEY_PAGE_DOWN = 34;
    exports.KEY_END = 35;
    exports.KEY_HOME = 36;
    exports.KEY_LEFT = 37;
    exports.KEY_UP = 38;
    exports.KEY_RIGHT = 39;
    exports.KEY_DOWN = 40;
    exports.KEY_PRINTSCREEN = 44;
    exports.KEY_INSERT = 45;
    exports.KEY_DELETE = 46;
    exports.KEY_0 = 48;
    exports.KEY_1 = 49;
    exports.KEY_2 = 50;
    exports.KEY_3 = 51;
    exports.KEY_4 = 52;
    exports.KEY_5 = 53;
    exports.KEY_6 = 54;
    exports.KEY_7 = 55;
    exports.KEY_8 = 56;
    exports.KEY_9 = 57;
    exports.KEY_SEMICOLON = 59;
    exports.KEY_EQUALS = 61;
    exports.KEY_A = 65;
    exports.KEY_B = 66;
    exports.KEY_C = 67;
    exports.KEY_D = 68;
    exports.KEY_E = 69;
    exports.KEY_F = 70;
    exports.KEY_G = 71;
    exports.KEY_H = 72;
    exports.KEY_I = 73;
    exports.KEY_J = 74;
    exports.KEY_K = 75;
    exports.KEY_L = 76;
    exports.KEY_M = 77;
    exports.KEY_N = 78;
    exports.KEY_O = 79;
    exports.KEY_P = 80;
    exports.KEY_Q = 81;
    exports.KEY_R = 82;
    exports.KEY_S = 83;
    exports.KEY_T = 84;
    exports.KEY_U = 85;
    exports.KEY_V = 86;
    exports.KEY_W = 87;
    exports.KEY_X = 88;
    exports.KEY_Y = 89;
    exports.KEY_Z = 90;
    exports.KEY_CONTEXT_MENU = 93;
    exports.KEY_NUMPAD0 = 96;
    exports.KEY_NUMPAD1 = 97;
    exports.KEY_NUMPAD2 = 98;
    exports.KEY_NUMPAD3 = 99;
    exports.KEY_NUMPAD4 = 100;
    exports.KEY_NUMPAD5 = 101;
    exports.KEY_NUMPAD6 = 102;
    exports.KEY_NUMPAD7 = 103;
    exports.KEY_NUMPAD8 = 104;
    exports.KEY_NUMPAD9 = 105;
    exports.KEY_MULTIPLY = 106;
    exports.KEY_ADD = 107;
    exports.KEY_SEPARATOR = 108;
    exports.KEY_SUBTRACT = 109;
    exports.KEY_DECIMAL = 110;
    exports.KEY_DIVIDE = 111;
    exports.KEY_F1 = 112;
    exports.KEY_F2 = 113;
    exports.KEY_F3 = 114;
    exports.KEY_F4 = 115;
    exports.KEY_F5 = 116;
    exports.KEY_F6 = 117;
    exports.KEY_F7 = 118;
    exports.KEY_F8 = 119;
    exports.KEY_F9 = 120;
    exports.KEY_F10 = 121;
    exports.KEY_F11 = 122;
    exports.KEY_F12 = 123;
    exports.KEY_F13 = 124;
    exports.KEY_F14 = 125;
    exports.KEY_F15 = 126;
    exports.KEY_F16 = 127;
    exports.KEY_F17 = 128;
    exports.KEY_F18 = 129;
    exports.KEY_F19 = 130;
    exports.KEY_F20 = 131;
    exports.KEY_F21 = 132;
    exports.KEY_F22 = 133;
    exports.KEY_F23 = 134;
    exports.KEY_F24 = 135;
    exports.KEY_NUM_LOCK = 144;
    exports.KEY_SCROLL_LOCK = 145;
    exports.KEY_COMMA = 188;
    exports.KEY_PERIOD = 190;
    exports.KEY_SLASH = 191;
    exports.KEY_BACK_QUOTE = 192;
    exports.KEY_OPEN_BRACKET = 219;
    exports.KEY_BACK_SLASH = 220;
    exports.KEY_CLOSE_BRACKET = 221;
    exports.KEY_QUOTE = 222;
    exports.KEY_META = 224;
    

    【讨论】:

      【解决方案4】:

      我使用@Gumbo 的解决方案已经有一段时间了。因为我有多个项目需要这个对象,所以我只是为它创建了一个 bower 包。如果有人已经这样做了,请告诉我......

      只需 bower install keyevent -S 并将 bower_components/src/keyevent.js 包含在您的构建过程中。

      注意:这个库是愚蠢的,如果 KeyEvent 实例已经存在,这可能会破坏它。

      GitHub 仓库:https://github.com/cybertoothca/keyevent

      bower info keyevent 获取项目信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        相关资源
        最近更新 更多