233 votes

jQuery : quelle est la meilleure façon de restreindre la saisie de "chiffres" dans les zones de texte ? (autoriser les points décimaux)

Quelle est la meilleure façon de restreindre la saisie de "chiffres" dans les zones de texte ?

Je cherche quelque chose qui permette les points décimaux.

Je vois beaucoup d'exemples. Mais je n'ai pas encore décidé lequel utiliser.

Mise à jour de Praveen Jeganathan

Plus de plugins, jQuery a mis en place sa propre jQuery.isNumeric() ajouté dans la v1.7. Voir : https://stackoverflow.com/a/20186188/66767

4 votes

Il s'agit d'une question d'opinion, mais très utile. Les questions d'opinion devraient être autorisées. La personne qui recherche cette information doit seulement savoir qu'il s'agit d'une réponse basée sur une opinion. Un TAG serait suffisant.

291voto

Keith Bentrup Points 5558

Si vous voulez restreindre l'entrée (par opposition à la validation), vous pourriez travailler avec les événements clés. quelque chose comme ceci :

<input type="text" class="numbersOnly" value="" />

Et :

jQuery('.numbersOnly').keyup(function () { 
    this.value = this.value.replace(/[^0-9\.]/g,'');
});

Cela permet à l'utilisateur de savoir immédiatement qu'il ne peut pas saisir de caractères alpha, etc. plutôt que de le faire plus tard pendant la phase de validation.

Vous devrez quand même valider parce que la saisie peut être remplie par un copier-coller avec la souris ou éventuellement par un autocompleteur de formulaire qui ne déclenche pas nécessairement les événements de touche.

4 votes

+1 - J'allais suggérer la même chose. C'est un très bon point de noter que cette forme de validation peut avoir lieu à chaque frappe, plutôt qu'une fois à la fin. La seule chose que j'ajouterais est une forme d'alerte indiquant que ce que l'utilisateur est en train de taper est rejeté. Le simple fait de ne pas afficher les lettres fera croire à beaucoup trop de gens que leur clavier est cassé. Vous pouvez peut-être changer subtilement la couleur du fond ou de la bordure du moment que l'utilisateur sait que votre application fait quelque chose.

0 votes

Je suis d'accord. J'ai un exemple à tarbuilders.com . si vous cliquez sur "contact", le formulaire vérifie la saisie de l'utilisateur à la volée et si elle est valide, il y a une bordure verte et une coche. invalide -> rouge et "x".

5 votes

Voir cette réponse pour régler le problème de la touche fléchée.

199voto

TheVillageIdiot Points 22158

Mise à jour

Il existe une nouvelle solution très simple pour cela :

Il vous permet d'utiliser tout type de filtre d'entrée sur un texte <input> , y compris divers filtres numériques. Cela permet de gérer correctement le copier/coller, le glisser/déposer, les raccourcis clavier, les opérations du menu contextuel, les touches non typables et toutes les dispositions de clavier.

Voir cette réponse ou essayez-le vous-même sur JSFiddle .

plugin jquery.numeric

J'ai mis en œuvre avec succès de nombreux formulaires avec le jquery.numeric plugin.

$(document).ready(function(){
    $(".numeric").numeric();
});

De plus, cela fonctionne aussi avec les zones de texte !

Cependant, notez que Ctrl+A, Copier+Coller (via le menu contextuel) et Drag+Drop no fonctionnent comme prévu.

HTML 5

Avec un support plus large de la norme HTML 5, nous pouvons utiliser pattern et number type pour input pour restreindre l'entrée de numéros uniquement. Dans certains navigateurs (notamment Google Chrome), il est également possible de restreindre le collage de contenu non numérique. Plus d'informations sur number et d'autres types d'entrée plus récents est disponible aquí .

6 votes

Ce plugin ne vous permet pas d'utiliser le retour arrière dans Opera.

6 votes

@Darryl le source ne fait que quelques dizaines de lignes, donc je suis sûr que le modifier pour permettre cela est trivial. Je viens de trouver ce plugin et je l'ai modifié de façon à ce qu'il y ait maintenant une fonction allowDecimal pour les cas où je ne veux autoriser que des valeurs entières La source est très simple et bien écrite.

1 votes

Cela ne fonctionne pas lors du copier-coller dans des champs de saisie qui sont de type type="number" .

102voto

James Nelli Points 539

J'ai pensé que la meilleure réponse était celle ci-dessus pour faire ça.

