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 <input type="text" name="x" />
<input type="hidden" name="y" value="1" />
<input type="text" name="x" />
<input type="hidden" name="y" value="2" />
<input type="text" name="x" />
<input type="hidden" name="y" value="3" />
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 originalfunction evaluar(extension, caso, formulario){
var limite, valido = true;
switch (caso){
case 1:
if (extension > 25){
limite = 25;
valido = false;
}
break;
case 2:
if (extension > 35){
limite = 35;
valido = false;
}
break;
case 3:
if (extension > 45){
limite = 45;
valido = false;
}
break;
}
//Se mostrará el mensaje de alerta con el límite establecido en cualquiera de los casos
alert("No debe escribir más de " + limite + " caracteres");
//Si el valor de "valido" sigue siendo "true", es decir, si no se excedió el límite de caracteres, se enviarán los datos
if (valido) formulario.submit();
}
$(".fdw").on("submit", function(event){
event.preventDefault();
var a = $(this).find("[name=x]").val(),
b = $(this).find("[name=y]").val(),
c = this;
extension(a, b, c);
});
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 originalcase x != 1 || (y == 2 && z == 3):
//Instrucciones X
break;
case (x == 4 && y == 5) || z != 6:
//Instrucciones Y
break;
O si debe ejecutarse el mismo conjunto de instrucciones para diferentes casos:
Código Javascript
:
Ver originalcase 1: case 2: case 3:
//Instrucciones
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.