9
votes

Entrée numérique JavaScript (jQuery): Code KeyCode pour '3' et '#' sont les mêmes

J'ai besoin de configurer un de sorte qu'il n'accepte que des caractères numériques, une arrière-marche, une suppression, une entrée, des onglets et des flèches.

Il y a beaucoup de choses d'un exemple autour de là, j'ai commencé avec quelque chose de similaire à celui-ci: xxx

tout ce qui a fonctionné parfaitement jusqu'à ce que je touche la touche "#". Dans mon clavier canadien français, le "#" a sa propre clé (aucun changement impliqué) qui renvoie le code KeyCode 51, identique au nombre "3".

Je pense que dans le clavier américain, le "# "est obtenu en appuyant sur Maj + 3, qui peut être la raison pour laquelle ils ont le même code-clés.

Maintenant, je me rends compte que je dois aussi gérer les clés de quart et alt, mais c'est une autre histoire.

Cela fonctionne différemment avec l'événement JQuery KeyPress, qui offre la propriété Charcode, mais je ne l'ai pas utilisée au début à cause de ce que documentation dit:

Comme l'événement KeyPress n'est couvert par aucune spécification officielle, le comportement réel rencontré lors de l'utilisation de celui-ci peut différer à travers les navigateurs, versions de navigateur et plates-formes.

En outre, j'aurais besoin d'une solution de contournement dans ce cas pour gérer les onglets, les flèches et d'autres clés spéciales car ils ne fournissent pas de charcode.

La question est la suivante: Y a-t-il un moyen d'autoriser uniquement des caractères spécifiques à l'aide de l'événement clé? Et cela, d'une manière qui fonctionnera indépendamment de la disposition du clavier?

comme une quête secondaire: quels navigateurs peuvent être problématiques avec l'événement KeyPress? Je veux dire, actuellement, je ne me soucie pas vraiment si mon site Web ne prend pas en charge IE6. Je cible des navigateurs récents.

Modifier

Comme une personne pointée dans les commentaires, cette méthode ne permet pas à l'utilisateur de "Ctrl + V" un numéro dans l'entrée. Dans mon cas particulier, ce n'est vraiment pas une obligation de pouvoir coller un nombre. Mais cela a sauté quelque chose dans ma tête, l'utilisateur peut toujours cliquer à droite> Copier du texte dans l'entrée et dans ce cas qui pourrait être n'importe quoi. Plus j'y pense, plus il me semble que j'aurai besoin de l'événement pour gérer les onglets et les flèches, et un autre événement pour gérer l'entrée elle-même. < / P>

EDIT2

Beaucoup de belles réponses ici, mais le prix va à mrtShatherman Pour l'utilisation de entrée et PropertyChanger événements. J'utiliserai une combinaison de cette réponse pour la validation numérique, plus l'événement codcode comme avant pour l'utilisation spéciale des flèches, des onglets et des touches entrées.


7 commentaires

Vous savez que vous pouvez vérifier pour NAN (données) et enregistrer tous ces problèmes, non?


En outre, que se passe-t-il lorsque l'utilisateur pauvre essaie de coller un numéro avec Ctrl + V?


@gdoron: Je suppose que vous voulez dire vérifier la valeur de la zone de texte dans l'événement Keyup? Je me suis souvenu d'avoir fait quelque chose de similaire il y a quelques années, ce qui a entraîné un texte clignotant dans l'entrée lorsqu'il est sans numérum. Je veux vraiment bloquer d'autres caractères à saisir.


@Cameron: bonne prise, mais dans le contexte de ma candidature, il n'y a vraiment aucune raison pour laquelle j'aurais voulu le faire.


S'il vous plaît vérifier e.keycode, e.charcode et E.Qui. Unixpapa.com/js/key.html


@Cameron, ne vous inquiétez pas du texte clignotant, il n'y a rien de mal si l'expérience utilisateur n'est pas la meilleure quand il fait quelque chose de mal ...


@Diode: E.CHARCODE est uniquement disponible avec l'événement KeyPress, que le DOC JQUERY recommande pas à utiliser. Quant à E.Qui, dans le test, j'ai fait qu'il revient la même chose que E.KeyCode.


4 Réponses :


0
votes

jQuery fournit également un shiftkey booléen sur l'objet d'événement: xxx

edit Je relisez votre question et modifié le code ci-dessus pour ! SQUATEKEY


