JavaScript: конфликт двойной и тройной комбинации клавиш

335
07 июня 2017, 05:35

В этом эксперименте исследуется конфликт двойной и тройной комбинации клавиш (например alt+t и alt+shift+t). По замыслу, при нажатии alt+t должен измениться цвет левого квадрата, а при нажатии alt+shift+t - правого. Однако конбинация alt+t препятствует срабатыванию alt+shift+t, даже при корректной последовательности нажатия клавиш:

(В снипетте почему-то вообще ничего не работает, но в JSFiddle - заработает после клика мышью на поле результата. Это потому, что используются плавающие фреймы)

let $leftRect =  $('.rec1'); 
let $rightRect =  $('.rec2'); 
 
$leftBtn.on('mousedown', function(){ 
    $leftRect.css('background', 'DarkCyan'); 
}); 
 
$leftBtn.on('mouseup', function(){ 
    $leftRect.css('background', '#ff6666'); 
}); 
 
 
document.onkeydown = function(e){ 
    if (e.altKey && e.keyCode === 84) { // T     
        $leftRect.css('background', 'DarkCyan'); 
    } 
    else if (e.altKey && e.shiftKey && e.keyCode === 84) { // T     
        $rightRect.css('background', 'DarkCyan'); 
    } 
};
.rec1{ 
    display: inline-block; 
    width: 100px; 
    height: 100px; 
    background:#ff6666; 
} 
 
.rec2{ 
    display: inline-block; 
    width: 100px; 
    height: 100px; 
    background:#ff6666; 
}
<div class="rec1"></div> 
<div class="rec2"></div>

Как убрать этот конфликт?

Решение "поменять if и else if местами" (если оно вообще работает) не подходит: предполагается, что на практике комбинации клавиш будут неоднократно переопределяться, потому никакой жесткой последовательности быть не должно.

Answer 1

У вас проблема ровно в том, что вы почему-то с порога отвергаете правильное решение.
Именно поменять местами и никак иначе. Вы должны сначала проверять тройные нажатия (в любом порядке), а потом двойные (в любом порядке). Проверка должна быть оформлена простыми блоками if (без колбасы else if).
Каждый if должен включать return после выполнения нужного кода.

document.onkeydown = function(e){
    if (e.altKey && e.shiftKey && e.keyCode === 84) { // T    
        $rightRect.css('background', 'DarkCyan');
        return; 
    }
    // еще тройные блоки...
    if (e.altKey && e.keyCode === 84) { // T    
        $leftRect.css('background', 'DarkCyan');
        return;
    }
    // еще двойные блоки...
};
READ ALSO
Вывод списка объектов яндекс.карты в таблицу

Вывод списка объектов яндекс.карты в таблицу

Использую этот скрипт от API яндекскарт

648
Ограничить range slider

Ограничить range slider

Не совсем получается ограничить движение маркера по слайдеру

277
Почему не удается выкачать сайт целиком?

Почему не удается выкачать сайт целиком?

Мне нужно выкачать этот сайт wwwrestoransmaja

326
Angular. Как отформатировать денежную сумму?

Angular. Как отформатировать денежную сумму?

Исходное число 1000(значение value[4]), на выходе должно быть $1,00000 Прошу совета

297