Actualización en 2018 : acabo de recibir algunos puntos para esta vieja respuesta, y solo quería agregar que la mejor solución sería hacer que la operación sea idempotente para que los envíos duplicados sean inofensivos.
Por ejemplo, si el formulario crea un pedido, coloque una ID única en el formulario. La primera vez que el servidor ve una solicitud de creación de pedido con esa identificación, debe crearla y responder "éxito". Los envíos posteriores también deberían responder "éxito" (en caso de que el cliente no obtuviera la primera respuesta) pero no deberían cambiar nada.
Los duplicados deben detectarse mediante una comprobación de unicidad en la base de datos para evitar condiciones de carrera.
Creo que tu problema es esta línea:
$('input').attr('disabled','disabled');
Está deshabilitando TODAS las entradas, incluidas, supongo, aquellas cuyos datos se supone que debe enviar el formulario.
Para deshabilitar solo los botones de envío, puede hacer esto:
$('button[type=submit], input[type=submit]').prop('disabled',true);
Sin embargo, no creo que IE envíe el formulario si incluso esos botones están deshabilitados. Sugeriría un enfoque diferente.
Un complemento jQuery para resolverlo
Acabamos de resolver este problema con el siguiente código. El truco aquí es usar jQuery's data()
para marcar el formulario como ya enviado o no. De esa manera, no tenemos que meternos con los botones de envío, lo que asusta a IE.
// jQuery plugin to prevent double submission of forms
jQuery.fn.preventDoubleSubmission = function() {
$(this).on('submit',function(e){
var $form = $(this);
if ($form.data('submitted') === true) {
// Previously submitted - don't submit again
e.preventDefault();
} else {
// Mark it so that the next submit can be ignored
$form.data('submitted', true);
}
});
// Keep chainability
return this;
};
Úselo así:
$('form').preventDoubleSubmission();
Si hay formas de AJAX que debe ser permitido enviar múltiples veces por carga de la página, puede darles una clase que indica que, a continuación, les excluyen de su selector de la siguiente manera:
$('form:not(.js-allow-double-submission)').preventDoubleSubmission();