私はこの提出ハンドラを持っています。要求が行われると、複数のパートのリソースURL(指定されたIDを持つオブジェクトと子オブジェクトをパスの一部として参照する)を指すようにフォームが設定されています。フォームを送信すると、要求された要求が送信されるだけでなく、要求URLから削除された子オブジェクトのIDと名前の2番目の要求も行われます。jQuery - AJAX form double submission
TL; DR:/foo/1/bar/2
に、その後/foo/1
にリクエストします。その2回目のリクエストを停止する必要があります。
私は標準event.preventDefault()
を使用して、return false
を投じて測定しました。ここでは見られませんが、私は別のSOの答えをどこかで見てきたので、$form.submit(false)
も試しましたが、それは悪く見えて、とにかく動作しなかったので削除しました。
function submitForm(e) {
e.preventDefault();
var $form = $(e.target);
$form.find('[type="submit"], [type="button"]').prop('disabled', true);
var formData = {
// data
};
$.ajax({
url: $form.prop('action'),
method: ($form.find('[name="_method"]').val() || $form.prop('method')),
data: formData,
error: function(response, status) {
console.log(response);
},
success: function(response, status) {
console.log(response);
},
complete: function() {
$form.find('[type="submit"], [type="button"]').prop('disabled', false);
}
});
return false;
}
$(document).ready(function(){
$('#myform').on('submit', submitForm);
});
AJAXコールを削除するとどこかに問題があると思うので、フォームの送信が予期したとおりに停止します。 AJAX呼び出し自体が実際に2つの要求を出す可能性もあると思いますが、それがなぜそれを行うのかはわかりません。また、ユーザーがエンターキーを押しても、送信ボタンを積極的にクリックしても起こっているようです。
フォームは1つのインスタンスとしてのみ存在します。フォーム内のプロパティとフィールドは他のイベントによって更新されますが、送信イベントが処理される場所は1つしかなく、その質問には文書化されています。とにかく私は 'off()'で連鎖しようとしましたが、期待どおり効果がありませんでした。私は 'console.log( 'submitted');をハンドラの先頭に追加しました。これは送信ごとに1回しか表示されません。 –
誤ってスクリプトをページに2回挿入していないことを確認しましたか? :) – Luke
モーダルダイアログとしてフォームを一度含めることと、その値を単純に更新することが常に計画されていたため、一度しかありませんでした。問題のスクリプトは、ダイアログのHTMLとともに表示されます。私はまた、クエリの設定パラメータを引き出し、自分の変数にそれらを入れて、コンソールにそれらをダンプし、私は期待の設定値を取得しています試してみました。この問題は、AJAX呼び出し自体には間違いありません。 –