2018年の更新:この古い回答についていくつかのポイントを得たので、重複した送信が無害になるように操作をべき等にすることが最善の解決策であることを追加したかっただけです。
たとえば、フォームが注文を作成する場合、一意の ID をフォームに入れます。サーバーは、その ID を持つ注文作成リクエストを初めて確認すると、それを作成して「成功」と応答する必要があります。後続の送信も「成功」と応答する必要がありますが (クライアントが最初の応答を取得しなかった場合)、何も変更しないでください。
競合状態を防ぐために、データベース内の一意性チェックによって重複を検出する必要があります。
あなたの問題はこの行だと思います:
$('input').attr('disabled','disabled');
フォームが送信するはずのデータを含むすべての入力を無効にしています。
送信ボタンだけを無効にするには、次のようにします。
$('button[type=submit], input[type=submit]').prop('disabled',true);
ただし、これらのボタンが無効になっている場合でも、IEがフォームを送信するとは思いません。別のアプローチをお勧めします。
それを解決するjQueryプラグイン
次のコードでこの問題を解決しました。ここでの秘訣は、jQuery を使用しdata()
て、フォームが送信済みかどうかをマークすることです。そうすれば、送信ボタンをいじる必要がなくなります。
// 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;
};
次のように使用します。
$('form').preventDoubleSubmission();
ページの読み込みごとに複数回の送信を許可する必要がある AJAX フォームがある場合は、それを示すクラスを指定して、次のようにセレクターから除外できます。
$('form:not(.js-allow-double-submission)').preventDoubleSubmission();