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