Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/05/2014, 17:22
aprendiz94
Invitado
 
Mensajes: n/a
Puntos:
[Aporte] Formulario con JavaScript puro

Buenas, estoy siguiendo un curso de JavaScript básico y decidí hacer un formulario con las validaciones básicas usando JavaScript puro, sin jQuery u otras herramientas, para practicar lo que he aprendido.

Ya había tocado JavaScript antes así que no fue complicado. Pero tengo poca experiencia y todo lo que había visto antes era muy superficial, por eso creo que a mi código le falta mucho por corregir y mejorar. Antes todo lo que necesitaba lo buscaba en Google sin saber mucho de JavaScript y además para muchas cosas siempre dependía de jQuery.

Bueno, les dejo el código del formulario, espero que les sea de utilidad y me ayuden a mejorarlo. Todas las críticas son bienvenidas.
Es sólo una práctica, el objetivo es mostrar las validaciones básicas de un formulario.

Características principales:
  • Validaciones en tiempo real.
  • Mensajes personalizados: se le puede pasar un texto personalizado, estilos inline o clases css, se puede elegir el lugar (un elemento) donde va a aparecer el mensaje y si va a aparecer antes o después del elemento.
  • Límite de caracteres en un textarea.
  • Validación de email.
  • Validación de caracteres permitidos.
  • Validación de campos vacíos, listas y checkboxs no seleccionados, etc.


