he estado observando un comportamiento extraño con el siguiente código:
$.fn.submit_to_remote = function() {
// I use .each instead of the .submit directly so I can save
// the 'submitEnabled' variable separately for each form
jQuery.each($(this), function() {
$(this).submit(function() {
form = $(this);
if (form.data('submitEnabled') == false) { alert('disabled'); return false; }
form.data('submitEnabled', false);
$.ajax({type: 'POST', url: 'url', data: data, dataType: 'script',
success: function(script) {
alert('success')
}
})
return false;
})
})
}
$('.submit_to_remote').submit_to_remote();
Así que, básicamente, al llamar submit_to_remote en una formulario (s), deshabilitará su envío normal y luego realizará una solicitud AJAX POST.
Lo extraño es que el formulario se publica varias veces, ya que se mostrará la alerta "deshabilitada". Como puede ver, lo estoy evitando al usar una "variable" guardada en el objeto de formulario, y verificando esa variable para ver si el formulario ya se ha enviado.
Al realizar más pruebas, parece que el culpable es la secuencia de comandos devuelta por la llamada AJAX. Déjame explicar un poco lo que estoy haciendo, así que es más claro.
El formulario se publica en el servidor y se devuelve un script. La secuencia de comandos muestra el formulario nuevamente, pero esta vez con mensajes de error para algunos campos. Tenga en cuenta que el formulario es completamente reemplazado.
El guión, al mostrar la nueva forma, ejecuta esto:
$('.submit_to_remote').submit_to_remote();
tengo que hacerlo porque de lo contrario, al hacer clic en el botón de enviar de nuevo, el formulario se envía normalmente, sin AJAX.
Por lo tanto, supongamos que un usuario envía el formulario y lo devuelve con los errores apropiados (no se muestra la alerta "deshabilitada"). Luego lo vuelve a enviar; esta vez la alerta 'deshabilitada' se muestra una vez. Ahora lo envía una vez más, ¡y esta vez la alerta se muestra dos veces! Y así sucesivamente ...
Parece que la reenvío de .submit se está añadiendo una y otra vez a cada solicitud, pero ¿por qué?
¿Podría ser que al usar .html() la forma original se guarda como un fantasma o algo así?
Gracias!
PD: En caso de que sea relevante, aquí está la secuencia de comandos que devuelve la llamada $ .ajax:
replace_content_with = 'the form and other stuff here';
$('.page-content').html(replace_content_with);
$('.submit_to_remote').submit_to_remote();
me olvidó mencionar que he intentado también, pero que extrañamente no funciona porque entonces el nuevo formulario no tendrá el comportamiento AJAX, incluso hago que estoy re-unión con el guión ... – Ivan
+1 Pude usar esto como una solución aquí: http://stackoverflow.com/questions/12340484/duplicated-entries-to-mysql-using-jquery-ajax-and-php/12340646#12340646 –