Je veux gérer les clés F1-F12 en utilisant JavaScript et jQuery.
Je ne suis pas sûr des pièges à éviter et je ne suis pas en mesure de tester les implémentations dans des navigateurs autres qu'Internet Explorer 8, Google Chrome et Mozilla FireFox 3.
Des suggestions pour une solution complète multi-navigateur? Quelque chose comme une bibliothèque jQuery bien testée ou peut-être juste Vanilla jQuery/JavaScript?
La meilleure source que j'ai pour ce genre de question est cette page: http://www.quirksmode.org/js/keys.html
Ce qu'ils disent, c'est que les codes de clé sont étranges sur Safari et cohérents partout ailleurs (sauf qu'il n'y a pas d'événement de frappe sur IE, mais je crois que les raccourcis clavier fonctionnent).
Je suis d'accord avec William pour dire qu'en général, détourner les touches de fonction est une mauvaise idée. Cela dit, j’ai trouvé le raccourci - qui ajoute cette fonctionnalité, ainsi que d’autres raccourcis clavier et combinaisons, de manière très simple.
Une seule frappe:
shortcut.add("F1", function() {
alert("F1 pressed");
});
Combinaison de frappes:
shortcut.add("Ctrl+Shift+A", function() {
alert("Ctrl Shift A pressed");
});
Je ne sais pas si l'interception de touches de fonction est possible, mais je ne voudrais pas utiliser toutes les touches de fonction ensemble. Les navigateurs utilisent les touches de fonction pour effectuer diverses tâches, dont certaines sont assez courantes. Par exemple, dans Firefox sous Linux, au moins six ou sept des touches de fonction sont réservées au navigateur:
Le pire, c’est que différents navigateurs, sur différents systèmes d’exploitation, utilisent différentes clés pour différentes choses. C'est beaucoup de différences à prendre en compte. Vous devez vous en tenir à des combinaisons de touches plus sûres et moins utilisées.
Sans autre classe externe, vous pouvez créer votre code de piratage personnel simplement en utilisant
event.keyCode
Une autre aide pour tous, je pense, est cette page de test pour intercepter le code clé (il suffit de copier et coller dans le nouveau fichier.html pour tester votre événement).
<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>
Voici une démo en marche que vous pouvez essayer ici:
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>
Wow c'est très simple. Je suis blâmé pour écrire ceci, pourquoi personne ne le fait avant?
$(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);
});
});
Solution dans ES6 pour navigateurs modernes et IE11 (avec transpilation à 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;
};
Cela fonctionne pour moi.
if(code ==112) {
alert("F1 was pressed!!");
return false;
}
F2 - 113, F3 - 114, F4 - 115,
L'un des problèmes liés à l'interception des touches F1-F12 est que la fonction par défaut doit également être remplacée. Voici un exemple d'implémentation de la touche F1 'Aide', avec le remplacement qui empêche l'affichage de l'aide par défaut. Cette solution peut être étendue aux touches F2 à F12. De plus, cet exemple ne capture pas à dessein les combinaisons de touches, mais cela peut également être modifié.
<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>
J'ai emprunté un solution similaire à un article connexe SO en développant ceci. Faites-moi savoir si cela a fonctionné pour vous aussi.
Essayez cette solution si cela fonctionne.
window.onkeypress = function(e) {
if ((e.which || e.keyCode) == 116) {
alert("fresh");
}
}
Lorsque vous utilisez angular.js pour gérer les événements, vous devez utiliser ng-keydown
pour empêcher pause in developer
en chrome.
Vous pouvez le faire avec jQuery comme ceci:
$("#elemenId").keydown(function (e) {
if(e.key == "F12"){
console.log(e.key);
}
});