Ver Mensaje Individual
  #2 (permalink)  
Antiguo 28/04/2018, 20: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

Cuando se ejecuta el código JavaScript, la variable productMainCategoryId toma el valor del <input> oculto (en este caso, 23) y la condición se evalúa. Como el conjunto de instrucciones se ejecutará si se cumple uno de los tres casos planteados en la condición y ya que el primero de ellos coincide, la variable nombre toma el valor del área de texto (vacía al inicio) y hace un llamado a la función, enviando los valores 0 y 20. En la función, la condición se termina cumpliendo puesto que 0 es menor a 20, por ende, se debe mostrar el primer mensaje de alerta.

No sé si en el documento hay uno o más formularios; pero, suponiendo que fuera el único, te aconsejaría lo siguiente:

1. Delega el evento de envío (submit) al formulario mediante jQuery:

Código Javascript:
Ver original
  1. $("form").on("submit", function(event){});

2. Cancela el envío usando el método .preventDefault():

Código Javascript:
Ver original
  1. $("form").on("submit", function(event){
  2.     event.preventDefault();
  3. });

3. Enseguida, obtén el valor de la primera variable y ejecuta la condición. En caso de cumplirse, envía al formulario como tercer argumento utilizando la palabra reservada this:

Código Javascript:
Ver original
  1. $("form").on("submit", function(event){
  2.     event.preventDefault();
  3.  
  4.     var productMainCategoryId = $('#productMainCategoryId').val();
  5.  
  6.     if (productMainCategoryId == 23 || productMainCategoryId == 27 || productMainCategoryId == 28){
  7.         $("small.float-xs-right").text('Limite 20 caracteres');
  8.  
  9.         //Almacenamos los valores
  10.         nombre = $('.product-message').val();
  11.  
  12.         validar(nombre.length, 20, this);
  13.     }
  14. });

4. Por último, en la función, en lugar de retornar valores booleanos, ejecuta el envío (en el caso de que se cumpla la condición de la función) utilizando el método .submit():

Código Javascript:
Ver original
  1. function validar(largo, limite, form){
  2.     if (largo < limite){
  3.         alert('La formula funciono con ' + largo + '. texto agregado');
  4.         form.submit();
  5.     }
  6.     else{
  7.         $("small.float-xs-right").html("<span style='color: #ff0000;'>Se excede el limite permitido</span>");
  8.         alert('La formula funciono, pero te pasaste de los caracteres');
  9.     }
  10. }

Todo junto:

Código HTML:
Ver original
  1. <form method="post" action="">
  2.     <div>
  3.         <label> Marcado</label>
  4.         <p></p>
  5.  
  6.         <!-- Este es el ID  y varia depediendo de la página que abra para el ejemplo puse 23-->
  7.         <input type="hidden" id="productMainCategoryId" value="23">
  8.  
  9.         <textarea placeholder="marca aca" class="product-message" maxlength="250"  name="marcado"></textarea>
  10.         <small class="float-xs-right">Máximo 200 caracteres</small>
  11.         <p></p>
  12.        
  13.         <button class="btn btn-primary float-xs-right" type="submit" name="submitCustomizedData">guardar</button>
  14.     </div>
  15. </form>

Código Javascript:
Ver original
  1. function validar(largo, limite, form){
  2.     if (largo < limite){
  3.         alert('La formula funciono con ' + largo + '. texto agregado');
  4.         form.submit();
  5.     }
  6.     else{
  7.         $("small.float-xs-right").html("<span style='color: #ff0000;'>Se excede el limite permitido</span>");
  8.         alert('La formula funciono, pero te pasaste de los caracteres');
  9.     }
  10. }
  11.  
  12. $(document).ready(function(){ //Para que delegue el evento al cargar el DOM
  13.     $("form").on("submit", function(event){
  14.         event.preventDefault();
  15.  
  16.         var productMainCategoryId = $('#productMainCategoryId').val();
  17.  
  18.         if (productMainCategoryId == 23 || productMainCategoryId == 27 || productMainCategoryId == 28){
  19.             $("small.float-xs-right").text('Limite 20 caracteres');
  20.  
  21.             //Almacenamos los valores
  22.             nombre = $('.product-message').val();
  23.  
  24.             validar(nombre.length, 20, this);
  25.         }
  26.     });
  27. });

Fíjate que quité el onsubmit="... del <form>. Ya no se recomienda seguir trabajando con código JavaScript inline, es decir, insertado en los elementos HTML. Para eso puedes colocarlo en un archivo .js e incluirlo en el documento mediante el elemento <script>.

__________________
«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