Ver Mensaje Individual
  #4 (permalink)  
Antiguo 28/04/2018, 23:59
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problema con función Jquery

Lo que quiere decir el mensaje es que no debes definir funciones dentro de bloques de condición sino por fuera y, en dichos bloques de condición, solo harías las respectivas llamadas. Justo como en el código que mostraste al inicio.

Por otro lado, ya que utilizas varios formularios y los procesos son similares, te conviene abstraer las instrucciones que se repiten y, mediante el uso de variables, modificarías los límites de las condiciones y mostrarías los mensajes respectivos.

Por ejemplo, supongamos que tengo tres formularios en el mismo documento:

Código HTML:
Ver original
  1. <form class="fdw">
  2.     <label>Ingrese el dato:</label>
  3.     <input type="text" name="x" />
  4.  
  5.     <input type="hidden" name="y" value="1" />
  6.     <input type="submit" />
  7. </form>
  8.  
  9. <form class="fdw">
  10.     <label>Ingrese el dato:</label>
  11.     <input type="text" name="x" />
  12.  
  13.     <input type="hidden" name="y" value="2" />
  14.     <input type="submit" />
  15. </form>
  16.  
  17. <form class="fdw">
  18.     <label>Ingrese el dato:</label>
  19.     <input type="text" name="x" />
  20.  
  21.     <input type="hidden" name="y" value="3" />
  22.     <input type="submit" />
  23. </form>

Ahora, según el valor del <input> oculto, quiero establecer un máximo de caracteres que se puedan escribir en la caja de texto, además de mostrar un mensaje diferente para cada caso. Pues, lo que haría sería:

1. Delegar el evento de envío a todos los formularios que posean la clase "fdw".
2. Definir una función que recibirá como argumentos a los valores que enviaré desde cualquiera de los formularios.
3. Recoger la cantidad de caracteres escritas en la caja de texto y del campo oculto, cualquiera sea el formulario en el que haya pulsado el botón de envío, además del formulario mismo mediante la palabra reservada this.
4. Hacer el llamado a la función y enviar los valores recogidos en el punto anterior.
5. En la función, utilizar una estructura de decisión múltiple para que, de acuerdo con el valor del campo oculto del formulario desde el que se enviaron los datos, se compare la extensión del contenido de la caja de texto con un valor predeterminado y así se pueda mostrar un mensaje de alerta personalizado, además de decidir si se procesará el contenido del formulario o no.

Código Javascript:
Ver original
  1. function evaluar(extension, caso, formulario){
  2.     var limite, valido = true;
  3.  
  4.     switch (caso){
  5.         case 1:
  6.             if (extension > 25){
  7.                 limite = 25;
  8.                 valido = false;
  9.             }
  10.             break;
  11.  
  12.         case 2:
  13.             if (extension > 35){
  14.                 limite = 35;
  15.                 valido = false;
  16.             }
  17.             break;
  18.  
  19.         case 3:
  20.             if (extension > 45){
  21.                 limite = 45;
  22.                 valido = false;
  23.             }
  24.             break;
  25.     }
  26.  
  27.     //Se mostrará el mensaje de alerta con el límite establecido en cualquiera de los casos
  28.     alert("No debe escribir más de " + limite + " caracteres");
  29.  
  30.     //Si el valor de "valido" sigue siendo "true", es decir, si no se excedió el límite de caracteres, se enviarán los datos
  31.     if (valido) formulario.submit();
  32. }
  33.  
  34. $(".fdw").on("submit", function(event){
  35.     event.preventDefault();
  36.  
  37.     var a = $(this).find("[name=x]").val(),
  38.         b = $(this).find("[name=y]").val(),
  39.         c = this;
  40.  
  41.     extension(a, b, c);
  42. });

De esta manera, logramos ahorrar muchas líneas de código y hacerlo más legible y reutilizable.

Y ya que veo que tienes condiciones múltiples, en los case de la estructura de decisión múltiple también puedes usarlas:

Código Javascript:
Ver original
  1. case x != 1 || (y == 2 && z == 3):
  2.     //Instrucciones X
  3.     break;
  4.  
  5. case (x == 4 && y == 5) || z != 6:
  6.     //Instrucciones Y
  7.     break;

O si debe ejecutarse el mismo conjunto de instrucciones para diferentes casos:

Código Javascript:
Ver original
  1. case 1: case 2: case 3:
  2.     //Instrucciones
  3.     break;

Trata de adaptar esto a lo que necesitas.

NOTA: Aunque pude utilizar otro campo oculto para establecer el límite de caracteres y así lograr hacerlo todo con menos líneas, decidí dejarlo así para que veas que, el uso de una condición múltiple (que la necesitarás para esas condiciones múltiples), te puede ayudar a reducir la cantidad de líneas escritas a comparación de las condiciones anidadas.

__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 29/04/2018 a las 13:25 Razón: Nota