This commit is contained in:
92
node_modules/licia/hotkey.js
generated
vendored
Normal file
92
node_modules/licia/hotkey.js
generated
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user