4 commentaires

Comme je l'ai dit dans la question, il n'y a pas de clé de changement de vitesse impliqué lorsque je tape "#". Ce caractère a sa propre clé sur mon clavier et aucun modificateur n'est nécessaire.


@RGTHREE: Il semblerait donc que votre solution conserve Johnny5 dans la situation actuelle de ne pas pouvoir distinguer un "3" (pas de quart de travail) et un "#" (pas de décalage, même code que "3")


Je vois. Je ne suis pas tout à fait sûr de savoir pourquoi cela produirait le même code clé. Sur un clavier américain, la touche "*" autonome est un code clé différent de la touche Maj + 8 (évidemment), il me semblerait qu'une touche "#" distincte doit être un code clé différent de celui de Maj + 3. Si j'avais eu une aventure, il semblerait que quels que soient les pilotes assises entre votre clavier, le système d'exploitation et le navigateur correspondent à une touche «#» sur le 51 keycode ... (cependant, je ne suis pas d'expert international du clavier). Pourrait-il y avoir autre chose sur l'objet événement qui vous indique quelque chose de spécial à propos de cette clé?


Plus j'y pense, plus il semble que la clé + code KeyCode n'est pas la voie à suivre.



3
votes

Que diriez-vous de quelque chose comme ça. Cela devrait couvrir la coupe / la pâte et la teneur en RMB. Nous surveillons la zone de texte pour tout changement de contenu. Ensuite, nous utilisons une regex pour filtrer les caractères basés sur un whitelist. Cela ne gérera pas la clé de caractère, mais je pense que cela va bien.

Le drapeau \ d indique que seuls les chiffres doivent être acceptés.

http://jsfiddle.net/uxeva/1 xxx

nous lier à deux événements ici. Entrée pour Firefox et PropertyChange pour d'autres navigateurs.


6 commentaires

J'ai peut-être manqué quelque chose, mais je peux entrer quelque chose dans le violon, avec Firefox 9.0.1.


@ Johnny5 - fonctionne bien en FF9 pour moi. Vous ne pouvez pas taper des caractères spéciaux comme @ # $%%.


@ Johnny5 - je vois. Pour une raison quelconque, j'ai lu votre réponse comme désirant accepter les lettres et les lettres. Mais vous ne voulez que des chiffres. J'ai changé l'expression régulière vers \ d pour que cela n'accepte que des chiffres.


@ Johnny5 - J'ai effectivement changé ma réponse pour emprunter une partie du code d'Adeneo parce que son chèque ISNAN empêche l'exécution inutile de l'expression régulière.


Pouvez-vous expliquer un peu plus loin quel est l'événement "Entrée de propriétéChanger"?


@ Johnny5 - Entrée est un événement pour Firefox qui se produit lorsque la valeur de la boîte de texte change. L'événement de PropertyChange est le même, mais pour d'autres navigateurs. Vous avez besoin de gérer tous les cas de navigateur.



2
votes

Si les navigateurs plus anciens ne sont pas un problème, le type d'entrée de numéro doit couvrir ceci.

$("#number3").on('keyup', function() {
    var V = $(this).val();
    if (isNaN(V)) {
        $(this).val(V.replace(/[^0-9]/g,''));
    }
});


2 commentaires

Il semble être la solution, je vais tester ce soir. Merci.


+1 - Semblable à ma réponse, mais le chèque ISNAN est une meilleure mise en œuvre. Si vous regardez à ma réponse, j'utilise Entrée de propriétéChange . Cela attrapera tous les événements de la méthode d'entrée (typing, CTRL-V et RMB). Un très bon tour à connaître.



1
votes

Pourquoi ne pas faire quelque chose comme ça? Il utilise une combinaison de Keyup () événement et isnan () . Cela fonctionnera si les types d'utilisateurs avec le clavier ou les pâtes sont un numéro.

La manière dont cela fonctionne est, dès que le texte change, il vérifiera si la valeur est un nombre. Sinon, il va couper l'entrée jusqu'à ce qu'il s'agisse d'un nombre. Donc, si vous entrez 25s ou 25SSS , vous serez laissé avec 25 .

Ceci fonctionnera avec Ctrl + V Coller aussi. Cela ne fonctionnera pas avec une pâte de clic droit et pour cette raison, j'ai désactivé un clic droit sur la zone de texte.

Démo en direct

La jQuery xxx


0 commentaires