Обработка событий нажатия клавиш (F1-F12) с использованием JavaScript и jQuery, кросс-браузер
Я хочу обрабатывать ключи F1-F12 с помощью JavaScript и jQuery.
Я не уверен, какие ошибки приходится избегать, и я не могу тестировать реализации в других браузерах, кроме Internet Explorer 8, Google Chrome и Mozilla FireFox 3.
Любые предложения для полного кросс-браузерного решения? Что-то вроде хорошо протестированной библиотеки jQuery или, возможно, просто ванильного jQuery/JavaScript?
Ответы
Ответ 1
Лучший источник, который у меня есть для этого вопроса, - это страница: http://www.quirksmode.org/js/keys.html
То, что они говорят, заключается в том, что коды клавиш нечетны в Safari и согласованы везде (кроме того, что в IE нет события нажатия клавиш, но я считаю, что работа по работе с ключами).
Ответ 2
Я согласен с Уильямом, что в целом плохой идеей является захват функциональных клавиш. Тем не менее, я нашел библиотеку shortcut, которая добавляет эту функциональность, а также другие сочетания клавиш и комбинацию очень легко.
Одно нажатие клавиши:
shortcut.add("F1", function() {
alert("F1 pressed");
});
Сочетание нажатий клавиш:
shortcut.add("Ctrl+Shift+A", function() {
alert("Ctrl Shift A pressed");
});
Ответ 3
Я не уверен, что возможно перехват функциональных клавиш, но я бы не стал использовать функциональные клавиши вместе. Функциональные клавиши используются браузерами для выполнения множества задач, некоторые из них довольно распространены. Например, в Firefox на Linux не менее шести или семи функциональных клавиш зарезервированы для использования браузером:
- F1 (Справка),
- F3 (поиск),
- F5 (Обновить),
- F6 (адресная строка фокуса),
- F7 (режим просмотра в режиме просмотра),
- F11 (полноэкранный режим) и
- F12 (используется несколькими надстройками, включая Firebug)
Хуже всего то, что разные браузеры в разных операционных системах используют разные ключи для разных вещей. Это много различий. Вы должны придерживаться более безопасных, менее часто используемых комбинаций клавиш.
Ответ 4
Без другого внешнего класса вы можете создать свой персональный взломанный код, просто используя
event.keyCode
Еще одна помощь для всех, я думаю, это тестовая страница для перехвата keyCode (просто скопируйте и прошйте в новом файле .html для тестирования вашего события).
<html>
<head>
<title>Untitled</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<style type="text/css">
td,th{border:2px solid #aaa;}
</style>
<script type="text/javascript">
var t_cel,tc_ln;
if(document.addEventListener){ //code for Moz
document.addEventListener("keydown",keyCapt,false);
document.addEventListener("keyup",keyCapt,false);
document.addEventListener("keypress",keyCapt,false);
}else{
document.attachEvent("onkeydown",keyCapt); //code for IE
document.attachEvent("onkeyup",keyCapt);
document.attachEvent("onkeypress",keyCapt);
}
function keyCapt(e){
if(typeof window.event!="undefined"){
e=window.event;//code for IE
}
if(e.type=="keydown"){
t_cel[0].innerHTML=e.keyCode;
t_cel[3].innerHTML=e.charCode;
}else if(e.type=="keyup"){
t_cel[1].innerHTML=e.keyCode;
t_cel[4].innerHTML=e.charCode;
}else if(e.type=="keypress"){
t_cel[2].innerHTML=e.keyCode;
t_cel[5].innerHTML=e.charCode;
}
}
window.onload=function(){
t_cel=document.getElementById("tblOne").getElementsByTagName("td");
tc_ln=t_cel.length;
}
</script>
</head>
<body>
<table id="tblOne">
<tr>
<th style="border:none;"></th><th>onkeydown</th><th>onkeyup</th><th>onkeypress</td>
</tr>
<tr>
<th>keyCode</th><td> </td><td> </td><td> </td>
</tr>
<tr>
<th>charCode</th><td> </td><td> </td><td> </td>
</tr>
</table>
<button onclick="for(i=0;i<tc_ln;i++){t_cel[i].innerHTML=' '};">CLEAR</button>
</body>
</html>
Вот рабочая демонстрация, поэтому вы можете попробовать ее прямо здесь:
var t_cel, tc_ln;
if (document.addEventListener) { //code for Moz
document.addEventListener("keydown", keyCapt, false);
document.addEventListener("keyup", keyCapt, false);
document.addEventListener("keypress", keyCapt, false);
} else {
document.attachEvent("onkeydown", keyCapt); //code for IE
document.attachEvent("onkeyup", keyCapt);
document.attachEvent("onkeypress", keyCapt);
}
function keyCapt(e) {
if (typeof window.event != "undefined") {
e = window.event; //code for IE
}
if (e.type == "keydown") {
t_cel[0].innerHTML = e.keyCode;
t_cel[3].innerHTML = e.charCode;
} else if (e.type == "keyup") {
t_cel[1].innerHTML = e.keyCode;
t_cel[4].innerHTML = e.charCode;
} else if (e.type == "keypress") {
t_cel[2].innerHTML = e.keyCode;
t_cel[5].innerHTML = e.charCode;
}
}
window.onload = function() {
t_cel = document.getElementById("tblOne").getElementsByTagName("td");
tc_ln = t_cel.length;
}
td,
th {
border: 2px solid #aaa;
}
<html>
<head>
<title>Untitled</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<body>
<table id="tblOne">
<tr>
<th style="border:none;"></th>
<th>onkeydown</th>
<th>onkeyup</th>
<th>onkeypress</td>
</tr>
<tr>
<th>keyCode</th>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<th>charCode</th>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
<button onclick="for(i=0;i<tc_ln;i++){t_cel[i].innerHTML=' '};">CLEAR</button>
</body>
</html>
Ответ 5
Ничего себе это очень просто. я виноват, что написал это, почему никто не сделал это раньше?
$(function(){
//Yes! use keydown 'cus some keys is fired only in this trigger,
//such arrows keys
$("body").keydown(function(e){
//well you need keep on mind that your browser use some keys
//to call some function, so we'll prevent this
e.preventDefault();
//now we caught the key code, yabadabadoo!!
var keyCode = e.keyCode || e.which;
//your keyCode contains the key code, F1 to F12
//is among 112 and 123. Just it.
console.log(keyCode);
});
});
Ответ 6
Попробуйте это решение, если оно работает.
window.onkeypress = function(e) {
if ((e.which || e.keyCode) == 116) {
alert("fresh");
}
}
Ответ 7
Когда вы используете angular.js для обработки событий, вы должны использовать ng-keydown
для предотвращения pause in developer
в chrome.
Ответ 8
Это работает для меня.
if(code ==112) {
alert("F1 was pressed!!");
return false;
}
F2 - 113,
F3 - 114,
F4 - 115,
и поэтому форт.
Ответ 9
Одна из проблем при захвате ключей F1-F12 заключается в том, что функция по умолчанию также должна быть переопределена. Ниже приведен пример реализации F1 'Help' key с переопределением, которое предотвращает всплывающую подсказку по умолчанию. Это решение может быть расширено для ключей F2-F12. Кроме того, этот пример намеренно не захватывает комбинации клавиш, но это также может быть изменено.
<html>
<head>
<!-- Note: reference your JQuery library here -->
<script type="text/javascript" src="jquery-1.6.2.min.js"></script>
</head>
<body>
<h1>F-key trap example</h1>
<div><h2>Example: Press the 'F1' key to open help</h2></div>
<script type="text/javascript">
//uncomment to prevent on startup
//removeDefaultFunction();
/** Prevents the default function such as the help pop-up **/
function removeDefaultFunction()
{
window.onhelp = function () { return false; }
}
/** use keydown event and trap only the F-key,
but not combinations with SHIFT/CTRL/ALT **/
$(window).bind('keydown', function(e) {
//This is the F1 key code, but NOT with SHIFT/CTRL/ALT
var keyCode = e.keyCode || e.which;
if((keyCode == 112 || e.key == 'F1') &&
!(event.altKey ||event.ctrlKey || event.shiftKey || event.metaKey))
{
// prevent code starts here:
removeDefaultFunction();
e.cancelable = true;
e.stopPropagation();
e.preventDefault();
e.returnValue = false;
// Open help window here instead of alert
alert('F1 Help key opened, ' + keyCode);
}
// Add other F-keys here:
else if((keyCode == 113 || e.key == 'F2') &&
!(event.altKey ||event.ctrlKey || event.shiftKey || event.metaKey))
{
// prevent code starts here:
removeDefaultFunction();
e.cancelable = true;
e.stopPropagation();
e.preventDefault();
e.returnValue = false;
// Do something else for F2
alert('F2 key opened, ' + keyCode);
}
});
</script>
</body>
</html>
Я занимал подобное решение из связанной статьи SO при ее разработке. Сообщите мне, если бы это сработало и для вас.
Ответ 10
Решение в ES6 для современных браузеров и IE11 (с транспиляцией на ES5):
//Disable default IE help popup
window.onhelp = function() {
return false;
};
window.onkeydown = evt => {
switch (evt.keyCode) {
//ESC
case 27:
this.onEsc();
break;
//F1
case 112:
this.onF1();
break;
//Fallback to default browser behaviour
default:
return true;
}
//Returning false overrides default browser event
return false;
};
Ответ 11
Добавить ярлык:
$.Shortcuts.add({
type: 'down',
mask: 'Ctrl+A',
handler: function() {
debug('Ctrl+A');
}
});
Начать реагирование на ярлыки:
$.Shortcuts.start();
Добавьте ярлык в "другой" список:
$.Shortcuts.add({
type: 'hold',
mask: 'Shift+Up',
handler: function() {
debug('Shift+Up');
},
list: 'another'
});
Активировать "другой" список:
$.Shortcuts.start('another');
Remove a shortcut:
$.Shortcuts.remove({
type: 'hold',
mask: 'Shift+Up',
list: 'another'
});
Остановить (отключить обработчики событий):
$.Shortcuts.stop();
<Б > Учебник:
http://www.stepanreznikov.com/js-shortcuts/