2010-10-10 5 views
56

J'essaye de mettre en application la fonctionnalité de clef-presse qui enlèvera un div quand l'utilisateur frappe Esc. Cela fonctionne pour Firefox & IE avec le code suivant:La touche 'keypress' de jQuery ne fonctionne pas avec certaines touches de Chrome. Comment travailler?

$("body").keypress(function(e) { 
    alert("any key pressed"); 
    if (e.keyCode == 27) { 
     alert("escape pressed"); 
    } 
}); 

Si je frappe une touche, apparaît la première alert, et si je frappe échapper, est également affiché la deuxième alert.

Cela ne fonctionne pas avec Chrome. Le premier alert est toujours affiché si j'appuie sur l'une des touches alphabétiques, mais pas lorsque j'appuie sur Échap, Tab, Espace ou n'importe lequel des chiffres.

Pourquoi cela serait-il? Existe-t-il un moyen de faire en sorte que Chrome réponde à ces pressions sur les touches?

+0

Ceci est un [bug connu] (https://bugs.chromium.org/p/chromium/issues/detail?id=9061) de Chrome. En mai 2016, un développeur a déclaré qu'il pensait que son comportement correspondait mieux à la spécification et qu'il ne le résoudrait pas (https://bugs.chromium.org/p/chromium/issues/detail?id=9061#c15). – Sheepy

Répondre

108

Essayez de traiter keydown à la place.

+4

vous m'a sauvé l'enfer beaucoup de temps ..merci SLaks – bragboy

+17

L'astuce à cette réponse, que je pense est très important de noter, est que "try handling' keydown' "n'est pas une solution polyvalente, mais spécifique à" certaines clés ". Vous avez toujours besoin de 'keypress' pour gérer correctement les caractères ascii. Donc c'est vraiment un processus en plusieurs étapes (embrouillé). – Kato

+0

Bonne réponse. J'ai eu exactement le même problème et cela a pris soin d'elle. –

16

utilisez keydown. Les touches ne fonctionnent pas avec ESC dans Chrome (vous n'êtes pas sûr des autres navigateurs).

$(newTag).keydown(function(e) { //keypress did not work with ESC; 
    if (event.which == '13') { 
     ProfilePage.saveNewTag(search_id, $(newTag).val()); 
    } 
    else if (window.event.which){ 
     $(newTag).remove(); 
    } 
}); 
+1

Merci d'avoir mentionné le bug Chrome. Il sera utile à ceux qui se demandent pourquoi keypress travaille réellement pour eux dans d'autres navigateurs. – Gustus

1

Après la deuxième alerte ajouter également

e.preventDefault(); 

Cela permettra d'éviter l'action par défaut de l'événement à déclencher.

En savoir plus sur cette méthode here

Votre code devrait ressembler à

$("body").keypress(function(e) { 
    alert("any key pressed"); 
    if (e.keyCode == 27) { 
     alert("escape pressed"); 
     e.preventDefault(); 
}}); 
2

Pour la touche ESC:

$(document).keydown(function(e) { 
    if(e.keyCode == 27) { /* Run code */ } 
} 

Pour les clés de lettre, comme 'L':

$(document).keypress(function(e) { 
    if(e.which == 108) { } 
}); 

fonctionne dans les deux Chrome et Firefox

0

Utilisation du fichier de Jquery.hotkey vous pouvez faire Sortcut clé

$(document).bind('keydown', 'esc', function(){ }); 
+0

Bien que ce fragment de code puisse résoudre la question, [y compris une explication] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) aide vraiment à améliorer la qualité de votre message. Rappelez-vous que vous répondez à la question pour les lecteurs dans le futur, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. – DimaSan

0

keypress 'ESC'

e.which: 0 
e.keyCode: 27 

keyup 'ESC'

e.which: 27 
e.keyCode: 27 

Pour les caractères non imprimables, mieux utiliser keyup.

Questions connexes