Как отключить повторное открытие последней вкладки в Microsoft Edge (Ctrl + Shift + T) с помощью JavaScript?

У нас есть веб-приложение, которое определяет набор сочетаний клавиш. Одним из них является Ctrl + Shift + T. Проблема в том, что Microsoft Edge подключается к этой комбинации клавиш, чтобы снова открыть ранее закрытую вкладку или окно, а затем переключиться на него.

Ссылка: Сочетания клавиш в Microsoft Edge.

Я немного поиграл, пытаясь обойти это с помощью JavaScript:

<!DOCTYPE html>
<html>
<head>
    <title>Ctrl + Shift + T</title>
    <script type="text/javascript">
        var tKey = 84;

        function logKeys(event) {
            console.log(event.type + ": " + event.keyCode);

            if (event.keyCode === tKey) {
                event.preventDefault();
                event.stopPropagation();
                setTimeout(function() { window.focus(); }, 200);
            }
        }

        document.documentElement.addEventListener("keydown", logKeys);
        document.documentElement.addEventListener("keypress", logKeys);
        document.documentElement.addEventListener("keyup", logKeys);
    </script>
</head>
<body>
</body>
</html>

Я надеялся отменить события клавиатуры с помощью JavaScript, чтобы Edge не открывал ранее открытую вкладку или окно. Сочетание клавиш Edge по-прежнему имеет приоритет. На самом деле консоль браузера даже не регистрирует сообщение журнала для клавиши T, обозначенной event.keyCode 84.

Может быть, мои навыки работы с JavaScript немного заржавели.

Есть ли способ запретить Edge повторно открывать предыдущую вкладку или окно при нажатии Ctrl + Shift + T с помощью JavaScript?


person Greg Burghardt    schedule 05.02.2021    source источник
comment
Что делает ваше приложение настолько важным, что пользователи не могут использовать свои браузеры?   -  person tadman    schedule 05.02.2021
comment
Это невозможно с JavaScript.   -  person Emiel Zuurbier    schedule 05.02.2021
comment
Вам нужно использовать другую комбинацию клавиш.   -  person Logan Devine    schedule 05.02.2021
comment
Это очень плохая дизайнерская идея. Вы никогда не должны пытаться изменить стандартную работу клиента. Не говоря уже о том, что любой может очень просто переопределить ваш код.   -  person Scott Marcus    schedule 05.02.2021
comment
@ScottMarcus (и другие), к сожалению, это приложение поставщика. И старый тоже. У поставщика есть обновленная версия, которая выйдет позже, но в то же время у нас есть пользователи с нарушениями зрения, полагающиеся на сочетание клавиш, которое раньше работало в Internet Explorer и средстве чтения с экрана JAWS, которое теперь не работает с Edge и JAWS. В остальном я с вами полностью согласен.   -  person Greg Burghardt    schedule 05.02.2021
comment
Не имеет значения, потому что вы не можете изменить это поведение клиента. Это нативный код.   -  person Scott Marcus    schedule 05.02.2021
comment
Я проверил и обнаружил, что некоторые специальные комбинации, такие как Ctrl+T и Ctrl+Shift+T, не могут быть заблокированы и всегда будут отправляться в браузер при использовании keyCode. Я предлагаю вам перейти на другой ключ вместо T или попробовать решение, которое предлагает Ajedi32.   -  person Yu Zhou    schedule 08.02.2021


Ответы (1)


Это возможно с помощью (в настоящее время экспериментального) API блокировки клавиатуры, который доступен в Chrome и Edge (но в настоящее время не в IE, Firefox или Safari):

Богато интерактивные веб-сайты, игры и возможности потоковой передачи удаленных рабочих столов/приложений должны обеспечивать захватывающий полноэкранный опыт. Для этого сайтам необходим доступ к специальным клавишам и сочетаниям клавиш, когда они находятся в полноэкранном режиме, чтобы их можно было использовать для навигации, меню или игровых функций. Некоторые примеры клавиш, которые могут потребоваться: Escape, Alt+Tab, Cmd+` и Ctrl+N.

По умолчанию эти ключи недоступны для веб-приложения, поскольку они захвачены браузером или базовой операционной системой. API блокировки клавиатуры позволяет веб-сайтам захватывать и использовать все доступные клавиши, разрешенные ОС.

Обратите внимание, что для удобства использования этот API работает только в том случае, если ваше приложение инициировало полноэкранный режим с помощью полноэкранного API. Вы не можете вмешиваться в стандартные сочетания клавиш браузера в противном случае:

В современных пользовательских агентах доступны два различных типа полноэкранного режима: полноэкранный режим, инициируемый JavaScript (через [Fullscreen] API) и полноэкранный режим, инициируемый пользователем (когда пользователь переходит в полноэкранный режим с помощью сочетания клавиш). Инициируемый пользователем полноэкранный режим часто называют полноэкранным режимом F11, поскольку это обычное сочетание клавиш, используемое для входа и выхода из полноэкранного режима.

Полноэкранный режим F11 и полноэкранный режим JavaScript (JS) ведут себя по-разному. Когда пользователь входит в полноэкранный режим F11, он может выйти из него только с помощью того же сочетания клавиш, которое он использовал для входа в него — функция exitFullscreen() в этом случае не будет работать. Кроме того, полноэкранные события, которые обычно запускаются для полноэкранного режима JS, не отправляются для полноэкранного режима F11.

Из-за этих различий (и из-за отсутствия стандартного сочетания клавиш F11 для полноэкранного режима) API блокировки клавиатуры действует только тогда, когда активен полноэкранный режим, инициированный JavaScript. Во время полноэкранного режима F11 блокировка клавиатуры не обрабатывается.

Таким образом, в вашем случае для захвата Ctrl+Shift+T вам потребуется войти в полноэкранный режим с помощью полноэкранного API (вы, вероятно, захотите получить сначала согласие пользователя на это; неожиданный вход в полноэкранный режим может быть плохим для пользователя), а затем заблокируйте клавишу T с помощью API блокировки клавиатуры:

document.documentElement.requestFullscreen().then(() => {
  console.log("In fullscreen.");
  navigator.keyboard.lock(["KeyT"]).then(() => {
    console.log("Ctrl+Shift+T locked");
  });
})

Дополнительная информация:

person Ajedi32    schedule 05.02.2021
comment
Это сработало отлично! По крайней мере, это дает нам возможность приспособить наших пользователей до тех пор, пока не будет установлена ​​новая версия приложения, что может произойти еще через пару лет. Я собираюсь добавить несколько дополнительных фальшивых интернет-баллов, как только смогу присудить награду. Спасибо! - person Greg Burghardt; 24.02.2021