2011-04-30 115 views
5

我把我的測試代碼放在jsfiddle上。 請檢查它herejQuery表單驗證:爲什麼要驗證兩次?

當我點擊提交按鈕,爲什麼我得到兩次警報消息?

+0

這對我來說似乎不是問題。除了檢查所需的數據是否已輸入並且有效之外,您不應該執行所需功能中的任何操作。你不知道它會被調用多少次。 – AndrewR 2011-04-30 06:46:49

+0

@AndrewR我正在做大量的條件驗證,所以它需要擔心應該如何調用所需的函數...... – Vikas 2011-04-30 06:50:51

+0

實際上是否正在更改數據或其他可能導致第二次驗證失敗的情況,以防萬一它被調用了多次? – AndrewR 2011-04-30 06:53:00

回答

0

據我所知,這是因爲你有一個類型爲「submit」的按鈕。因此,jQuery驗證運行兩次;一次當文本輸入失去焦點時,再次當頁面重新加載時。如果我錯了,我希望有人糾正我,但當我改變按鈕鍵入「按鈕」雙重警報似乎消失。

HTH。

編輯:好吧,看起來我錯了,所以忽略了上面的建議。一定是我正在使用的瀏覽器的一個暫時的怪癖。

+1

更改類型提交到按鈕 – 2011-04-30 06:22:03

+0

我沒有得到它的工作你清除你的緩存?您可能正在使用JavaScript的緩存版本。 – 2011-04-30 06:24:17

+0

@mahesh是正確的,如果我調用form.valid()方法,然後再次警告兩次。 – Vikas 2011-04-30 06:25:47

4

您正在濫用驗證功能,並且AndrewR會提到。有許多事情會改變驗證函數被調用的次數。在你的榜樣,「規定」(這是你的情況的函數)正在呼籲:

  • 的text1失去焦點(如果值已經改變)
  • 提交按鈕點擊
  • 形式提交
  • 形式加載

這是正確的,因爲當你動過它,以及其他一些事件的良好驗證會告訴你你剛纔編輯的字段錯誤。

如果要執行特定字段驗證的功能,最好添加一個OnValidating回調以將自定義方法運行到該字段。規則應該只是規則而不是方法,這就是回調的目的(是的,回調也會被執行多次,因爲許多事件觸發驗證方法)。

如果你真的需要這只是一次火,只有在提交表單,然後禁用默認的驗證行爲,並添加手動的validate()調用類似如下:

$("#test1").submit(function() { 
    $("#test1").validate(); 
}); 

平掉的那一刻,但是如果你需要的話,我可以回頭提供一個例子。

PS:另一種着名的雙重事件觸發方式是通過綁定事件兩次。如果您不確定如何初始化頁面,那麼在綁定事件之前「解除綁定」通常更安全。這絕對不是你的情況的問題,但它可能會出現,因爲你試圖解決你的問題,並可能導致混亂 - 它對我來說過去:)

1

這不是一個答案,這是一個解決方法。

因爲這是谷歌出現的第一個結果,我會發布這個,即使你可能不關心答案了。

我也使用jQuery和jQuery驗證插件。我在我的一個規則中運行了一些ajax代碼,作爲ajax新手,我提醒了一下,這樣我就可以看到底下發生了什麼。

該警報開了兩次,這是一個問題,因爲這是我真正需要的流量的兩倍。所以我開始在互聯網上尋找理由/解決方案。我知道我想保持焦點驗證,所以我儘可能延長禁用它。

當我終於放棄了,並禁用它,這是我學到了什麼。禁用onfocusout實際上並不會禁用該功能,但它確實不會使其發射兩次。我開始與該認證碼...

$("#FORMNAME").validate({ 
    onkeyup: false, 
    onfocusout: false, 

...實際上並沒有從我會點擊提交按鈕的第一次,這是現實的我想要的東西后停止射擊驗證;點擊,查看問題,解決問題並在用戶選項卡或點擊消失時看到它們更新。這仍然工作得很好,額外的警報消失了。

我很想知道那裏發生了什麼,但我很高興看到它的工作。據推測,onfocusout驗證中的某些內容與jQuery驗證通常的提交後按鈕行爲相沖突,並導致驗證兩次觸發。

(是的,這個信息可能是在文檔中,但隨時到別處指揮你RTFM意見請。)

tldr:禁用的onkeyup和onfocusout在,任何警報纔會觸發一次。你不會失去你期望的功能。