web-dev-qa-db-fra.com

Melhor maneira de restringir campo de texto apenas a números?

Vous êtes le premier ou le dernier script Javascript à afficher et à afficher les notes de ce site qui ne contiennent pas de site Web mais qui sont numérisées et dont vous avez besoin. O problème que soit REALMENTE rejeita todas as outras entradas-chave, comoctrl-APour choisir un texte, ou un texte de qualité, cliquez ici pour en savoir plusctrl-Touctrl-Wposer une question à texte, c'est selecionada. En savoir plus sur le script mélanger pour autoriser les entrées numérisées, mas masqué les masques normaux? Vous avez besoin d'aide pour acheter ou acheter:

function numbersonly(e, decimal) 
{
    var key;
    var keychar;

    if (window.event) 
        key = window.event.keyCode;
    else if (e) 
        key = e.which;
    else 
        return true;

    keychar = String.fromCharCode(key);

    if ((key==null) || (key==0) || (key==8) ||  (key==9) || (key==13) || (key==27))
       return true;     
    else if ((("0123456789").indexOf(keychar) > -1))
       return true;
    else if (decimal && (keychar == "."))
       return true;        
    else
       return false;
}

Edit: Nenhuma das soluções fornecidas résolveu o meu problema de permis to comosctrl-Aposer une question à texte, c'est selecionada. Dans le cas où vous auriez déjà acheté un aquarium original, choisissez un lecteur original ou original. Ah bem.

39
RobHardgood

C’est quelque chose que j’ai fait une autre fois pour juste des chiffres, cela permettra également à tous les formateurs.

jQuery

$('input').keypress(function(e) {
    var a = [];
    var k = e.which;

    for (i = 48; i < 58; i++)
        a.Push(i);

    if (!(a.indexOf(k)>=0))
        e.preventDefault();
});​

L'essayer

http://jsfiddle.net/zpg8k/

A noter que vous voudrez également filtrer côté soumission/serveur, par souci de coller/menu contextuel et les navigateurs ne prenant pas en charge l'événement de collage.

Modifier pour élaborer sur plusieurs méthodes

Je vois que vous rebondissez autour de la réponse «acceptée», alors je vais clarifier quelque chose. Vous pouvez vraiment utiliser n'importe laquelle des méthodes listées ici, elles fonctionnent toutes. Ce que je ferais personnellement, c’est d’utiliser mien pour le filtrage direct du côté client, puis, lors de la soumission et du côté serveur, d’utiliser RegEx comme suggéré par d’autres. Cependant, aucun côté client en soi sera efficace à 100% car rien ne m'empêche de mettre document.getElementById('theInput').value = 'Hey, letters.';in dans la console et de contourner toute vérification côté client (à l'exception de la scrutation, mais je pourrais simplement annuler le setInterval du console aussi). Utilisez la solution côté client de votre choix, mais assurez-vous également de mettre en œuvre quelque chose à côté de l'envoi et du côté serveur.

Éditer 2 - @ Tim Down

Bon, d'après les commentaires, j'ai dû ajuster deux choses auxquelles je n'avais pas pensé. Tout d’abord, appuyez sur la touche au lieu de keydown, qui a été mise à jour, mais le manque d’indexOf dans IE (sérieusement Microsoft !?) rompt également l’exemple ci-dessus. Voici une alternative 

$('input').keypress(function(e) {
    var a = [];
    var k = e.which;

    for (i = 48; i < 58; i++)
        a.Push(i);

    if (!($.inArray(k,a)>=0))
        e.preventDefault();
});​

New jsfiddle: http://jsfiddle.net/umNuB/

35
Robert
     .keypress(function(e)
               {
                 var key_codes = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 0, 8];

                 if (!($.inArray(e.which, key_codes) >= 0)) {
                   e.preventDefault();
                 }
               });

Vous avez aussi besoin des touches Retour et Suppr;)

15
ialpert

Cela fonctionne dans IE, Chrome et Firefox:

<input type="text" onkeypress="return event.charCode === 0 || /\d/.test(String.fromCharCode(event.charCode));" />
14
Hamund

http://jsfiddle.net/PgHFp/

<html>
<head>
<title>Test</title>
<script language="javascript">
function checkInput(ob) {
  var invalidChars = /[^0-9]/gi
  if(invalidChars.test(ob.value)) {
            ob.value = ob.value.replace(invalidChars,"");
      }
}
</script>
</head>

<body>
    <input type="text" onkeyup="checkInput(this)"/>
</body>
</html>
11
dogbane

