2011-10-02 160 views
1

我正在使用jquery驗證並設置了組。但是,我很難找出從包含的各個字段分別驗證每個組的最佳方式。jQuery驗證:組驗證,但不是字段驗證

爲了說明這一點:

我有城市,州和郵編(按順序)。如果有人輸入了zip的值,他們應該得到肯定的確認(我已經得到了該部分使用輸入的綠色複選標記),但是,只要狀態和zip爲空,組驗證消息仍應顯示。

在進行各種嘗試時,我遇到了以下問題: - 用戶跳過「城市」並驗證消息顯示,但當爲「zip」提供輸入時,驗證消息消失。 (這很奇怪...也許是一個錯誤?) - 用戶輸入「城市」,他們甚至在進入「狀態」之前就會收到組錯誤消息 - 用戶輸入「城市」,但不會得到複選標記,因爲該組中的其他輸入爲空

我傾向於通過覆蓋「onfocusout」事件來解決這個問題(通過讓它檢查聚焦輸出中的所有輸入),但不確定是否有更好的方法一些驗證的內置方法

謝謝!

* UPDATE

我拿出解決方案是相當醜陋,他們沒有始終如一地工作,下面就是一個例子,它導致了我上面列出的第一個問題的倒數。現在,驗證消息僅在組中填寫最後一個字段時顯示。

也許組驗證依賴於組中最後一個測試的驗證結果嗎?

反正...這裏的爛攤子,我拿出這麼遠:

設置組:

groups : { location : 'city state zip' } 

該組創建一個規則(注意它必須是一個數組保持順序):

rules : { location : ['city, 'state', 'zip']} 

現在覆蓋onfocusout在:

onfocusout : function(el) { 
     var groups = this.groups 
      , elName = el.name 
      , elGroup = groups[elName] 
      , $el = $(el) 

     if (!this.checkable(el)){ 
      this.element(el)); 
     } 

     // If the element belongs to a group, validate all elements in the group 
     // that come before the current element 
     if (elGroup) { 
      var groupMembers = this.settings.rules[elGroup]; 

      for (var i=0; i<groupMembers.length; i++) { 
       if (groupMembers[i] === elName) { 
        break; 
       } 
       this.element($('[name="' + groupMembers[i] + '"]')); 
      } 
     } 
    } 

回答

0

看起來這個插件的「組」功能有一些問題仍然突出,其中一些看起來是與您的問題有關。

https://github.com/jzaefferer/jquery-validation/issues/search?q=groups

+0

是的...我認爲你是沒錯,但我會堅持一段時間,以防某人有合理的即時解決方案。瞭解我現在知道的關於jquery驗證對團隊支持的知識我可能會採取一種非常不同的方法:/ – uglymunky

+0

爲什麼不把團隊出去?只需添加自己的邏輯來檢查分組項目的排列。這聽起來像你已經有點這樣做,無論如何與你的綠色複選標記。 – Terry

+0

團體將不得不留在現在作爲權宜之計......但是,如果沒有其他解決方案出現,我將不得不按照你的建議去做,然後回到這個實施所有羣組/消息的東西上我自己...這可能是最好的解決方案,但它也會相當耗時 – uglymunky

0

您可以使用羣組來的是,拿這個例子:

$("form").validate({ 
    rules: { 
     City: { required: true }, 
     Zip: { required: true }, 
     State: { required: true } 
    }, 
    groups: { 
     Location: "City Zip State" 
    }, 
    errorPlacement: function(error, element) { 
     if (element.attr("name") == "City" || element.attr("name") == "Zip" || element.attr("name") == "State") 
     error.insertAfter("#State"); 
     else 
     error.insertAfter(element); 
    } 
}); 
  • 規則設置3個字段爲true
  • 組定義它們被驗證爲一組
  • 和errorPlacement函數定義錯誤消息的位置
+0

嗯......儘管這應該起作用,但當我嘗試這樣做時,只要該組的最後一名成員通過測試,它就不會提供驗證消息......?例如:錯誤信息顯示我何時退出城市,但當我將文本放入郵編字段 – uglymunky

+0

hm奇怪時,它會消失,確定讓我看看我是否可以修改 – Sander