Ярлыки браузера захвата JavaScript (Ctrl+ T / N / W)

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

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

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

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

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

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

5 ответов

Решение

Захват событий клавиатуры 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(); 
  }
});

Fire Fox

(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 Shift N

  • Ctrl T

  • Ctrl Shift T

  • Ctrl W

  • Ctrl Shift W

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


IE7 / 8

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


IE9

(проверено)

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


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

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

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

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

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

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

[Shift]Ctrl(Q|N|W|T|Tab ↹)

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

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

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

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

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

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

Обновить:

Вот краткий пример. В основном все браузеры будут отображать предупреждение при нажатии Ctrl+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, ничего не произойдет. Вы можете попробовать это http://jsfiddle.net/wHhEL/.

Другие вопросы по тегам