EASYAIuniappNewUI/node_modules/licia/hotkey.js
2025-02-08 18:50:38 +08:00

93 lines
3.0 KiB
JavaScript

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;