2011-10-02 130 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