Code JavaScript vs CharCode

le problème:

  • limite des caractères permis dans une entrée HTML à a-z A-Z seulement.
  • pour les besoins de l'entreprise cela doit être fait sur la touche de sorte que le caractère n'est tout simplement pas autorisé à apparaître même dans l'entrée.
  • Tab, entrée, flèches, backspace, shift sont tous autorisés. L'utilisateur doit pouvoir entrer et sortir librement de la zone de texte, supprimer des caractères, etc.

This est le point de départ de mon code...

var keyCode = (e.keyCode ? e.keyCode : e.which);

Cependant chaque valeur que j'obtiens dans keyCode ne correspond pas à n'importe quel des charactéristiques que j'ai vu sur le web. Par exemple le caractère "h" me donne un code de retour de 104.

est-ce que le KeyCode est différent du CharCode? Quel code contient les caractères de contrôle? Dois-je convertir?

Comment puis-je restreindre l'entrée à A-z A-Z et autoriser les clés dont j'ai besoin en JavaScript?

38
demandé sur Michał Perłakowski 2010-11-26 16:21:49

8 réponses

Les réponses à toutes vos questions sur page suivante .

...mais en résumé:

  • le seul événement à partir duquel vous pouvez obtenir de manière fiable des informations sur les caractères (par opposition aux informations sur les codes clés) est l'événement keypress .
  • dans l'événement keypress , tous les navigateurs sauf IE <= 8 stockent le code de caractère dans la propriété which de l'événement. Mais la plupart des tous ces navigateurs ne stockent pas le code de caractère dans la propriété charCode .
  • dans l'événement keypress , C'est-à-dire <= 8 stocke le code de caractère dans la propriété keyCode .

cela signifie pour obtenir le code de caractère correspondant à la pression de touche, ce qui suit fonctionnera partout, en supposant qu'un objet d'événement de pression de clé est stocké dans une variable appelée e :

var charCode = (typeof e.which == "number") ? e.which : e.keyCode

il s'agit généralement vous retourner un code de caractères où un existe et 0 autrement. Il y a quelques cas où vous obtiendrez une valeur non nulle lorsque vous ne devriez pas:

  • À l'Opéra < 10.50 pour les touches Insérer , Supprimer , Maison et Fin
  • dans les versions récentes de Konqueror pour les clés sans caractère.

La solution de contournement pour le premier problème est un peu impliqué et nécessite l'utilisation de l'événement keydown ainsi.

59
répondu Tim Down 2016-02-07 04:31:41

bon sang. KeyboardEvent.[key, char, keyCode, charCode, qui] sont tous dépréciés ou ont actuellement des bogues en suspens selon les documents de L'API de Mozilla - https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent . Même JQuery passe la responsabilité sur celui-ci et laisse l'utilisateur comprendre https://api.jquery.com/keydown / .

10
répondu nicopolyptic 2014-02-14 17:01:15

en fait, 104 est le code ASCII Pour " h " minuscule. Pour obtenir le code ASCII du caractère dactylographié onkeypress, vous pouvez juste utiliser e.which || e.keyCode , et vous n'avez pas besoin de vous soucier de clés tenues vers le bas parce que pour le texte dactylographié, keypress est auto-répété dans tous les navigateurs (selon l'excellent http://unixpapa.com/js/key.html ).

donc tout ce dont vous avez vraiment besoin est:

<input id="textbox">

<script type="text/javascript">
document.getElementById('textbox').onkeypress = function(e){
  var c = e.which || e.keyCode;
  if((c > 31 && c < 65) || (c > 90 && c < 97) || (c > 122 && c !== 127))
    return false;
};
</script>

l'Essayer: http://jsfiddle.net/wcDCJ/1 /

