2010-03-03 117 views
1

我之前問過一個related question,但我現在需要回答的問題現在似乎已經出現了一些特定的切線,所以我認爲最好能提出一個新問題。jquery .submit return false not always working

我試圖阻止表單提交,直到頁面上的所有ajax調用都成功返回。

我對此有一個簡單的測試(開始調用時加1到計數器,成功時減1)。

我相信我應該能夠做到:

// can we submit yet? 
    $('#checkoutform').submit(function() { 
    if (ajaxcallcounter == 0) { 
     return true; 
    } 
    return false; 
    }); 

防止表單提交,直到計數器達到零(所有呼叫都完成),但由於某種原因,這似乎並沒有100%有效。

我不知道這是一個紅色的鯡魚,但所有從誰管理,以檢查出前調用已經完成了使用Mac的Safari客戶的報告(這可能僅僅是雖然是巧合)

您可以看到代碼正在執行here - 嘗試更改發貨國家以啓動一些ajax呼叫。當計數器> 0時,應該禁用右下角的提交按鈕。

+0

我沒有對您的答案。我會說你在整個代碼中做了大量的'ajaxcallcounter'遞增和遞減操作。您可能會發現有一個增量和減量函數可以被調用。然後你可以做一些簡單的日誌記錄,看看他們何時被調用。 – user113716 2010-03-03 14:25:58

+0

嗨帕特里克,有很多增加和減少,因爲有很多電話! :)我相信他們在正確的時間被調用,但表單被允許提交。 – Ashley 2010-03-05 11:09:10

回答

1

定義var ajaxcallcounter = 0;在你的功能之外。將它放在JavaScript文件的頂部以使其成爲global variable

通常,您可以通過停止傳播來確保您完全控制事件。每個事件處理程序都有一個隱式參數,通常定義爲「e」或「event」,您可以調用preventDefault(),如下所示:

$('#checkoutform').submit(function(e) { 
    e.preventDefault(); 
    if (ajaxcallcounter == 0) { 
     return true; 
    } 
    return false; 
    }); 
+0

他已經這麼做了。它不是全局的,但它在由jQuery「ready」函數形成的閉包中,其中定義了所有事件處理程序。此外,他幾乎肯定不希望每次事件都「防止違約」。 – Pointy 2010-03-03 14:03:46

+0

是的,我知道它是在目前定義的東西的範圍內,但是這種風格總是給我蕁麻疹。在其他地方定義一個函數(例如,另一個js包括)太容易了,並且很奇怪爲什麼事情不能正常工作。 不要說提問者想要阻止所有的默認事件處理,只是在這種情況下,他們想要顯式控制行爲。 – Tom 2010-03-03 16:08:18

+0

嗨,湯姆,尖尖 - 我不明白preventDefault足夠有信心使用它沒有更多的解釋。在湯姆提供的例子中,是否阻止默認的工作以不同的方式返回false,或者這是一種「腰帶和大括號」的方法? – Ashley 2010-03-05 11:11:49