script.js (1/2)
Código Javascript:
Ver original
  1. window.onload = function() {
  2.  
  3.  
  4.     // Evento para validar el formulario
  5.  
  6.     document.formulario.enviar.onclick = validar;
  7.  
  8.  
  9.     // Evento para el campo "Nombre"
  10.  
  11.     document.formulario.nombre.onblur = function() {
  12.  
  13.         var campoName = this.name;
  14.         var comprobarNombreVacio = comprobarCampoVacio(this);
  15.  
  16.         if (! comprobarNombreVacio) {
  17.             mostrarMensaje(this, "mensaje_" + campoName, "Debes ingresar tu nombre", "mensaje_style_1", "before");
  18.         } else {
  19.             borrarMensaje("mensaje_" + campoName);
  20.         }
  21.  
  22.     };
  23.  
  24.  
  25.     // Evento para el campo "Email"
  26.  
  27.     document.formulario.email.onblur = function() {
  28.  
  29.         var campoName = this.name;
  30.         var comprobarEmailVacio = comprobarCampoVacio(this);
  31.         var validarEmail = this.value.match(/^[a-zA-Z0-9_\-]+([\.][a-zA-Z0-9_\-]+)*\@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9]{2,4})+$/);
  32.  
  33.         if (! comprobarEmailVacio) {
  34.             mostrarMensaje(this, "mensaje_" + campoName, "Debes ingresar tu email", "mensaje_style_1", "before");
  35.         } else if (! validarEmail) {
  36.             mostrarMensaje(this, "mensaje_" + campoName, "El email no es válido", "mensaje_style_1", "before");
  37.         } else {
  38.             borrarMensaje("mensaje_" + campoName);
  39.         }
  40.  
  41.     };
  42.  
  43.  
  44.     // Eventos para el campo "telefono"
  45.  
  46.     document.formulario.telefono.onkeypress = function(evento) {
  47.  
  48.         var evento = evento || window.event;
  49.         var caracterCode = evento.charCode || evento.keyCode;
  50.         var caracter = String.fromCharCode(caracterCode);
  51.         var campoName = this.name;
  52.  
  53.         if(! comprobarTeclaPresionada(caracter, caracterCode, " ()+0123456789")) {
  54.             mostrarMensaje(this, "mensaje_" + campoName, "Carácter no válido", "mensaje_style_1", "before");
  55.             return false;
  56.         } else {
  57.             borrarMensaje("mensaje_" + campoName);
  58.             return true;
  59.         }
  60.  
  61.     }
  62.  
  63.     document.formulario.telefono.onblur = function() {
  64.  
  65.         var campoName = this.name;
  66.         var comprobarTelefonoVacio = comprobarCampoVacio(this);
  67.  
  68.         if (! comprobarTelefonoVacio) {
  69.             mostrarMensaje(this, "mensaje_" + campoName, "Debes ingresar tu teléfono", "mensaje_style_1", "before");
  70.         } else {
  71.             borrarMensaje("mensaje_" + campoName);
  72.         }
  73.  
  74.     }
  75.  
  76.     document.formulario.telefono.onpaste = function(elEvento) {
  77.         return false;
  78.     }
  79.  
  80.  
  81.     // Eventos para el textarea "texto"
  82.  
  83.     document.formulario.texto.onkeypress = function(elEvento) {
  84.  
  85.         var evento = elEvento || window.event;
  86.  
  87.         if (comprobarLimiteDeTexto(evento, this, 10)) {
  88.             return true;
  89.         } else {
  90.             return false;
  91.         }
  92.  
  93.     }
  94.  
  95.     document.formulario.texto.onkeyup = function(elEvento) {
  96.  
  97.         var valorLongitud = this.value.length;
  98.  
  99.         if (valorLongitud <= 10) {
  100.             mostrarMensaje(this, "mensaje_" + this.name, (10-valorLongitud)+" carácteres restantes", "mensaje_style_1", "before");
  101.         }
  102.  
  103.     }
  104.  
  105.     document.formulario.texto.onblur = function() {
  106.  
  107.         var campoName = this.name;
  108.         var comprobarTextoVacio = comprobarCampoVacio(this);
  109.  
  110.         if (! comprobarTextoVacio) {
  111.             mostrarMensaje(this, "mensaje_" + campoName, "Debes escribir un texto", "mensaje_style_1", "before");
  112.         } else {
  113.             borrarMensaje("mensaje_" + campoName);
  114.         }
  115.  
  116.     };
  117.  
  118.     document.formulario.texto.onpaste = function(elEvento) {
  119.         return false;
  120.     }
  121.  
  122.  
  123.     // Eventos para la lista de nombre "lista"
  124.  
  125.     document.formulario.lista.onblur = function() {
  126.  
  127.         var listaSelectedIndex = this.selectedIndex;
  128.         var opcionSeleccionada = this.options[listaSelectedIndex];
  129.         var campoName = this.name;
  130.         if (listaSelectedIndex == 0) {
  131.             mostrarMensaje(this, "mensaje_" + campoName, "Debes elegir tu país", "mensaje_style_1", "before");
  132.         } else {
  133.             borrarMensaje("mensaje_" + campoName);
  134.         }
  135.  
  136.     }
  137.  
  138.  
  139.     // Eventos para desactivar/activar los chechboxs
  140.  
  141.     document.getElementById("opcion_activar").onclick = opcionesActivarDesactivar;
  142.  
  143.     document.getElementById("opcion_desactivar").onclick = opcionesActivarDesactivar;
  144.  
  145.     function opcionesActivarDesactivar() {
  146.  
  147.         campos = document.getElementById("opc_checkboxs").getElementsByTagName("input");
  148.  
  149.         for (i in campos) {
  150.             if (campos[i].disabled == true && this.id == "opcion_activar") {
  151.                 campos[i].disabled = false;
  152.             } else if (campos[i].disabled == false && this.id == "opcion_desactivar") {
  153.                 campos[i].disabled = true;
  154.             }
  155.         }
  156.  
  157.     }
  158.  
  159. }
  160.  
  161.  
  162. function comprobarCampoVacio(campo) {
  163.  
  164.     var valor = campo.value;
  165.  
  166.     if (valor == null || valor == 0 || valor.match(/^\s+$/)) {
  167.         return false;
  168.     } else {
  169.         return true;
  170.     }
  171.  
  172. }
  173.  
  174.  
  175. function comprobarInputCaracteres(campo, caracteresPermitidos) {
  176.  
  177.     var caracteres = campo.value.split("");
  178.  
  179.     var permitir = true;
  180.     for (i in caracteres) {
  181.         if (caracteresPermitidos.indexOf(caracteres[i]) == -1) {
  182.             permitir = false;
  183.             break;
  184.         }
  185.     }
  186.  
  187.     return permitir;
  188.  
  189. }
  190.  
  191.  
  192. function comprobarLimiteDeTexto(evento, campo, limite) {
  193.  
  194.     var teclasEspeciales = [8, 46, 37, 39, 116];
  195.  
  196.     if (campo.value.length >= limite) {
  197.  
  198.         var codigoCaracter = evento.charCode || evento.keyCode;
  199.         var resultado = false;
  200.         for (i in teclasEspeciales) {
  201.             if (codigoCaracter == teclasEspeciales[i]) {
  202.                 resultado = true;
  203.             }
  204.         }
  205.  
  206.         return resultado;
  207.  
  208.     } else {
  209.         return true;
  210.     }
  211.  
  212. }
  213.  
  214.  
  215. function comprobarTeclaPresionada(caracter, caracterCode, caracteresPermitidos) {
  216.  
  217.     var teclasEspeciales = [8, 46, 37, 39, 116];
  218.  
  219.     var teclaEspecial = false;
  220.     for (i in teclasEspeciales) {
  221.         if (caracterCode == teclasEspeciales[i]) {
  222.             teclaEspecial = true;
  223.             break;
  224.         }
  225.     }
  226.  
  227.     if (teclaEspecial) {
  228.         return true;
  229.     } else if (caracteresPermitidos.indexOf(caracter) == -1) {
  230.         return false;
  231.     } else {
  232.         return true;
  233.     }
  234.  
  235. }
  236.  
  237.  
  238. function camelCase(cadena) {
  239.     return cadena.toLowerCase().replace(/-(.)/g, function(match, grupo) {
  240.         return grupo.toUpperCase();
  241.     });
  242. }
  243.  
  244. function mostrarMensaje(elemento, idCajaMensaje, mensajeTxt, estilos, afterBefore) {
  245.  
  246.     var cajaMsg = document.getElementById(idCajaMensaje);
  247.  
  248.     if (cajaMsg) {
  249.         cajaMsg.innerHTML = mensajeTxt;
  250.     } else {
  251.  
  252.         var caja = document.createElement("div");
  253.         var mensaje = document.createTextNode(mensajeTxt);
  254.  
  255.         caja.appendChild(mensaje);
  256.         caja.id = idCajaMensaje;
  257.  
  258.         var separar;
  259.         estilos = estilos.split(";");
  260.         for (i in estilos) {
  261.  
  262.             separar = estilos[i].split(":");
  263.  
  264.             if (separar.length == 1) {
  265.                 caja.className = separar[0];
  266.                 break;
  267.             } else {
  268.                 caja.style[camelCase(separar[0]).replace(/(\s)/g, '')] = separar[1];
  269.             }
  270.  
  271.         }
  272.  
  273.         if (afterBefore == "before") {
  274.             elemento.parentNode.insertBefore(caja, elemento);
  275.         } else if (afterBefore == "after") {
  276.             insertAfter(caja, elemento);
  277.         }
  278.  
  279.     }
  280.  
  281. }
  282.  
  283.  
  284. function borrarMensaje(idCaja) {
  285.     var cajaMsg = document.getElementById(idCaja);
  286.     if (cajaMsg) {
  287.         cajaMsg.parentNode.removeChild(cajaMsg);
  288.     }
  289. }
  290.  
  291.  
  292. function insertAfter(nuevoNodo, nodoExistente) {
  293.     if (nodoExistente.nextSibling) {
  294.         nodoExistente.parentNode.insertBefore(nuevoNodo, nodoExistente.nextSibling);
  295.     } else {
  296.         nodoExistente.parentNode.appendChild(nuevoNodo);
  297.     }
  298. }

Última edición por zerokilled; 08/05/2014 a las 17:34 Razón: arreglar código de acuerdo al post data del autor