You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.9 KiB
103 lines
2.9 KiB
/** |
|
* Copyright 2013-2015, Facebook, Inc. |
|
* All rights reserved. |
|
* |
|
* This source code is licensed under the BSD-style license found in the |
|
* LICENSE file in the root directory of this source tree. An additional grant |
|
* of patent rights can be found in the PATENTS file in the same directory. |
|
* |
|
* @providesModule getEventKey |
|
* @typechecks static-only |
|
*/ |
|
|
|
'use strict'; |
|
|
|
var getEventCharCode = require("./getEventCharCode"); |
|
|
|
/** |
|
* Normalization of deprecated HTML5 `key` values |
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names |
|
*/ |
|
var normalizeKey = { |
|
'Esc': 'Escape', |
|
'Spacebar': ' ', |
|
'Left': 'ArrowLeft', |
|
'Up': 'ArrowUp', |
|
'Right': 'ArrowRight', |
|
'Down': 'ArrowDown', |
|
'Del': 'Delete', |
|
'Win': 'OS', |
|
'Menu': 'ContextMenu', |
|
'Apps': 'ContextMenu', |
|
'Scroll': 'ScrollLock', |
|
'MozPrintableKey': 'Unidentified' |
|
}; |
|
|
|
/** |
|
* Translation from legacy `keyCode` to HTML5 `key` |
|
* Only special keys supported, all others depend on keyboard layout or browser |
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names |
|
*/ |
|
var translateToKey = { |
|
8: 'Backspace', |
|
9: 'Tab', |
|
12: 'Clear', |
|
13: 'Enter', |
|
16: 'Shift', |
|
17: 'Control', |
|
18: 'Alt', |
|
19: 'Pause', |
|
20: 'CapsLock', |
|
27: 'Escape', |
|
32: ' ', |
|
33: 'PageUp', |
|
34: 'PageDown', |
|
35: 'End', |
|
36: 'Home', |
|
37: 'ArrowLeft', |
|
38: 'ArrowUp', |
|
39: 'ArrowRight', |
|
40: 'ArrowDown', |
|
45: 'Insert', |
|
46: 'Delete', |
|
112: 'F1', 113: 'F2', 114: 'F3', 115: 'F4', 116: 'F5', 117: 'F6', |
|
118: 'F7', 119: 'F8', 120: 'F9', 121: 'F10', 122: 'F11', 123: 'F12', |
|
144: 'NumLock', |
|
145: 'ScrollLock', |
|
224: 'Meta' |
|
}; |
|
|
|
/** |
|
* @param {object} nativeEvent Native browser event. |
|
* @return {string} Normalized `key` property. |
|
*/ |
|
function getEventKey(nativeEvent) { |
|
if (nativeEvent.key) { |
|
// Normalize inconsistent values reported by browsers due to |
|
// implementations of a working draft specification. |
|
|
|
// FireFox implements `key` but returns `MozPrintableKey` for all |
|
// printable characters (normalized to `Unidentified`), ignore it. |
|
var key = normalizeKey[nativeEvent.key] || nativeEvent.key; |
|
if (key !== 'Unidentified') { |
|
return key; |
|
} |
|
} |
|
|
|
// Browser does not implement `key`, polyfill as much of it as we can. |
|
if (nativeEvent.type === 'keypress') { |
|
var charCode = getEventCharCode(nativeEvent); |
|
|
|
// The enter-key is technically both printable and non-printable and can |
|
// thus be captured by `keypress`, no other non-printable key should. |
|
return charCode === 13 ? 'Enter' : String.fromCharCode(charCode); |
|
} |
|
if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') { |
|
// While user keyboard layout determines the actual meaning of each |
|
// `keyCode` value, almost all function keys have a universal value. |
|
return translateToKey[nativeEvent.keyCode] || 'Unidentified'; |
|
} |
|
return ''; |
|
} |
|
|
|
module.exports = getEventKey;
|
|
|