2010-05-21 5 views
45

Comment capturer une touche, par exemple, Ctrl + Z, sans placer un élément d'entrée sur la page en JavaScript? Il semble que dans IE, les événements keypress et keyup ne peuvent être liés qu'à des éléments d'entrée (zones d'entrée, zones de texte, etc.)Appuyez sur la touche de capture sans placer un élément d'entrée sur la page?

+0

vous ne devriez pas besoin. – muhmuhten

+6

Pourquoi pas ......? –

+4

@Tim: Parce qu'il serait non conventionnel d'effectuer des actions lorsque ces touches sont enfoncées lorsqu'un élément de l'interface graphique n'est pas au point, violant ainsi le principe de la plus petite surprise. –

Répondre

31

jQuery a également une excellente mise en œuvre qui est incroyablement facile à utiliser. Voici comment vous pouvez implémenter cette fonctionnalité à travers les navigateurs:

$(document).keypress(function(e){ 
    var checkWebkitandIE=(e.which==26 ? 1 : 0); 
    var checkMoz=(e.which==122 && e.ctrlKey ? 1 : 0); 

    if (checkWebkitandIE || checkMoz) $("body").append("<p>ctrl+z detected!</p>"); 
}); 

Testés dans IE7, Firefox 3.6.3 & Chrome 4.1.249.1064

Une autre façon de faire est d'utiliser l'événement KeyDown et de suivre l'événement. code clé. Cependant, étant donné que jQuery et normalise codeTouche charCode en utilisant event.which, leur spec recommande d'utiliser event.which dans une variété de situations:

$(document).keydown(function(e){ 
if (e.keyCode==90 && e.ctrlKey) 
    $("body").append("<p>ctrl+z detected!</p>"); 
}); 
+0

ne savait pas e.qui peut capturer la frappe ainsi que le clic de la souris! Et pourriez-vous me dire comment obtenir le code 26? – powerboy

+2

keycode 26 est un identifiant spécifique pour "which" défini par un événement keypress (indique CTRL + z). Pour voir plus de mappages de caractères pour l'événement keypress, jetez un oeil à [les documents jQuery] (http://api.jquery.com/keypress/) ou [testeur d'événement clé d'unixpapa] (http://unixpapa.com/js /testkey.html) – Trafalmadorian

+0

Thx. Je sais quelle est la signification de keycode. Je veux dire, 17 est pour Ctrl, 90 est pour Z, alors comment avez-vous obtenu le numéro 26? J'ai juste googlé mais je n'ai pas trouvé la réponse. – powerboy

-3

document.onkeydown = keyDown;

document.onkeypress = keyPress;

etc.

Works pour moi dans IE

+0

Avez-vous essayé sur IE6 et essayé les touches fléchées? – powerboy

+0

Vous n'expliquez pas ce que sont 'keyDown' et' keyPress'. Cela va jeter une erreur. –

7

code & détecte ctrl + z

document.onkeyup = function(e) { 
    if(e.ctrlKey && e.keyCode == 90) { 
    // ctrl+z pressed 
    } 
} 
47

Pour les clés non imprimables telles que les touches fléchées et les touches de raccourci telles que Ctrl-z , Ctrl-x, Ctrl-c qui peut déclencher une action dans le navigateur (par exemple, à l'intérieur de documents ou d'éléments modifiables), vous risquez de ne pas avoir d'événement keypress dans tous les navigateurs. Pour cette raison, vous devez utiliser keydown à la place, si vous souhaitez supprimer l'action par défaut du navigateur. Sinon, keyup fera aussi bien.

Fixation d'un événement keydown à document œuvres dans tous les principaux navigateurs:

document.onkeydown = function(evt) { 
    evt = evt || window.event; 
    if (evt.ctrlKey && evt.keyCode == 90) { 
     alert("Ctrl-Z"); 
    } 
}; 

Pour une référence complète, je vous recommande fortement Jan Wolter's article on JavaScript key handling.

+0

Est-ce que cela fonctionne aussi sur Chrome pour Android? – hendrik

+0

@ hendrik: Je ne vois pas pourquoi il ne devrait pas, mais je ne suis pas actuellement en mesure de le tester. –

+0

Testé. Ça marche. – hendrik

6

Detect appuyer sur la touche, y compris des combinaisons de touches:

window.addEventListener('keydown', function (e) { 
    if (e.ctrlKey && e.keyCode == 90) { 
    // Ctrl + z pressed 
    } 
}); 

avantage ici est que vous êtes pas toutes les propriétés d'écraser globales, mais simplement l'introduction d'un effet secondaire. Pas bon, mais certainement beaucoup moins néfaste que d'autres suggestions ici.

0

Pour les JS modernes, utilisez event.key!

document.addEventListener("keypress", function onPress(event) { 
    if (event.key === "z" && event.ctrlKey) { 
     // Do something awesome 
    } 
}); 

Mozilla Docs

Supported Browsers

Questions connexes