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返回失败。首先我看到警报弹出窗口,然后它继续并将发布请求发送到服务器。

我也将它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 是异步的,所以当它返回任何东西时,表单已提交,并且返回语句也在不同的范围内,尝试更像这样的东西:

$("#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 回答