HTML de saisie de texte permettent uniquement d'entrée numérique
Est-il un moyen rapide de régler un HTML de saisie de texte (<input type=text />
) pour autoriser uniquement les touches numériques (plus '.')?
De nombreuses solutions ne fonctionnent que lorsque les touches sont pressées. Ces échouera si les gens coller du texte à l'aide du menu, ou si elles le texte par glisser-déposer à l'entrée de texte. J'ai été mordu par l'avant. Attention!
vous toujours toujours besoin d'une validation côté serveur, de toute façon.
avis désactive également n'importe quelle autre touche, comme TAB pour passer à l'entrée suivante ou toute autre raccourci qui ne participent pas directement à l'entrée comme cmd+R pour l'actualisation du site web si l'entrée est concentré.
Si vous êtes d'accord avec le Plugin, utilisez NumericInput. Démo: jsfiddle.net/152sumxu/2 Plus de détails ici stackoverflow.com/a/27561763/82961
vous toujours toujours besoin d'une validation côté serveur, de toute façon.
<input type="text" onkeypress='return event.charCode >= 48 && event.charCode <= 57'></input>
avis désactive également n'importe quelle autre touche, comme TAB pour passer à l'entrée suivante ou toute autre raccourci qui ne participent pas directement à l'entrée comme cmd+R pour l'actualisation du site web si l'entrée est concentré.
Si vous êtes d'accord avec le Plugin, utilisez NumericInput. Démo: jsfiddle.net/152sumxu/2 Plus de détails ici stackoverflow.com/a/27561763/82961
OriginalL'auteur |
Vous devez vous connecter pour publier un commentaire.
JavaScript
Remarque: C'est une mise à jour de réponse. Les commentaires ci-dessous font référence à l'ancienne version qui foiré autour avec les codes de touches.
La
setInputFilter
fonction dans le script ci-dessous vous permet d'utiliser tout sorte de filtre d'entrée sur un texte<input>
, y compris les divers filtres numériques. Cela permettra de gérer correctement les Copier+Coller, Glisser+Chute, les raccourcis clavier, menu contextuel, les non-typable clés, la position du curseur, toutes les dispositions de clavier et tous les navigateurs depuis IE 9. Note que vous avez toujours doit faire côté serveur de validation!Essayer vous-même sur JSFiddle.
Utilisation:
Certains filtres d'entrée, vous pouvez utiliser:
/^-?\d*$/.test(value)
/^\d*$/.test(value)
/^\d*$/.test(value) && (value === "" || parseInt(value) <= 500)
.
et,
comme séparateur décimal):/^-?\d*[.,]?\d*$/.test(value)
/^-?\d*[.,]?\d{0,2}$/.test(value)
/^[0-9a-f]*$/i.test(value)
jQuery
Il y a aussi une version jQuery. Voir cette réponse ou essayez-le vous-même sur JSFiddle.
HTML 5
HTML 5 a une solution native avec
<input type="number">
(voir la spécification), mais notez que la prise en charge du navigateur varie:step
,min
etmax
attributs.e
etE
dans le domaine. Voir aussi cette question.Essayer vous-même sur w3schools.com.
Plus complexe des options de validation de
Si vous voulez faire quelques autres de validation des pièces et de morceaux, cela pourrait être pratique:
Toujours pas pris en charge par Firefox 21 (je ne parle même pas IE9 ou version antérieure ...)
Le type d'entrée nombre n'est pas destiné à être utilisé pour faire de votre entrée accepter uniquement des nombres. Il est destiné pour les entrées qui spécifient un 'certain nombre d'items. Chrome par exemple ajoute deux petites flèches pour augmenter de diminuer le nombre par un seul. Un bon numberic seule entrée est un peu ridicule, à l'omission de HTML.
Le type="nombre" n'est pas réellement empêcher l'entrée non valide du texte dans le champ; vous pouvez même couper et coller des données incorrectes dans le domaine, même dans chrome.
La seule chose que je voudrais ajouter c'est de changer les touches Ctrl+Une ligne pour inclure les utilisateurs de MacOSX:
(e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true))
OriginalL'auteur
Utiliser ce DOM
Et ce script
La plupart des gens ne de soins, d'avoir une erreur de script se montrer reflète mal sur votre site.
quelques problèmes avec ce code. Vous pouvez entrer . plus d'une fois, deuxième il ne permet pas de supprimer la clé de toute solution?
J'ai soigné sur la touche retour arrière, de supprimer et de flèches, pas de travail. Si vous supprimez "theEvent.keycode ||", et d'ajouter: "si( /[ -~]/ && !regex.test(key) ) {" ensuite, il fonctionne mieux (pour ASCII/UTF de toute façon). Mais alors il ne rejette pas les caractères chinois! 🙂
cela permet à quelqu'un de coller des trucs aléatoires à l'entrée
OriginalL'auteur
J'ai cherché longtemps et dur pour une bonne réponse, et nous avons désespérément besoin
<input type="number"
, mais de courte durée, ces 2 sont les plus concis façons que je pouvais venir avec:Si vous n'aimez pas la non-accepté le caractère montrant pour une fraction de seconde avant d'être effacée, la méthode ci-dessous est ma solution. Remarque les nombreuses conditions supplémentaires, c'est pour éviter la désactivation de toutes sortes de navigation et les touches de raccourcis. Si quelqu'un sait comment compactify cela, laissez-nous savoir!
La bonne méthode, mais peut être interrompue en appuyant et en maintenant un non-acceptable clé
Modifier la regex pour
/[^\d+]/
et il travaille avec maintenantmerci pour cela, mais notez qu'il devrait être
/[^\d]+/
à la place. La bonne solution. Aussi @user235859Il voulait permettre
.
trop. En fait, vous devez faire/[^0-9.]/g
OriginalL'auteur
Et un exemple de plus, qui fonctionne très bien pour moi:
Également joindre à événement keypress
Et HTML:
Voici un exemple jsFiddle
Pourquoi dois-je obtenir de l'événement "n'est pas défini" lorsque j'appelle cette fonction?
Comment empêcher, même en prenant le code collé
@Jessica a dit, vous cam ajouter apostrophe et le même signe de pourcentage.
Très proche!!!! mais ne permettra plus d'une décimale.
OriginalL'auteur
HTML5 a
<input type=number>
, ce qui semble bon pour vous. Actuellement, seulement à l'Opéra prend en charge en mode natif, mais il est un projet qui a un JavaScript de mise en œuvre.Le seul problème avec
type=number
est qui n'est pas pris en charge par IE9Il y a un polyfill pour les vieux IE. Plus d'infos ici.
Premier problème est
type=number
permet à l'e
char, car il considèree+10
que le nombre. Deuxième problème, c'est que vous ne pouvez pas limiter le nombre maximal de caractères dans l'entrée.OriginalL'auteur
Plus de réponses ici, tous ont la faiblesse de l'aide de la clé - des événements.
Beaucoup de réponses serait de limiter votre capacité à faire de la sélection de texte avec des macros clavier, copier+coller et de plus en plus un comportement non désiré, d'autres semblent dépendent de plugins jQuery, qui est en train de tuer des mouches avec des mitrailleuses.
Cette simple solution qui semble fonctionner le mieux pour moi de la croix-plate-forme, indépendamment du mécanisme d'entrée (touche de clavier, copier+coller, faites un clic droit copier+coller, speech-to-text, etc.). Toute la sélection de texte des macros clavier fonctionne encore, et il serait même limite de celles possibilité de définir une valeur non numérique par script.
Une alternative regex:
replace(/[^\d]+/g,'')
Remplacer tous les chiffres avec une chaîne vide. Le "je" (insensible à la casse) modificateur n'est pas nécessaire.Vous avez raison, je n'est pas nécessaire pour cela 🙂
Ce devrait être sur le dessus, puisque "onkey" gestionnaires d'événements dans une balise ne doit pas être propagées plus...
Si vous voulez décimales, vous pouvez modifier la regex
/[^\d,.]+/
OriginalL'auteur
J'ai opté pour l'utilisation d'une combinaison des deux réponses mentionné ici, c'est à dire
<input type="number" />
et
<input type="text" onkeypress="return isNumberKey(event);">
return !(charCode > 31 && (charCode < 48 || charCode > 57));
Comment à propos de la suppression? Vous voulez que les numéros, mais vous voudrez probablement les gens à être en mesure de les corriger sans rafraichissement de la page...
OriginalL'auteur
HTML5 prend en charge regexes, de sorte que vous pouvez utiliser ceci:
Attention: Certains navigateurs ne prennent pas en charge cette encore.
<input type=number>
.Vrai. Vous devez faire cette réponse. Ooops, @Ms2ger a déjà.
Le <input type=nombre> ajoute des flèches pour augmenter et diminuer certains navigateurs si cela semble être une bonne solution lorsque l'on veut éviter le spinner
Modèle obtient seulement vérifié sur soumettre. Vous pouvez toujours entrer des lettres.
non pris en charge par safari
OriginalL'auteur
JavaScript
supplémentaires vous pouvez ajouter virgule, point et moins (,.-)
HTML
merci man, vous comprenez vraiment une question! Bel exemple, et bien sûr de la manipulation . ou , (qui la plupart des gens ne veulent si ils travaillent avec des chiffres)
C'est le seul qui fonctionne que d'empêcher le collage non des valeurs numériques.
OriginalL'auteur
2 solutions:
Utiliser un validateur de formulaire (par exemple avec plugin jQuery validation)
Faire une vérification au cours de la onblur (c'est à dire lorsque l'utilisateur quitte le champ) de l'événement du champ de saisie, avec l'expression régulière:
Fait intéressant, j'ai dû donner le regex est "^\\d\\.?\\d*$", mais ce pourrait être parce que la page est gérée par une transformation XSLT.
Je pense que l'expression régulière est incorrect. J'ai utilisé cette ligne:
var regExpr = /^\d+(\.\d*)?$/;
pas sûr, si l'utilisateur veut d'entrée
.123
(au lieu de0.123
) par exemple?Vous avez raison, mais vous devrez alors modifier l'expression régulière pour s'assurer que dans le cas où il n'existe pas de chiffre avant de le point il y a des chiffres après le point. Quelque chose comme ceci:
var regExpr = /^\d+(\.\d*)?$|^\.\d+$/;
.OriginalL'auteur
Si simple....
//Dans une fonction JavaScript (vous pouvez utiliser du HTML ou PHP).
Dans votre formulaire d'entrée:
Avec entrée max. (Ci-dessus permet un numéro à 12 chiffres)
Je n'ai pas le suivre, ce qui semble être le problme? Il a fait un travail très bien dans mon cas.
la première ligne doit changé :
var charCode = (evt.which) ? evt.which : evt.keyCode;
OriginalL'auteur
Vous pouvez utiliser le modèle pour cette:
Ici, vous pouvez voir l'ensemble du site web mobile de l'interface de conseils.
Vous pouvez également ajouter un titre="numéros seulement" pour l'affichage de l'erreur
OriginalL'auteur
Si vous voulez suggérer à l'appareil (peut-être un téléphone mobile) entre alpha ou numérique, vous pouvez utiliser
<input type="number">
.OriginalL'auteur
Un court et doux de la mise en œuvre à l'aide de jQuery et de le remplacer() au lieu de regarder l'événement.mot de code ou de l'événement.qui:
Seulement de petits effets secondaires que le dactylographiée lettre s'affiche momentanément puis CTRL/CMD + A semble comportement un peu étrange.
OriginalL'auteur
Code JavaScript:
Code HTML:
fonctionne parfaitement parce que le keycode de la touche retour arrière est de 8 et une expression regex ne pas le laisser, c'est donc un moyen facile de contourner le bug 🙂
OriginalL'auteur
Juste une autre variante avec jQuery en utilisant
OriginalL'auteur
input type="number"
est un attribut HTML5.Dans l'autre cas, ce sera vous aider à:
var charCode = (evt.which) ? evt.which : evt.keyCode;
OriginalL'auteur
Un exemple de plus où vous peut ajouter des numéros uniquement dans le champ de saisie, ne peut pas lettres
OriginalL'auteur
suffit d'utiliser type="number" maintenant cet attribut de soutien dans la plupart des navigateurs
--1
(moins 2 caractères avant le 1er).OriginalL'auteur
Vous pouvez également comparer la valeur d'entrée (qui est considérée comme une chaîne de caractères par défaut) pour lui-même forcé numérique, comme:
Toutefois, vous devez le lier à l'événement keyup etc.
OriginalL'auteur
OriginalL'auteur
Utiliser ce DOM:
Et ce script:
...OU ce script, sans indexOf, à l'aide de deux
for
s'...J'ai utilisé le onkeydown attribut au lieu de onkeypress, parce que le onkeydown attribut est vérifié avant onkeypress attribut. Le problème serait dans le navigateur Google Chrome.
Avec l'attribut "onkeypress", ONGLET serait incontrôlable avec "preventDefault" sur google chrome, cependant, avec l'attribut "onkeydown", ONGLET devient contrôlable!
Code ASCII pour TAB => 9
Le premier script ont moins de code que la seconde, cependant, le tableau des caractères ASCII doit disposer de toutes les clés.
Le second script est beaucoup plus grand que le premier, mais le tableau n'a pas besoin de toutes les touches. Le premier chiffre de chaque position de la matrice est le nombre de fois que chaque position de lecture. Pour chaque lecture, sera incrémenté de 1 pour la prochaine. Par exemple:
NCount = 0
48 + NCount = 48
NCount + +
48 + NCount = 49
NCount + +
...
48 + NCount = 57
Dans le cas des touches numériques sont à seulement 10 (0 - 9), mais si ils étaient 1 million il ne serait pas judicieux de créer un tableau avec toutes ces clés.
Codes ASCII:
OriginalL'auteur
C'est une amélioration de la fonction:
OriginalL'auteur
La meilleure façon (autoriser TOUT type de numéros - de vrais négatifs, réels positifs, iinteger négatif, nombre entier positif) est:
OriginalL'auteur
C'est la version étendue de geowa4 de la solution. Prend en charge
min
etmax
attributs. Si le nombre est hors de portée, la valeur précédente sera affichée.Vous pouvez le tester ici.
Utilisation:
<input type=text class='number' maxlength=3 min=1 max=500>
Si les entrées sont dynamiques utiliser ceci:
cela ne doit pas effacer quoi que ce soit.
OriginalL'auteur
Ma solution pour une meilleure expérience utilisateur:
Détails:
Tout d'abord, types d'entrée:
number
montre les flèches haut/bas rétrécissement de l'entrée effective de l'espace, je les trouve moches et ne sont utiles que si le nombre représente une quantité, à une (des choses comme les téléphones, les codes, Id... n'en avez pas besoin)tel
offre les mêmes navigateur validations de nombre sans flèchesÀ l'aide de [nombre /tél] permet également de montrer clavier numérique sur les appareils mobiles.
Pour le JS de validation j'ai fini par avoir besoin de 2 fonctions, une pour l'utilisateur normal d'entrée (pression de touche) et l'autre pour un copier+coller fix (changement), d'autres combinaisons, il me donnerait une terrible expérience de l'utilisateur.
- Je utiliser le plus fiable KeyboardEvent.clé au lieu de la maintenant obsolète KeyboardEvent.charCode
Et en fonction de votre navigateur, vous pouvez envisager d'utiliser Tableau.le prototype.comprend() au lieu de la mal nommée Tableau.le prototype.indexOf() (pour de vrai /faux résultats)
OriginalL'auteur