2010-06-14 7 views
12

Comment puis-je annuler le keydown d'une touche spécifique du clavier, par exemple (espace, entrée et arrows) dans une page HTML. Attrapez l'événement keydown et renvoyez false.Annuler le clavier en HTML

Répondre

12

Si vous n'êtes intéressé que par les exemples clés que vous avez mentionné, l'événement keydown fera, sauf pour les anciennes versions pré-Blink de Opera (jusqu'à et y compris la version 12, au moins) où vous devrez annuler l'événement keypress. Il est beaucoup plus facile d'identifier de façon fiable les clés non imprimables dans l'événement keydown que l'événement keypress. Par conséquent, une variable doit être définie dans le gestionnaire keydown pour indiquer au gestionnaire keypress s'il faut ou non supprimer le comportement par défaut.

var cancelKeypress = false; 

document.onkeydown = function(evt) { 
    evt = evt || window.event; 
    cancelKeypress = /^(13|32|37|38|39|40)$/.test("" + evt.keyCode); 
    if (cancelKeypress) { 
     return false; 
    } 
}; 

/* For Opera */ 
document.onkeypress = function(evt) { 
    if (cancelKeypress) { 
     return false; 
    } 
}; 
+5

+1, j'ai supprimé ma réponse en faveur de celui-ci, je n'étais pas au courant des problèmes d'Opera :-) –

+0

Est-ce que Opera Quirk se tient encore ces jours-ci et les temps? Vous devez toujours annuler en appuyant sur une touche? –

+1

@RobertKoritnik: Je viens de l'essayer et ça ne s'applique pas à la dernière version d'Opera. Je suppose que cela ne s'applique pas à n'importe quelle version d'Opera basée sur Blink. –

5

Il devrait être dans les lignes de:

<script> 
document.onkeydown = function(e){ 
    var n = (window.Event) ? e.which : e.keyCode; 
    if(n==38 || n==40) return false; 
} 
</script> 

(seen here)

Les keycodes sont définies here

modifier: mettre à jour ma réponse à travailler dans IE

+1

'window.captureEvents' est obsolète et a été supprimé des versions plus récentes de Firefox, et n'a jamais pris en charge par d'autres navigateurs. Voir https://developer.mozilla.org/en/DOM/window.captureEvents. –

+0

Cela ne fonctionnera pas dans IE, dans lequel 'e' ne sera pas défini. –

+0

@andy, @tim: vrai, j'ai copié et collé à l'aveuglette. J'ai corrigé ma réponse. Bien sûr, la réponse de @ tim était la plus rapide et la plus précise – marcgg

0

jQuery a une belle KeyPress function qui vous permet de détecter une pression sur une touche, alors cela devrait être juste un cas de détection de la valeur de clé et d'exécution d'un si pour ceux que vous voulez ignorer.

modifier: par exemple:

$('#target').keypress(function(event) { 
    if (event.keyCode == '13') { 
    return false; // or event.preventDefault(); 
    } 
}); 
+0

il n'utilise apparemment pas jquery basé sur les balises qu'il a définies – marcgg

+0

Je n'ai pas de problème avec jquery à côté de ça j'utilise ASP.NET – Jack

+0

Comment puis-je le faire . ?! – Jack

0

juste retour faux. Attention, sur Opera cela ne fonctionne pas. Vous pouvez utiliser à la place onkeyup et vérifier le dernier caractère entré et y faire face. Ou mieux d'utilisation JQuery KeyPress

0

Ceci est certainement un très vieux fil. Afin de faire de la magie avec IE10 et FireFox 29.0.1 vous devez certainement le faire à l'intérieur de keypress (non keydown) fonction écouteur d'événement:

if (e.preventDefault) e.preventDefault(); 
1

Je ne développent que pour IE parce que mes travaux l'exige, donc il est mon code pour le champ numérique, pas une beauté, mais fonctionne très bien

$(document).ready(function() { 

    $("input[class='numeric-field']").keydown(function (e) { 

     if (e.shiftKey == 1) { 
      return false 
     } 

     var code = e.which; 
     var key; 

     key = String.fromCharCode(code); 

     //Keyboard numbers 
     if (code >= 48 && code <= 57) { 
      return key; 
     } //Keypad numbers 
     else if (code >= 96 && code <= 105) { 
      return key 
     } //Negative sign 
     else if (code == 189 || code == 109) { 
      var inputID = this.id; 
      var position = document.getElementById(inputID).selectionStart 
      if (position == 0) { 
       return key 
      } 
      else { 
       e.preventDefault() 
      } 
     }// Decimal point 
     else if (code == 110 || code == 190) { 
      var inputID = this.id; 
      var position = document.getElementById(inputID).selectionStart 

      if (position == 0) { 
       e.preventDefault() 
      } 
      else { 
       return key; 
      } 
     }// 37 (Left Arrow), 39 (Right Arrow), 8 (Backspace) , 46 (Delete), 36 (Home), 35 (End) 
     else if (code == 37 || code == 39 || code == 8 || code == 46 || code == 35 || code == 36) { 
      return key 
     } 
     else { 
      e.preventDefault() 
     } 
    }); 

}); 
+0

Upps, ce wast pas le blog de champ numérique, désolé –