viernes, 9 de octubre de 2015

Como validar campo de texto solo Letras y solo Números con Javascript



En ocasiones necesitamos validar los campos de texto o campos numéricos, los navegadores nos ofrecen opciones pero no son tan estrictas y no sirven para todos. Javascript se ha vuelto una herramienta práctica que ayuda a realizar tareas sencillas, estas tareas de procesamientos de texto y caracteres introducidos en un formulario es a lo que nos vamos a referir en este post.

Comenzamos con la función que va a validar solo letras.
Function LETRAS Javascript

//Se utiliza para que el campo de texto solo acepte letras
function soloLetras(e) {
    key = e.keyCode || e.which;
    tecla = String.fromCharCode(key).toString();
    letras = " áéíóúabcdefghijklmnñopqrstuvwxyzÁÉÍÓÚABCDEFGHIJKLMNÑOPQRSTUVWXYZ";//Se define todo el abecedario que se quiere que se muestre.
    especiales = [8, 37, 39, 46, 6]; //Es la validación del KeyCodes, que teclas recibe el campo de texto.

    tecla_especial = false
    for(var i in especiales) {
        if(key == especiales[i]) {
            tecla_especial = true;
            break;
        }
    }

    if(letras.indexOf(tecla) == -1 && !tecla_especial){
alert('Tecla no aceptada');
        return false;
      }
}

Para validar solo números es la siguiente función:
Function NÚMEROS Javascript

//Se utiliza para que el campo de texto solo acepte numeros
function SoloNumeros(evt){
 if(window.event){//asignamos el valor de la tecla a keynum
  keynum = evt.keyCode; //IE
 }
 else{
  keynum = evt.which; //FF
 } 
 //comprobamos si se encuentra en el rango numérico y que teclas no recibirá.
 if((keynum > 47 && keynum < 58) || keynum == 8 || keynum == 13 || keynum == 6 ){
  return true;
 }
 else{
  return false;
 }
}


La mejor forma de llamar estas funciones en nuestro código html es la siguiente:

//para la función solo numeros
<label>Números:</label>
<input  id="Identificacion" name="Identificacion" style="width:300px; margin-left:2px " required onKeyPress="return SoloNumeros(event);">

//para la función solo letras
<label>Letras:</label>
<input  id="Nombre" name="Nombre" required onkeypress="return soloLetras(event);" onKeyUp="this.value = this.value.toUpperCase();">

El onKeyUp="this.value = this.value.toUpperCase(); se utiliza para que todas las letras digitadas se vuelvan mayúsculas.

Demostración:
Prueba los campos de texto a continuación con letras y números




Esta es una lista con los Key Codes para usar en las funciones de acuerdo a como lo requieran.

KEY CODE
backspace 8
tab 9
enter 13
shift 16
ctrl 17
alt 18
pause/break 19
caps lock 20
escape 27
page up 33
page down 34
end 35
home 36
left arrow 37
up arrow 38
right arrow 39
down arrow 40
insert 45
delete 46
0 48
1 49
2 50
3 51
4 52
5 53
6 54
7 55
8 56
9 57
a 65
b 66
c 67
d 68
KEY CODE
e 69
f 70
g 71
h 72
i 73
j 74
k 75
l 76
m 77
n 78
o 79
p 80
q 81
r 82
s 83
t 84
u 85
v 86
w 87
x 88
y 89
z 90
left window KEY 91
right window KEY 92
select KEY 93
numpad 0 96
numpad 1 97
numpad 2 98
numpad 3 99
numpad 4 100
numpad 5 101
numpad 6 102
numpad 7 103
KEY CODE
numpad 8 104
numpad 9 105
multiply 106
add 107
subtract 109
decimal point 110
divide 111
f1 112
f2 113
f3 114
f4 115
f5 116
f6 117
f7 118
f8 119
f9 120
f10 121
f11 122
f12 123
num lock 144
scroll lock 145
semi-colon 186
equal sign 187
comma 188
dash 189
period 190
forward slash 191
grave accent 192
open bracket 219
back slash 220
close braket 221
single quote 222



