Ярлыки браузера захвата 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 видео.
По состоянию на 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/.