ярлыки браузера захвата JavaScript (Ctrl + T / N / W) - PullRequest
63 голосов
/ 03 сентября 2011

Возможно ли запечатлеть эти ярлыки?

  • Ctrl + N
  • Ctrl + T
  • Ctrl + W

Я пробовал это, но это не работает:

$(window).keydown(function(event) {
  console.log(event.keyCode);
  event.preventDefault();
});

Когда я нажимаю T , в консоли отображается 84, но если я нажимаю Ctrl + T , он ничего не показывает и открывает новую вкладку .

Я хотел бы захватить эти ярлыки и предотвратить любые действия браузера.

Ответы [ 5 ]

97 голосов
/ 04 сентября 2011

Захват Ctrl событий клавиатуры в Javascript

Пример кода:

$(window).keydown(function(event) {
  if(event.ctrlKey && event.keyCode == 84) { 
    console.log("Hey! Ctrl+T event captured!");
    event.preventDefault(); 
  }
  if(event.ctrlKey && event.keyCode == 83) { 
    console.log("Hey! Ctrl+S event captured!");
    event.preventDefault(); 
  }
});

Firefox

(проверено 6.0.1)

В Firefox оба слушателя событий работают. Если вы нажмете Ctrl T или Ctrl S комбинаций клавиш, вы получите и сообщение на консоли, и браузер не откроет вкладку , ни попросить сохранить.

Интересно, что если вы используете alert вместо console.log, event.preventDefault() не работает и открывает новую вкладку или запрашивает сохранение. Возможно, эту ошибку нужно исправить.


Chrome3

В Chrome 3 он работает как в Firefox.


Chrome4

(проверено)

В Chrome4 определенные комбинации клавиш управления зарезервированы для браузера только для использования и больше не может быть перехвачен на стороне клиента JavaScript на веб-странице.
Эти ограничения не существовали в Chrome3 и несовместимы с обоими Firefox3 / 3.5 и IE7 / 8 (в Windows).

В Chrome 4 он работает аналогично Firefox, за исключением некоторой комбинации клавиш:

  • Ctrl N

  • Ctrl Сдвиг N

  • Ctrl T

  • Ctrl W

  • Ctrl Сдвиг W

Эти комбинации не могут быть захвачены Javascript, , но плагины для встраивания могут захватывать их. Например, если вы сфокусировались на видео на Youtube и нажали Ctrl T , браузер не откроет новую вкладку.


IE7 / 8

Работает как в Firefox или Chrome3.


IE9

(проверено)

IE9 снова стал паршой, потому что он не позволяет javascript перехватывать любое событие клавиатуры Ctrl ? . Я тестировал со многими комбинациями клавиш (R, T, P, S, N, T) и ни одна не работала. Также встроенные приложения не могут захватить событие. Протестировано с Youtube видео.


Спасибо @ Lime за замечательную ссылку .

10 голосов
/ 07 июня 2012

По состоянию на 20 марта 2012 года появилось исправление Chrome, позволяющее веб-приложениям обрабатывать Control + NWT в Chrome в событии keydown js (поэтому он работает в чистом javascript или в любой библиотеке, например jQuery).

Это исправление позволяет javascript обрабатывать комбинации клавиш, если Chrome открывается в режиме приложения, что можно сделать следующим образом:

Исправление задокументировано здесь:

8 голосов
/ 19 августа 2016

Чтобы расширить другие ответы:

Код для блокировки определенных комбинаций в Chrome / Chromium определен здесь , im summary, F11 для выхода из полноэкранного режима, и все операции с вкладками или окнами блокируются:

* +1008 * [ 1012 * Сдвиг *] * 1 014 * Ctrl ( Q * * тысяча двадцать-один | N | W | T | Tab ↹ )
2 голосов
/ 16 ноября 2013

Вместо перехвата горячей клавиши Ctrl + W , определяет, когда окно закрыто может быть допустимым параметром:

"TheСобытие beforeunload вызывается, когда окно, документ и его ресурсы должны быть выгружены.

Когда непустая строка присваивается свойству события returnValue, появляется диалоговое окно с запросом подтверждения пользователяпокинуть страницу (см. пример ниже). Если значение не указано, событие обрабатывается без вывода сообщений. "

1 голос
/ 04 сентября 2011

Ответ очень прост: это невозможно напрямую без некоторых уловок в javascript.

Это зависит от браузера.В основном все браузеры ловят эти ярлыки и используют их для собственных событий.(например, открывайте новые вкладки) Ярлык никогда не достигает движка javascript.

Что легко сделать, однако, поймать ярлыки со вспышкой.Но это далеко от удобного веб-сайта.

Обновление:

Вот краткий пример.В основном все браузеры будут отображать предупреждение при нажатии Ctrl + y .(y = 89)

document.onkeydown = keyDownEvent;
document.onkeyup = keyUpEvent;

var isCtrl = false;

function keyDownEvent() {
    var keyid = event.keyCode;

    if(keyid == 17) {
        isCtrl = true;
    }
}

function keyUpEvent() {
    var keyid = event.keyCode;

    if(keyid == 17) {
        isCtrl = false;
    }

    if(keyid == 89 && isCtrl == true) {
        alert('CTRL-Y pressed');   
    }
}

Если вы замените 84 на 89, что представляет собой t , ничего не произойдет.Вы можете попробовать это на jsfiddle.net .

...