Ver Mensaje Individual
  #5 (permalink)  
Antiguo 29/04/2018, 07:18
eridamega
 
Fecha de Ingreso: enero-2013
Mensajes: 9
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Problema con función Jquery

Cita:
Iniciado por Alexis88 Ver Mensaje
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.

Hola Alexis,muchas gracias por tu respuesta Solamente estoy usando un solo formualario en una plantilla TPL.
Tengo un grupo de articulos en categorias (submenus) A, B, y C. Mediente una variable de prestashop {$product.id_category_default} obtenido el ID Value de la categoría por ej 23 ó 28 o 31 etc que en el codigo seria el value ,
Los artículos de la categria A admiten en el textarea 20 caracteres, los de la categoría B 18 y la C 25. (en el mismo texarea y en el mismo formulario)
Obtengo el ID
Código:
var productMainCategoryId = $('#productMainCategoryId').val();
del la plantilla insertando un input
Código:
<input type="hidden" id="productMainCategoryId" value="{$product.id_category_default}"
El formulario del texaerea es el mismo para todos los articulos pero el value cambia dependiendo en que submenu este el articulo, entonces podria ser 21, 23, 29, ect.
como la plantilla me muestra la misma info para todos los articulos por ejmplo, máximo 200 caracteres no puedo editarlo directamente en la plantilla.

En resumen anhelo

1. Reemplazar
Código:
<small class="float-xs-right">Máximo 200 caracteres</small>
por el limite que admite ese articulo cuando el cliente abra la el producto que desea comprar
Código:
if (productMainCategoryId == 23 || productMainCategoryId == 27 || productMainCategoryId == 28) {
    $("small.float-xs-right").text('Limite 20 caracteres');
en estos casos la categoría por ejem. Zapatos blusas y pantalones tienen limite de 20
2. Que me limite a X caracteres dependiendo la categoría (submenu) donde este el articulo.
3. Que si la persona escribe demás y clic en submit aparezca un mensaje en rojo que diga que se paso
Código:
$("small.float-xs-right").html("<span style='color: #ff0000;'>Se excede el limite permitido</span>");
El punto 1 debe suceder cuando la persona abre el articulo (producto que quiere comprar).

Por el momento eso lo logre con la el script que hice en la respuesta #3 ¿Que pasa si la uso de esa forma? habría errores mas adelante o tendré problemas ?

Nuevamente gracias y te pido disculpas

Última edición por eridamega; 29/04/2018 a las 07:33