Le seul événement contenant des informations sur le caractère saisi est keypress. Tout ce qui concerne les caractères que vous pouvez déduire de la propriété keyCode des événements keydown ou keyup n'est pas fiable et dépend d'un mappage de clavier particulier. Les éléments suivants empêchent la saisie au clavier non numérique de tous les principaux navigateurs en utilisant le caractère obtenu à partir de l'événement keypress. Cela n'empêchera pas l'utilisateur de coller ou de faire glisser du texte non numérique dans.

var input = document.getElementById("your_input");

input.onkeypress = function(evt) {
    evt = evt || window.event;
    if (!evt.ctrlKey && !evt.metaKey && !evt.altKey) {
        var charCode = (typeof evt.which == "undefined") ? evt.keyCode : evt.which;
        if (charCode && !/\d/.test(String.fromCharCode(charCode))) {
            return false;
        }
    }
};
4
Tim Down

Utilisez simplement regex pour vous débarrasser de tous les caractères non numériques chaque fois que vous appuyez sur une touche ou que la zone de texte perd le focus.

var numInput;
window.onload = function () {   
    numInput = document.getElementById('numonly');
    numInput.onkeydown = numInput.onblur = numInput.onkeyup = function()
    {
        numInput.value = numInput.value.replace(/[^0-9]+/,"");
    }
}
4
Randy the Dev

Peut-être que vous utilisez bootstrap. Si oui, cela peut suffire: 

<input type="text" data-mask="9999999"> 

Masque de saisie

4
nicooga

J'utilise ceci:

    oEl.keypress(function(ev)
    {
        var sKey = String.fromCharCode(ev.which);
        if (!sKey.match(/[0-9]/) || !sKey === "") 
            ev.preventDefault();            
    });

L'avantage est que toutes les clés qui ne fournissent pas d'entrée sur le champ sont toujours autorisées, vous n'avez donc pas à vous soucier de chaque clé spéciale. Même les combinaisons telles que CTRL + R fonctionnent toujours.

EDIT Comme cela ne fonctionne pas dans Firefox, j'ai du modifier un peu la fonction:

    oEl.keypress(function(ev)
    {
        var iKeyCode = ev.which || ev.keyCode;
        var aSpecialKeysForFirefox = [8, 9, 13, 27, 37, 38, 39, 40, 46];
        var sKey = String.fromCharCode(iKeyCode);
        if (sKey !== "" && $.inArray(iKeyCode, aSpecialKeysForFirefox ) < 0 && !sKey.match(/[0-9]/)) {
            ev.preventDefault();
        }
    });

Explication Tous les navigateurs traitent l’événement de frappe de touche jquerys différemment. Pour que cela fonctionne en FF, le contrôle $ .inArray est ajouté. Comme firefoxs keypress-event ne se déclenche pas lorsque des combinaisons telles que strg + tab sont utilisées, contrairement aux autres, l’approche key.match ajoute tout de même une petite valeur à ce dernier, car elle permet ces combinaisons. 

4
hugo der hungrige

Le code suivant est quelque chose que j'utilise beaucoup. J'ai trouvé le script sur un forum, mais je l'ai modifié et développé pour répondre à mes besoins:

<script type="text/javascript">
    // Restrict user input in a text field
    // create as many regular expressions here as you need:
    var digitsOnly = /[1234567890]/g;
    var integerOnly = /[0-9\.]/g;
    var alphaOnly = /[A-Za-z]/g;
    var usernameOnly = /[0-9A-Za-z\._-]/g;

    function restrictInput(myfield, e, restrictionType, checkdot){
        if (!e) var e = window.event
        if (e.keyCode) code = e.keyCode;
        else if (e.which) code = e.which;
        var character = String.fromCharCode(code);

        // if user pressed esc... remove focus from field...
        if (code==27) { this.blur(); return false; }

        // ignore if the user presses other keys
        // strange because code: 39 is the down key AND ' key...
        // and DEL also equals .
        if (!e.ctrlKey && code!=9 && code!=8 && code!=36 && code!=37 && code!=38 && (code!=39 || (code==39 && character=="'")) && code!=40) {
            if (character.match(restrictionType)) {
                if(checkdot == "checkdot"){
                    return !isNaN(myfield.value.toString() + character);
                } else {
                    return true;
                }
            } else {
                return false;
            }
        }
    }
</script>

Les différentes méthodes d'utilisation seraient:

