2013-02-14 60 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請求。你應該禁用該按鈕,並啓用它'完成'回調 – Alexander 2013-02-14 18:48:22

回答

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 2014-02-11 01:22:55

+1

你有一個'id =「submit」'元素,把它改成別的東西。 – 2014-02-11 01:23:36

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!"); 
    }); 
}); 
+0

@KevinB - 是的,它會改變它! – adeneo 2013-02-14 18:53:09