33 comentarios:

  1. Hola, una consulta. Y como se podria limitar el numero de numeros a 5 por ejemplo, en este mismo ejemplo?
    saludos

    ResponderEliminar
    Respuestas
    1. Puedes hacer lo siguiente: Dentro del campo se debe utilizar size y maxlength

      input type="...." size="5" maxlength="5"

      El size es para indicar la longitud del campo y el maxlength es para que solo permita al campo digitar 5 caracteres. Maxlength y size son atributos que se relacionan entre sí, pero se pueden utilizar por separado.

      Eliminar
    2. hola como podria limitar el campo para que el minimo de datos ingresados sean 6 y el maximo 10, si esta dentro de estos parametros que se envie, si esta menos que 6 entonces pedir que se escriban mas caracteres!!

      gracias

      Eliminar
    3. Hola, lamento no haberte podido contestar antes.

      Mira te voy a mostrar este código que tiene lo que tu necesitas y esta bien explicado.


      <html>
      <head>
      <meta charset="utf-8">
      <title>Documento sin título</title>
      </head>

      <body>
      <form id="form1" name="form1" method="post">
      <label for="TxtValor">Text Field:</label>
      <input name="TxtValor" type="text" id="TxtValor" maxlength="8" onBlur="validarLenght(this.value);">
      <input type="button" name="button" id="button" value="Enviar">
      </form>
      <script>
      function validarLenght(Objeto){
      if(Objeto.length < 6){
      alert('Lo minimo de carácteres son 6.');
      }
      else if(Objeto.length > 8){
      alert('Lo máximo de carácteres son 8.');
      }
      }
      </script>
      </body>
      </html>

      La validación de carácteres máximo se hace en la propiedad maxlength de html, pero aún así en javascript se pone pues no está de más.
      La función para validar se pone en el evento onBlur ya que este se ejecuta al quitar el foco de la caja de texto y nos permite hacer la validación.

      Eliminar
  2. tu campo de texto acepta comillas simples como desactivarlas

    ResponderEliminar
    Respuestas
    1. Como te podrás dar cuenta en la tabla de los key code indico el numero correspondiente a cada tecla, en la validación de la caja de texto especiales = [8, 37, 39, 46, 6] puedes adicionar o quitar según tu necesidad de funciones para la caja de texto, prueba quitando el 6 y adiciona otros números como 40 para incluir la flecha hacia abajo, debes jugar con los codes que necesites, que permitan ser usadas en la caja de texto.

      Eliminar
  3. me podrías ayudar ejecuto el código y funciona pero admite porcentaje(%) y comillas simple (') hice lo que dices en el comentario anterior pero no me sale espero que me ayudes con eso

    ResponderEliminar
  4. Eso se debe a que en el rango de keyCode que estas colocando, debes haber incluido el codigo que permite sacar el %, en este caso es el code 101 y el code 222 que hace referencia a la comilla sencilla; de cualquier forma muestrame el codigo que estas usando para poderte ayudar mejor. Quizas tengas un error en la restrincion de codigos que no hayas visto.

    ResponderEliminar
  5. Hola, como puedo hacer para que solo me acepte la tecla X mayuscula o minuscula, asi como tabulador y borrador,y que si pulso cualquier otra tecla ya sea letra o numero me mande un mensaje de alerta de caracter invalido

    ResponderEliminar
    Respuestas
    1. hola, mira para que solo te permita la tecla x, el tabulador y el backspace. Dentro del function soloLetras debes hacer lo siguiente:

      letras = "xX";//
      especiales = [8, 9 ]; //

      Y con respecto al mensaje que quieres puedes, en la funcion sololetras reemplazar esta ultima parte:

      if(letras.indexOf(tecla) == -1 && !tecla_especial)
      return false;
      }

      Por esta:

      if(letras.indexOf(tecla) == -1 && !tecla_especial){
      alert('Tecla no aceptada');
      return false;
      }

      Y listo espero te sea de ayuda.

      Eliminar
    2. Adjunte en el código del ejemplo el mensaje que deberia salirte en la validación de letras si quieres probar que realmetne funciona.

      Eliminar
  6. Buenas tardes, una pregunta, como puedo hacer lo siguiente: Tengo una caja de texto y si ingreso la letra "A" que me muestre un botón de Aceptar, si cambio la letra a "C" que me ponga un boton de consulta, osea que en lugar de ue esten los dos botones al mismo tiempo, se muestren de acuerdo a la tecla que presione.

    ResponderEliminar
    Respuestas
    1. Hola Buen día, perdona la tardanza te arme un código donde puedes hacer lo que encesitas. primero te voy a pasar la parte de html y luego la del script:

      CODIGO HTML:

      <!-- Formulario con los inputs -->
      <form id="form1" name="form1" method="post">
      <label for="TxtEstado">Estado:</label>
      <input type="text" name="TxtEstado" id="TxtEstado" onKeyUp="DecidirEstado();"><!-- En el evento onKeyUp llamo la función que me permite mostrar el botón adecuado -->
      <input type="button" name="BtoAceptar" id="BtoAceptar" value="Aceptar">
      <input type="button" name="BtoConsultar" id="BtoConsultar" value="Consultar">
      </form>

      CODIGO SCRIPT:

      // Oculto los botones al cargar la página
      document.getElementById('BtoAceptar').style.display = 'none';
      document.getElementById('BtoConsultar').style.display = 'none';

      // Funcion para decidir el botón a mostrar
      function DecidirEstado(){
      // Capturo el valor de la caja de texto
      var Estado = document.getElementById('TxtEstado').value;

      // Evaluo el valor digitado para mostrar el botón adecuado, adicionalmente convierto la cadena en mayúscula para no tener inconvenientes a la hora de evaluar la cadena
      if(Estado.toUpperCase() == 'A'){
      document.getElementById('BtoAceptar').style.display = 'inline';
      }
      else if(Estado.toUpperCase() == 'C'){
      document.getElementById('BtoConsultar').style.display = 'inline';
      }
      // Si digito algo diferente a lo permitido, no muestro ningún botón
      else{
      document.getElementById('BtoAceptar').style.display = 'none';
      document.getElementById('BtoConsultar').style.display = 'none';
      }
      }

      Eliminar
    2. Por si necesitas el ejemplo completo mira este link: http://programadoressinoficio.blogspot.com.co/2016/10/activar-boton-dependiendo-del-valor-de.html#more

      Eliminar
  7. simplemente, hermoso, gracias x)

    ResponderEliminar
  8. http://programadoressinoficio.blogspot.com.co/2016/11/validar-fecha-en-un-input-con-javascript.html#more

    ResponderEliminar
  9. http://programadoressinoficio.blogspot.com.co/2016/10/activar-boton-dependiendo-del-valor-de.html

    ResponderEliminar
  10. De ante mano, muchas gracias tu informacion fue de mucha ayuda, utilice tu informacion para hacer mi tarea.

    Solo una consulta algo que no entendi y es:

    required onKeyPress="return SoloNumeros(event)

    como es que pasas la variable event, mejor dicho de donde la sacas, la funcion en el java scrit la recibe, pero no entendi como pasas el valor del imput a la varible event, la auto-cacha, te agradeceria la respuesta,que tengas buen dia. :)

    ResponderEliminar
    Respuestas
    1. hola Jose Luis, al llamar la función dentro onKeyPress="return SoloNumeros(event);" el event captura el evento de la tecla presionada (onKeyPress), el cual devuelve un json con varias propiedades que podemos usar para evaluar alguna condición, en nuestro caso el keyCode. No necesariamente debe ser event, puede ser cualquier valor que quieras (e, b, evento, valor) por dar ejemplos. JavaScript siempre devolverá un valor cuando se ejecuta el evento, ya se onKeyPress, onKeyDown, onKeyUp, onClick, etc.

      Eliminar
  11. Me sirvió muchísimo, llevaba rato buscando este código. Graciasss!!<3

    ResponderEliminar
  12. Hola
    me encanto tu codigo y funciona muy bien, solo que al intertar un registro con Ñ o acento en alguna letra me salen caracteres raros
    y antes de agregarle las validaciones todo funcionaba bien
    en que me abre equivicado?


    -Michelle-

    ResponderEliminar
  13. Hola! super agradecido con tu codigo! me salvo en el trabajo, solo una pregunta, como puedo hacer que en la funcion de soloNumeros me permita poner un punto (.)? para poder escribir cantidades con decimales, por ejemplo "22.4568"

    De antemano muchas gracias! :D

    ResponderEliminar
    Respuestas
    1. Hola como estas, aquí te envío un nueva forma de hacer la validación con expresiones regulares, espero te sea de ayuda.

      <HTML>
      <BODY>
      <label>Números:</label>
      <input id="Identificacion" name="Identificacion" style="width:300px; margin-left:2px " required onKeyUp="SoloNumeros(this);">
      <!-- Uso el evento onKeyUp ya que me permite trabajar con lo que se haya digitado en la caja de texto. Invoco la función SoloNumeros y en el parámetro invoco el objeto (this) en este caso sería la caja de texto. -->
      </BODY>
      </HTML>


      function SoloNumeros(Id){
      Id.value = Id.value.replace(/[^0-9.]/g, '');
      // El parámetro de la función es el objeto (this) que equivale a document.getElementById y me permite trabajar con los atributos del objeto, en este caso la caja de texto donde digito los caracteres.
      //Id.value = me permite asignar el nuevo valor de la caja de texto.
      // Id.value.replace(/[^0-9.]/g, '') me permite evaluar el texto escrito y reemplazar por vacio usando una expresión regular todo lo que sea diferente de los digitos del 0 al 9 y el punto
      // /[^0-9.]/g esta es la expresión regular .
      }

      Eliminar
    2. Funciona al 100, y al mil son mis gracias! me has salvado el dia! :D

      Eliminar
  14. hola me podrias explicar porque cuando meto letras en el de las letras valga la redundancia me dice tecla no aceptada? si se supone que es para que acepte solo letras y no numeros?
    y me podrias decir como es para validar email?
    de ante mano muchas gracias.

    ResponderEliminar
  15. HOla compañeros programadores, tengo una pregunta
    ¿Alguno de ustedes ha tenido problemas con la validacion SoloNumeros, en Firefox?

    Pregunto por que yo sip, en Edge y chrome no hay problemas, pero en Firefox no escribe el numero. sip sop.

    ResponderEliminar
  16. Gracias tu codigo fue utilizado en LARAVEL 5.8 como una macro se acopla a los standare de Laravel Collective .Muchas Grcias L. Vanessa

    ResponderEliminar
    Respuestas
    1. Con gusto, me alegra saber que puede ser utilizado en gestores como Laravel. No dudes en pregu tar si lo necesitas.

      Eliminar