2013-02-14 8 views
22

jQuery経由で送信を傍受し、最初にファイルがサーバーに存在するかどうかを確認したいと考えています。存在している場合は、要求を続行します。メッセージを表示しない場合は、要求を送信しないでください。これは私が持っているものです。jQueryを使用した傍受フォーム

$("#methodForm").submit(function(e){ 

    checkIndex('upload/segments.gen').done(function() { 
     return true; 
    }).fail(function() { 
     e.preventDefault(); 
     alert("No index present!"); 
     return false; 
    }); 
}); 

これはcheckIndex()次のとおりです。

function checkIndex(file){ 
    return $.ajax({ 
     url : file, 
     type:'HEAD' 
    }); 
} 

何が起こることはこれです:ファイルがサーバー上に存在するが、失敗してcheckIndex戻ります。まず、アラートポップアップが表示された後、それが継続され、ポストリクエストがサーバーに送信されます。

私はcheckIndex()を他の目的のためにも使用しています。期待どおりに動作するので、エラーは送信ルーチンのどこかにあると確信しています。しかし、私は何が間違っているかを見つけることができません。

+1

残念ながら、これは同期AJAX要求でのみ機能します。ボタンを無効にして、 'done'コールバックで有効にする必要があります。 – Alexander

答えて

43

コールバックから非同期メソッド(ajaxなど)に戻ることはできません。代わりに、すべての提出を防ぎ、準備ができたら提出してください。

$("#methodForm").submit(function(e){ 
    e.preventDefault(); 
    var form = this; 
    checkIndex('upload/segments.gen').done(function() { 
     form.submit(); // submit bypassing the jQuery bound event 
    }).fail(function() { 
     alert("No index present!"); 
    }); 
}); 
+3

これは私のために働いていません。私は "TypeError:form.submitは関数ではありません"を取得し、$(form).submit()を使用すると、何度も送信ハンドラを呼び出します。 – Rooster242

+1

あなたは 'id =" submit "という要素を持っています。それを他のものに変更してください。 –

2

checkIndexは非同期なので、何かを返すときにフォームが送信され、返される文も別のスコープにあります。

$("#methodForm").submit(function(e){ 
    e.preventDefault(); //prevent submit 
    var self = this; 
    checkIndex('upload/segments.gen').done(function() { 
     self.submit(); //submit if ajax OK 
    }).fail(function() { 
     alert("No index present!"); 
    }); 
}); 
+0

@KevinB - はい、それを変更しました! – adeneo

関連する問題