2011-07-24 10 views
7

Estoy teniendo un ciclo infinito utilizando el código jQuery, sé por qué pero no sé cómo solucionar este problema:Validar y enviar un formulario sin entrar en un ciclo infinito?

<form id="submitme"> 
    <input value="" name="n1" id="n1" type="text"/> 
    <input value="Send" type="button"/> 
</form> 
<script> 
    $('#submitme').bind('submit', function() { 
     $.post('validate.php', 'value=' + $('#n1').val(), function (data) { 
      if (data == "true") 
       $('#submitme').submit(); 
     }); 
    }); 
</script> 
+0

¿Por qué fue esta pregunta downvoted? Parece una pregunta perfectamente clara y razonable para mí. Por favor, deje un comentario cuando downvoting. +1 de mi parte –

Respuesta

3

El plugin jQuery.validate se encarga de esto y yo recomendaría encarecidamente que usarlo:

$('#submitme').validate({ 
    rules: { 
     n1: { 
      remote: { 
       url: 'validate.php', 
       type: 'post' 
      } 
     } 
    } 
}); 

Pero si no quiere usarlo otra posibilidad es utilizar una variable global, así:

$('#submitme').submit(function() { 
    if (!$.formSubmitting) { 
     var $form = $(this); 
     $.post('validate.php', { value: $('#n1').val() }, function (data) { 
      if (data == 'true') { 
       // set the global variable to true so that we don't enter 
       // the infinite loop and directly submit the form 
       $.formSubmitting = true; 
       $form.submit(); 
      } 
     }); 
     return false; 
    } 

    return true;      
}); 

Sólo una observación: la bu tton que ha colocado dentro del formulario no es un botón de enviar, por lo que al hacer clic en él no se activará el controlador submit. Usted debe hacer un botón de enviar:

<input value="Send" type="submit" /> 
0

No soy un experto en jQuery, pero en Prototype, al escribir un controlador de eventos para una acción y que no dejan la acción predeterminada, de lo que será ejecutado después de que se haya completado toda la funcionalidad de devolución de llamada. Así que con sólo girar la instrucción if-else que debería ser capaz de evitar un bucle infinito:

$('#submitme').bind('submit', function(event) { 
    $.post('validate.php', 'value=' + $('#n1').val(), function (data) { 
    if (data != "true") 
     // if validation has failed, prevent default action (submit) 
     event.preventDefault(); 
    }); 
    // if default action was not prevented it will be executed 
}) 
+0

Sí, pero aquí la idea es ejecutar la acción predeterminada. Pero haga esto solo si la solicitud AJAX tuvo éxito. Entonces el formulario debe ser enviado. Con su código, debido a que nunca llama al método 'preventDefault' con la antelación suficiente, el formulario se enviará inmediatamente y ni siquiera tendrá tiempo para ejecutar la solicitud AJAX, que debe realizar la validación. –

0

me encontré con esta solución:

<form id="submitme"> 
    <input value="" name="n1" id="n1" type="text"/> 
    <input value="Send" type="button"/> 
</form> 
<script> 
    $('#submitme').bind('submit', function() { 
     if ($.data($('#submitme'), 'validated')) 
      return true; 
     $.post('validate.php', 'value=' + $('#n1').val(), function (data) { 
      if (data == "true") { 
       $.data($('#submitme'), 'validated', true); 
       $('#submitme').submit(); 
      } 
     }); 
     return false; 
    }); 
</script> 
Cuestiones relacionadas