46

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失敗して戻ります。最初にアラートポップアップが表示され、次に続行してサーバーにPOSTリクエストを送信します。

checkIndex()期待どおりに機能する他の目的にもを使用しているので、エラーは送信ルーチンのどこかにあると確信しています。しかし、私はそれの何が悪いのかを知ることができません。

4

2 に答える 2

77

コールバックから非同期メソッド (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!");
    });
});
于 2013-02-14T18:49:25.103 に答える
2

実際にはそのようには機能しません。checkIndex は非同期であるため、何かを返すまでにフォームが送信され、return ステートメントも別のスコープにあるため、次のようなことを試してください。

$("#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!");
   });
});
于 2013-02-14T18:48:55.210 に答える