hotkey.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. var Emitter = require('./Emitter');
  2. var keyCode = require('./keyCode');
  3. var each = require('./each');
  4. var unique = require('./unique');
  5. var trim = require('./trim');
  6. var map = require('./map');
  7. var isFn = require('./isFn');
  8. exports = {
  9. on: function(keys, options, listener) {
  10. if (isFn(options)) {
  11. listener = options;
  12. options = {};
  13. }
  14. keys = keys.split(regComma);
  15. each(keys, function(key) {
  16. key = normalizeKey(key);
  17. if (options.element) {
  18. var _options = options,
  19. element = _options.element;
  20. var hotkeyListeners = element._hotkeyListeners || {};
  21. element._hotkeyListeners = hotkeyListeners;
  22. hotkeyListeners[key] = hotkeyListeners[key] || [];
  23. var hotkeyListener = function(e) {
  24. if (key === getKeysFromEvent(e)) {
  25. listener(e);
  26. }
  27. };
  28. hotkeyListeners[key].push({
  29. listener: hotkeyListener,
  30. origin: listener
  31. });
  32. element.addEventListener('keydown', hotkeyListener);
  33. } else {
  34. emitter.on(key, listener);
  35. }
  36. });
  37. },
  38. off: function(keys, options, listener) {
  39. if (isFn(options)) {
  40. listener = options;
  41. options = {};
  42. }
  43. keys = keys.split(regComma);
  44. each(keys, function(key) {
  45. key = normalizeKey(key);
  46. if (options.element) {
  47. var _options2 = options,
  48. element = _options2.element;
  49. var hotkeyListeners = element._hotkeyListeners;
  50. if (hotkeyListeners && hotkeyListeners[key]) {
  51. var listeners = hotkeyListeners[key];
  52. var hotkeyListener;
  53. for (var i = 0, len = listeners.length; i < len; i++) {
  54. if (listeners[i].origin === listener) {
  55. hotkeyListener = listeners[i].listener;
  56. listeners.splice(i, 1);
  57. }
  58. }
  59. if (hotkeyListener) {
  60. element.removeEventListener('keydown', hotkeyListener);
  61. }
  62. }
  63. } else {
  64. emitter.off(key, listener);
  65. }
  66. });
  67. }
  68. };
  69. var emitter = new Emitter();
  70. document.addEventListener('keydown', function(e) {
  71. emitter.emit(getKeysFromEvent(e), e);
  72. });
  73. function getKeysFromEvent(e) {
  74. var keys = [];
  75. if (e.ctrlKey) keys.push('ctrl');
  76. if (e.shiftKey) keys.push('shift');
  77. keys.push(keyCode(e.keyCode));
  78. return normalizeKey(keys.join('+'));
  79. }
  80. function normalizeKey(keyStr) {
  81. var keys = keyStr.split(regPlus);
  82. keys = map(keys, function(key) {
  83. return trim(key);
  84. });
  85. keys = unique(keys);
  86. keys.sort();
  87. return keys.join('+');
  88. }
  89. var regComma = /,/g;
  90. var regPlus = /\+/g;
  91. module.exports = exports;