Решение:
var activeKeys = [];
//determine operating system
var os = false;
window.addEventListener('load', function() {
var userAgent = navigator.appVersion;
if (userAgent.indexOf("Win") != -1) os = "windows";
if (userAgent.indexOf("Mac") != -1) os = "osx";
if (userAgent.indexOf("X11") != -1) os = "unix";
if (userAgent.indexOf("Linux") != -1) os = "linux";
});
window.addEventListener('keydown', function(e) {
if (activeKeys.indexOf(e.which) == -1) {
activeKeys.push(e.which);
}
if (os == 'osx') {
} else {
//use indexOf function to check for keys being pressed IE
if (activeKeys.indexOf(17) != -1 && activeKeys.indexOf(86) != -1) {
console.log('you are trying to paste with control+v keys');
}
/*
the control and v keys (for paste)
if(activeKeys.indexOf(17) != -1 && activeKeys.indexOf(86) != -1){
command and v keys are being pressed
}
*/
}
});
window.addEventListener('keyup', function(e) {
var result = activeKeys.indexOf(e.which);
if (result != -1) {
activeKeys.splice(result, 1);
}
});
Объяснение: Я столкнулся с этой проблемой и придумал свое решение. e.metaKey
, похоже, не работает с событием keyup в Chrome и Safari. Тем не менее, я не уверен, что это было специфично для моего приложения, поскольку у меня были другие алгоритмы, блокирующие некоторые ключевые события, и я, возможно, ошибочно заблокировал мета-ключ.
Этот алгоритм отслеживает, что клавиши идут вниз, а затем добавляет их к списку ключей, которые в настоящее время нажаты. При выпуске ключ удаляется из списка. Проверьте наличие одновременных клавиш в списке, используя indexOf
, чтобы найти коды клавиш в массиве.