<!-- To accept only alphabets -->
<input type="text" onkeypress="return restrictInput(this, event, alphaOnly);">
<!-- To accept only numbers without dot -->
<input type="text" onkeypress="return restrictInput(this, event, digitsOnly);">
<!-- To accept only numbers and dot -->
<input type="text" onkeypress="return restrictInput(this, event, integerOnly);">
<!-- To accept only numbers and only one dot -->
<input type="text" onkeypress="return restrictInput(this, event, integerOnly, 'checkdot');">
<!-- To accept only characters for a username field -->
<input type="text" onkeypress="return restrictInput(this, event, usernameOnly);">
3
Nirmal

Ajouter <script type="text/javascript" src="jquery.numeric.js"></script> puis utiliser

 $("element").numeric({ decimal: false, negative: false });
3
IlludiumPu36

Je sais qu'il y a déjà beaucoup de réponses mais par souci de simplicité j'aimerais ajouter une autre réponse qui est simple et explicite dans laquelle nous n'avons pas à nous rappeler les codes clés et cela fonctionne également sur tous les navigateurs

document.getElementById('myinput').onkeydown = function(e)
 {
     console.log(e.key);
     //console.log(e.target.value);
     switch (e.key)
     {
         case "1":
         case "2":
         case "3":
         case "4":
         case "5":
         case "6":
         case "7":
         case "8":
         case "9":
         case "0":
         case "Backspace":
             return true;
             break;

         case ".":
             if (e.target.value.indexOf(".") == -1)
             {
                 return true;
             }
             else
             {
                 return false;
             }
             break;

         default:
             return false;
     }

 }
<input type="text" placeholder="Enter Value" id="myinput" />

2
vibs2006

Ceci est une variation de la réponse de Robert qui permet d'entrer un seul point décimal. Si un point décimal a déjà été entré, seuls les nombres sont acceptés en entrée.

JSFiddle - entrée du nombre décimal

// Allow only decimal number input

$('#decimalInput').keypress(function (e) {
    var a = [];
    var k = e.which;

    for (i = 48; i < 58; i++)
    a.Push(i);

    // allow a max of 1 decimal point to be entered
    if (this.value.indexOf(".") === -1) {
        a.Push(46);
    }

    if (!(a.indexOf(k) >= 0)) e.preventDefault();

    $('span').text('KeyCode: ' + k);
});
2
Jon Crowell

manière plus courte et facile à comprendre:

$('#someID').keypress(function(e) { 
    var k = e.which;
    if (k <= 48 || k >= 58) {e.preventDefault()};
});
2
ZAJDAN

cela activera également les entrées du pavé numérique.

.keydown(function(event){                                     
    if(event.keyCode == 8 || event.keyCode == 46)             
        return true;                                         
    if(event.keyCode >= 96 && event.keyCode <= 105)           
        return true;                                          
    if(isNaN(parseInt(String.fromCharCode(event.keyCode),10)))
       return false;                                          
}); 
1
Yunus Eren Güzel

Toutes les réponses sont des réponses, des commentaires et des commentaires correctifs = causar aborrecimento aos seus usuários. Une maioria peut être filtrée ou permise comme un conte.

Connectez-vous pour filtrer, vérifier les notes sur le formulaire de réservation, puis le réserver, sans frais supplémentaires.

HTML inclus la validation:

<input type="number" pattern="[0-9]+">

Feito. Isso também permite o teclado numérico no celular.

1
bfred.it

Il convient de noter que, même si vous maîtrisez le contrôle via le serveur frontal (Javascript, HTML, etc.), vous devez toujours le valider sur le serveur, car rien n'empêche un utilisateur de désactiver JavaScript poster délibérément des ordures sur votre formulaire pour tenter de vous pirater.

Mon conseil: utilisez le balisage HTML5 pour que les navigateurs le supportant l'utilisent. Utilisez également l'option JQuery précédemment suggérée (la solution initiale peut comporter des défauts, mais il semble que les commentaires fonctionnent depuis longtemps). Et effectuez également la validation côté serveur.

1
Spudley

Voici ma solution: une combinaison des solutions de travail ci-dessous.

var checkInput = function(e) {
        if (!e) {
            e = window.event;
        }

        var code = e.keyCode || e.which;

        if (!e.ctrlKey) {

            //46, 8, 9, 27, 13 = backspace, delete, tab, escape, and enter
            if (code == 8 || code == 13 || code == 9 || code == 27 || code == 46)
                return true;
            //35..39 - home, end, left, right
            if (code >= 35 && code <= 39)
                return true;
            //numpad numbers
            if (code >= 96 && code <= 105)
                return true;
            //keyboard numbers
            if (isNaN(parseInt(String.fromCharCode(code), 10))) {
                e.preventDefault();
                return false;
            }
        }
        return true;
    };
1
Uygar