jQuery('.numbersOnly').keyup(function () {  
    this.value = this.value.replace(/[^0-9\.]/g,''); 
});

mais je suis d'accord pour dire que c'est un peu pénible que les touches fléchées et le bouton de suppression amènent le curseur à la fin de la chaîne (et à cause de cela, il m'a été renvoyé lors des tests).

J'ai ajouté un simple changement

$('.numbersOnly').keyup(function () {
    if (this.value != this.value.replace(/[^0-9\.]/g, '')) {
       this.value = this.value.replace(/[^0-9\.]/g, '');
    }
});

Ainsi, si un bouton est pressé sans que le texte soit modifié, il suffit de l'ignorer. Avec cette méthode, vous pouvez appuyer sur les flèches et supprimer sans sauter à la fin, mais cela efface tout texte non numérique.

27 votes

Pour une meilleure performance, créez une var avec le résultat du remplacement au lieu de l'exécuter deux fois.

4 votes

keypress pourrait être utilisé pour simplifier encore plus les choses, car apparemment keyup y keydown se déclenche sur n'importe quelle touche du clavier, tandis que keypress sólo déclenchements sur les touches "caractères" (donc no déclenchement sur les touches flèche et suppression). Voir cette réponse pour référence : stackoverflow.com/a/1367720/1298685

0 votes

Il accepte plus d'une décimale. Comment accepter une seule décimale ? J'ai demandé un champ de texte pour le montant. Il accepte également 12.5.6. Comment limiter le champ à un seul point ?

54voto

Dave Aaron Smith Points 2710

Le plugin jquery.numeric a quelques bogues dont j'ai informé l'auteur. Il autorise les décimales multiples dans Safari et Opera, et vous ne pouvez pas taper la touche d'espacement arrière, les flèches ou plusieurs autres caractères de contrôle dans Opera. J'avais besoin de saisir des nombres entiers positifs, alors j'ai fini par écrire mon propre plugin.

$(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});

0 votes

Il est impossible d'entrer un 0 en utilisant ce code. Testé avec Chrome et FF sur Mac.

1 votes

J'ai mis à jour ceci afin d'accepter le chiffre 0 (48 == event.which && ($(this).val() > 0 )) || // Pas de premier chiffre 0

0 votes

C'est une excellente solution mais il manque les décimales, il suffit d'ajouter (46 == event.which && !($(this).val().includes(".")))) ||

48voto

Praveen Points 19102

Plus de plugins, jQuery a mis en œuvre sa propre jQuery.isNumeric() ajouté dans la v1.7.

jQuery.isNumeric( value )

Détermine si son argument est un nombre.

Résultats des échantillons

$.isNumeric( "-10" );     // true
$.isNumeric( 16 );        // true
$.isNumeric( 0xFF );      // true
$.isNumeric( "0xFF" );    // true
$.isNumeric( "8e5" );     // true (exponential notation string)
$.isNumeric( 3.1415 );    // true
$.isNumeric( +10 );       // true
$.isNumeric( 0144 );      // true (octal integer literal)
$.isNumeric( "" );        // false
$.isNumeric({});          // false (empty object)
$.isNumeric( NaN );       // false
$.isNumeric( null );      // false
$.isNumeric( true );      // false
$.isNumeric( Infinity );  // false
$.isNumeric( undefined ); // false

Voici un exemple de la façon de lier la fonction isNumeric() à l'écouteur d'événements.

$(document).on('keyup', '.numeric-only', function(event) {
   var v = this.value;
   if($.isNumeric(v) === false) {
        //chop off the last char entered
        this.value = this.value.slice(0,-1);
   }
});

0 votes

+1 pour l'absence de plugins. Je voudrais ajouter une légère modification pour permettre la séparation des milliers. A la place de var v = this.value; le changer en var v = this.value.replace(/,/g,''); . Des chiffres tels que 21,345,67.800 sont trop considérés.

0 votes

Quelqu'un sait-il comment cela vérifie les chiffres ? Utilise-t-il des codes de touches ou des expressions régulières ? C'est important si vous tenez compte des différentes dispositions de clavier.

3 votes

C'est très proche. Cependant, si vous maintenez une touche de caractère enfoncée, la vérification ne s'effectue pas correctement. Le caractère sera "exécuté". Essayez plutôt ceci : $(document).on('keyup keypress', '#somethingSomething', function(){ var aValue = $(this).val(); if($.isNumeric(aValue) === false){ $(this).val(aValue.slice(0,-1)); } });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X