1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- var Emitter = require('./Emitter');
- var keyCode = require('./keyCode');
- var each = require('./each');
- var unique = require('./unique');
- var trim = require('./trim');
- var map = require('./map');
- var isFn = require('./isFn');
- exports = {
- on: function(keys, options, listener) {
- if (isFn(options)) {
- listener = options;
- options = {};
- }
- keys = keys.split(regComma);
- each(keys, function(key) {
- key = normalizeKey(key);
- if (options.element) {
- var _options = options,
- element = _options.element;
- var hotkeyListeners = element._hotkeyListeners || {};
- element._hotkeyListeners = hotkeyListeners;
- hotkeyListeners[key] = hotkeyListeners[key] || [];
- var hotkeyListener = function(e) {
- if (key === getKeysFromEvent(e)) {
- listener(e);
- }
- };
- hotkeyListeners[key].push({
- listener: hotkeyListener,
- origin: listener
- });
- element.addEventListener('keydown', hotkeyListener);
- } else {
- emitter.on(key, listener);
- }
- });
- },
- off: function(keys, options, listener) {
- if (isFn(options)) {
- listener = options;
- options = {};
- }
- keys = keys.split(regComma);
- each(keys, function(key) {
- key = normalizeKey(key);
- if (options.element) {
- var _options2 = options,
- element = _options2.element;
- var hotkeyListeners = element._hotkeyListeners;
- if (hotkeyListeners && hotkeyListeners[key]) {
- var listeners = hotkeyListeners[key];
- var hotkeyListener;
- for (var i = 0, len = listeners.length; i < len; i++) {
- if (listeners[i].origin === listener) {
- hotkeyListener = listeners[i].listener;
- listeners.splice(i, 1);
- }
- }
- if (hotkeyListener) {
- element.removeEventListener('keydown', hotkeyListener);
- }
- }
- } else {
- emitter.off(key, listener);
- }
- });
- }
- };
- var emitter = new Emitter();
- document.addEventListener('keydown', function(e) {
- emitter.emit(getKeysFromEvent(e), e);
- });
- function getKeysFromEvent(e) {
- var keys = [];
- if (e.ctrlKey) keys.push('ctrl');
- if (e.shiftKey) keys.push('shift');
- keys.push(keyCode(e.keyCode));
- return normalizeKey(keys.join('+'));
- }
- function normalizeKey(keyStr) {
- var keys = keyStr.split(regPlus);
- keys = map(keys, function(key) {
- return trim(key);
- });
- keys = unique(keys);
- keys.sort();
- return keys.join('+');
- }
- var regComma = /,/g;
- var regPlus = /\+/g;
- module.exports = exports;
|