Je suis tombé sur votre question en essayant de comprendre cela moi-même. Voici la solution que j'ai proposée.

// Prevent user from entering non-numeric characters in number boxes.
(function (inputs) {
    var input;
    var f = function (e) {
        var unicodeRe = /U\+(\d+)/;
        // Chrome doesn't support the standard key property, so use keyIdentifier instead.
        // Instead of the actual character that "key" returns, keyIdentifier returns
        // A string such as "U+004F" representing the unicode character.

        // For special characters (e.g., "Shift", a string containing the name of the key is returned.)
        var ch = e.key || e.keyIdentifier;
        var match = ch.match(unicodeRe);
        // keyIdentifier returns a unicode. Convert to string.
        if (match) {
            ch = String.fromCharCode(Number.parseInt(match[1], 16));
        }
        console.log(ch);
        if (ch.length === 1 && /[^0-9]/.test(ch)) {
            if (!/[\b]/.test(ch)) { // Don't prevent backspace.
                e.preventDefault();
            }
        }
    };
    for (var i = 0, l = inputs.length; i < l; i += 1) {
        input = inputs[i];
        input.onkeydown = f;
    }
}(document.querySelectorAll("input[type=number],#routeFilterBox")));

Modifier: j'ai découvert que ma solution ne permettait pas à l'utilisateur de saisir des chiffres via le pavé numérique dans Chrome. Les touches 0 à 9 du clavier semblent renvoyer le caractère "` "pour 0 et A-I pour le reste des touches numériques.

1
Jeff Jacobson

Mes fonctions:

$('.input_integer_only').on('input', function(e) {
    $(this).val($(this).val().replace(/[^0-9]/g, ''));
});


$('.input_float_only').on('input', function(e) {
    var $var = $(this).val().replace(/[^0-9\.]/g, '');
    var $aVar = $var.split('.');

    if($aVar.length > 2) {
        $var = $aVar[0] + '.' + $aVar[1];
    }

    $(this).val($var);
});
1
Tin Nguyen

Afin d'empêcher tout élément autre que des nombres d'être entré dans un champ de texte tout en permettant à d'autres boutons de fonctionner (tels que supprimer, déplacer, tabulation, etc.), regardez une référence des codes de clé Javascript ; tout ce qui est compris entre 65 et 222 (jusqu'à 222) peut être bloqué. 

En utilisant Jquery et Javascript, cela ressemblerait à ceci:

$('#textFieldId').keydown(function(event) {
    if ( event.keyCode > 64 ) {
        event.preventDefault();
    }
});

Les codes de clé seront les mêmes en Javascript, que Jquery soit utilisé ou non.

1
Asher Garland

Il y a ma solution actuelle d'entrée numérique, besoin de tester dans différents navigateurs, mais semble fonctionner

Prise en charge de la délimitation des virgules et des points (le tchèque est une virgule), de l’espace et de la numérotation des touches numériques Autoriser Ctrl + C Ctrl + A ou Ctrl + X, la navigation par flèche et supprimer le bloc Ctrl + V. Réagissez sur la touche d'échappement en rendant l'entrée floue.

Regardez mon script café:

(($) ->
  $.fn.onlyNumbers = ->
    @each ->
      $(@).keydown (e) ->
        # get code of key
        code = if e.keyCode then e.keyCode else e.which

        return $(@).blur() if code is 27 # blur on escape
        return if code in [46, 8, 9, 13] # 46, 8, 9, 27, 13 = backspace, delete, tab, escape, and enter
        return if (e.ctrlKey or e.metaKey) and code in [65, 67, 88] # ctrl|command + [a, c, x]
        return if code in [96..105] # numpad numbers
        return if code in [48..57] # numbers on keyboard
        return if code in [35..39] # 35..39 - home, end, left, right
        return if code in [188, 190, 32] # comma, period, space
        return if code in [44] # comma, period,

        e.returnValue = false # IE hate you
        e.preventDefault();

      $(@).keypress (e) ->
        code = if e.keyCode then e.keyCode else e.which
        return if code in [44, 46, 32] # comma, period, space
        return if code in [48..57] # numbers on keyboard
        e.returnValue = false # IE hate you
        e.preventDefault();

) jQuery

Vous pouvez obtenir le code Javascript compilé ici http://goo.gl/SbyhXN

0
OzzyCzech

Vous pouvez gérer l’événement en HTML en introduisant la fonction keypresshandler

function keypresshandler(event)
{
     var charCode = event.keyCode;

     //You condition
     if (charCode == 58 ){

        event.preventDefault();

        return false;
     }        
} 
0
Priyanthi

