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;
|