Atualização em 2018 : recebi alguns pontos para esta resposta antiga e só queria acrescentar que a melhor solução seria tornar a operação idempotente para que envios duplicados sejam inofensivos.
Por exemplo, se o formulário criar um pedido, coloque um ID exclusivo no formulário. A primeira vez que o servidor vê uma solicitação de criação de pedido com esse ID, deve criá-la e responder "sucesso". Os envios subsequentes também devem responder "com êxito" (caso o cliente não tenha recebido a primeira resposta), mas não devem mudar nada.
As duplicatas devem ser detectadas por meio de uma verificação de exclusividade no banco de dados para evitar condições de corrida.
Eu acho que seu problema é esta linha:
$('input').attr('disabled','disabled');
Você está desativando TODAS as entradas, incluindo, eu acho, aquelas cujos dados o formulário deve enviar.
Para desativar apenas os botões de envio, você pode fazer o seguinte:
$('button[type=submit], input[type=submit]').prop('disabled',true);
No entanto, acho que o IE não enviará o formulário se esses botões estiverem desativados. Eu sugeriria uma abordagem diferente.
Um plugin jQuery para resolvê-lo
Acabamos de resolver esse problema com o seguinte código. O truque aqui é usar o jQuery data()
para marcar o formulário como já enviado ou não. Dessa forma, não precisamos mexer nos botões de envio, o que assusta o 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;
};
Use-o assim:
$('form').preventDoubleSubmission();
Se houver formulários AJAX que devam ser autorizados a enviar várias vezes por carregamento de página, você poderá atribuir a eles uma classe indicando isso e excluí-los do seletor da seguinte maneira:
$('form:not(.js-allow-double-submission)').preventDoubleSubmission();