Lire plus JavaScript doit être utilisé pour afficher les notes et les caractères uniques du texte, les numéros de téléphone, les informations de base, les paramètres de retour et les paramètres de retour. Mots-clés de la mémoire JavaScript - ne permet pas d'envoyer de texte, remplacez les options de caractères et caractères

Test em IE & Chrome.

Função JavaScript

<script type="text/javascript">
    /*code: 48-57 Numbers
      8  - Backspace,
      35 - home key, 36 - End key
      37-40: Arrow keys, 46 - Delete key*/
    function restrictAlphabets(e){
        var x=e.which||e.keycode;
        if((x>=48 && x<=57) || x==8 ||
            (x>=35 && x<=40)|| x==46)
            return true;
        else
            return false;
    }
</script>

Code HTML avec JavaScript

<html>
    <head>
        <title>JavaScript - Allow only numbers in TextBox (Restrict Alphabets and Special Characters).</title>
        <script type="text/javascript">
            /*code: 48-57 Numbers
              8  - Backspace,
              35 - home key, 36 - End key
              37-40: Arrow keys, 46 - Delete key*/
            function restrictAlphabets(e){
                var x=e.which||e.keycode;
                if((x>=48 && x<=57) || x==8 ||
                    (x>=35 && x<=40)|| x==46)
                    return true;
                else
                    return false;
            }
        </script>
    </head>
<body style="text-align: center;">
    <h1>JavaScript - Allow only numbers in TextBox (Restrict Alphabets and Special Characters).</h1>
    <big>Enter numbers only: </big>
    <input type="text" onkeypress='return restrictAlphabets(event)'/>
</body>

</html>

référence

0
Durgesh Pandey

Vous pouvez apporter des modifications pour accepter le code d'activation pour les touches Ctrl: 17, 18, 19, 20 . Votre code ressemblera alors à:

function numbersonly(e, decimal) {
var key;
var keychar;

if (window.event) 
    key = window.event.keyCode;
else if (e) 
    key = e.which;
else 
    return true;

keychar = String.fromCharCode(key);

if ((key==null) || (key==0) || (key==8) ||  (key==9) || (key==13) || (key==27) || (key==17) || (key==18) || (key==19) || (key==20))
   return true;     
else if ((("0123456789").indexOf(keychar) > -1))
   return true;
else if (decimal && (keychar == "."))
   return true;        
else
   return false;
}
0
Bruno Silva

Javascript est souvent utilisé côté client du navigateur pour effectuer des tâches simples qui nécessiteraient sinon une publication complète sur le serveur. Nombre de ces tâches simples impliquent le traitement de texte ou de caractères entrés dans un élément de formulaire d'une page Web. Il est souvent nécessaire de connaître le code d'activation javascript associé à un caractère. Voici une référence.

Appuyez sur une touche dans la zone de texte ci-dessous pour afficher le code de la clé Javascript correspondant.

        function restrictCharacters(evt) {

            evt = (evt) ? evt : window.event;
            var charCode = (evt.which) ? evt.which : evt.keyCode;
            if (((charCode >= '48') && (charCode <= '57')) || (charCode == '44')) {
                return true;
            }
            else {
                return false;
            }
        }
Enter Text:
<input type="text" id="number" onkeypress="return restrictCharacters(event);" />

0
Mayur Narula

Ceci est mon plugin pour ce cas:

 (function( $ ) {
    $.fn.numbers = function(options) {
      $(this).keypress(function(evt){
          var setting = $.extend( {
                'digits' : 8
              }, options);
          if($(this).val().length > (setting.digits - 1) && evt.which != 8){
              evt.preventDefault(); 
          }
          else{
              if(evt.which < 48 || evt.which > 57){
                if(evt.keyCode != 8){
                    evt.preventDefault();  
                }
              }
          }
      });
    };
  })( jQuery );

Utilisation:

 $('#limin').numbers({digits:3});
 $('#limax').numbers();
0
jortsc

Vous pouvez faire comme ceci pour n'accepter que les Nombres dans la Zone de texte,

 function onChange(event){
   var ckeckChars = /[^0-9]/gi;
   if(checkChars.test(event.target.value)) {
        event.target.value = event.target.value.replace(ckeckChars,"");
  }
0
Venkatesh Somu
  document.getElementById('myinput').onkeydown = function(e) {
      if(!((e.keyCode > 95 && e.keyCode < 106)
      || (e.keyCode > 47 && e.keyCode < 58) 
      || e.keyCode == 8
      || e.keyCode == 9)) {
        return false;
      }
  }
0
user3121518