(les codes ASCII sont de http://en.wikipedia.org/wiki/Ascii )

5
répondu Han Seoul-Oh 2010-11-26 21:15:20

onKeyPress a des codes différents pour les lettres majuscules et minuscules. Vous constateriez probablement que le fait d'actionner le cap-lock puis de taper votre lettre vous donnerait le code que vous attendez

onKeyUp et onKeyDown ont les mêmes codes de caractères pour les lettres majuscules et minuscules. Il est recommandé d'utiliser onKeyUp car c'est le plus proche de onKeyPress

1
répondu James Long 2010-11-26 13:30:50

/* Vous n'obtiendrez pas de keyCode sur keypress pour les clés Non-impression, pourquoi ne pas les capturer sur keydown à la place? * /

function passkeycode(e){
    e= e || window.event;
    var xtrakeys={
        k8: 'Backspace', k9: 'Tab', k13: 'Enter', k16: 'Shift', k20: 'Caps Lock',
        k35: 'End', k36: 'Home', k37: 'Ar Left', k38: 'Ar Up', k39: 'Ar Right',
        k40: 'Ar Down', k45: 'Insert', k46: 'Delete'
    },
    kc= e.keyCode;
    if((kc> 64 && kc<91) || xtrakeys['k'+kc]) return true;
    else return false;
}

inputelement.onkeydown=passkeycode;

kc> 64 & & kc<91 / / a-zA-Z

xtrakeys['k'+integer]) définit les codes spéciaux autorisés

0
répondu kennebec 2010-11-26 15:02:19

voici un exemple de markup:

<form id="formID">
    <input type="text" id="filteredInput">
    <input type="text" id="anotherInput">
</form>

la logique suivante peut être utilisée pour piéger les entrées de clavier (dans ce cas, via un papier jQuery prêt à l'emploi).

il peut lire un peu goofy, mais fondamentalement, je vérifie tout ce que je veux permettre (dans votre cas, les lettres A à Z cas insensible) et ne rien faire . En d'autres termes, l'action par défaut est autorisée, mais toute entrée Autre qu'alpha est empêchée.

la navigation au clavier Standard, comme les touches fléchées, la maison, la fin, L'onglet, L'espace de retour, la suppression et ainsi de suite sont vérifiées et autorisées.

NOTE: ce code a été écrit à l'origine pour satisfaire l'entrée de l'utilisateur ne permettant que des valeurs alphanumériques (A - Z, A - z, 0 - 9), et j'ai laissé ces lignes intactes comme commentaires.

        <script>
            jQuery( document ).ready( function() {

                // keydown is used to filter input
                jQuery( "#formID input" ).keydown( function( e ) {
                    var _key = e.which
                        , _keyCode = e.keyCode
                        , _shifted = e.shiftKey
                        , _altKey = e.altKey
                        , _controlKey = e.ctrlKey
                    ;
                    //console.log( _key + ' ' + _keyCode + ' ' + _shifted + ' ' + _altKey + ' ' + _controlKey );

                    if( this.id === jQuery( '#filteredInput' ).prop( 'id' ) ) {
                        if(
                            // BACK,         TAB
                            ( _key === 8 || _key === 9 )    // normal keyboard nav
                        ){}

                        else if(
                            // END,           HOME,          LEFT,          UP,            RIGHT,         DOWN
                            ( _key === 35 || _key === 36 || _key === 37 || _key === 38 || _key === 39 || _key === 40 )  // normal keyboard nav
                        ){}

                        else if(
                            // DELETE
                            ( _key === 46 ) // normal keyboard nav
                        ){}

                        else if(
                            ( _key >= 65 && _key <= 90 )    // a- z

                            //( _key >= 48 && _key <=  57 && _shifted !== true ) ||   // 0 - 9 (unshifted)
                            //( _key >= 65 && _key <=  90 ) ||                        // a- z
                            //( _key >= 96 && _key <= 105 )                           // number pad 0- 9
                        ){}

                        else {
                            e.preventDefault();
                        }
                    }

                });
            });
        </script>
0
répondu Mac 2015-07-21 22:41:55

je pense que keyCode renvoie le code ASCII du caractère de la valeur de clé, Ascii-104 h.

http://www.asciitable.com /

Charcode est comme indiqué dans une autre réponse une alternative utilisée dans certains navigateurs.

voici un article avec un exemple de crssbrowser: http://santrajan.blogspot.com/2007/03/cross-browser-keyboard-handler.html

-1
répondu David Mårtensson 2010-11-26 13:25:15

je pense que vous adoptez la mauvaise approche. Que diriez-vous de quelque chose comme:

<input id="test">

<script type="text/javascript">
var aToZ = function(el){
    if(this.value.match(/[^a-zA-Z]/)){
        this.value = this.value.replace(/[^a-zA-Z]+/, '')
    }
}
document.getElementById("test").onkeyup = aToZ
</script>

Aussi, n'oubliez pas de répéter la vérification côté serveur.

-1
répondu jqeryandjavascriptarenotthesam 2010-11-26 15:09:12