Jquery .validate require_from_group

7
每当我使用require_from_group时,它会禁用所有其他验证。有什么想法吗?
此外,是否有一种方法将“电话”和“移动电话”分组并应用require_from_group
  $(document).ready(function(){
    $("#fncMain").validate(
    {
    /*groups:{Call:"Telefon Mobitel"},*/
    rules:{
        Davcna:{required:true,exactlength:5, digits:true},
        Idzav:{required:true,exactlength:5, digits:true},
        Maticna:{required:true,exactlength:5, digits:true},
        Telefon:{require_from_group: [1,".callme"]},
        Mobitel:{require_from_group: [1,".callme"]}
    }, 
    messages:{

    }}
    );
  });

所有未包含在此处的字段均使用简单的“required”类。如果我删除应用于“Telefon”和“Mobitel”的require_from_group规则,则所有其他字段验证都正常工作。
感谢您的帮助。
编辑HTML:http://cl.ly/29391q0Q3G231T2I380m(太长了,无法在此处发布)

1
你能分享一下这个表单的HTML代码吗?至少与这些规则相关的部分,比如哪些元素有callme类等。 - Ryley
@Ryley,我发布了我的HTML代码(表单部分)。请检查我的帖子编辑。 :) - John
我认为你发现了一个错误... - Ryley
请参阅此处以了解潜在的错误详情。如果最终确定是这个问题导致的,请在此处发布答案并@我以获取点赞 :) - Ryley
呵呵,实际上这个缺陷报告是我发布的 :) 谢谢您简化了它 ;) - John
遇到了相同的问题,还没有解决方案?有什么变通方法吗? - sonjz
2个回答

5

@Tats_innit在这里发布了一个自定义的require_from_grouphttps://stackoverflow.com/posts/13127475

事实证明,这也修复了一个在版本1.10.0中的github错误,在jquery.validationadditional-method-1.10.js中。

Github问题: require_from_group disables other rules

smileyanp@github在他的解决方案中引用了这篇文章,其中他重用了@Tats_innit的函数并创建了一个测试,显示它能够正确地工作而且不会禁用require_from_group之前定义的其他规则的验证。

此帖旨在节省时间,因为寻找如此微小的细节耗费了3小时的搜索时间..

修复方法:

只需更新additional-method-1.10.js或在additional-method-1.10.js加载后执行此代码(以覆盖该函数)。

jQuery.validator.addMethod("require_from_group", function(value, element, options) {
  var numberRequired = options[0];
  var selector = options[1];
  var fields = $(selector, element.form);
  var filled_fields = fields.filter(function() {
    // it's more clear to compare with empty string
    return $(this).val() != ""; 
  });
  var empty_fields = fields.not(filled_fields);
  // we will mark only first empty field as invalid
  if (filled_fields.length < numberRequired && empty_fields[0] == element) {
    return false;
  }
  return true;
// {0} below is the 0th item in the options field
}, jQuery.format("Please fill out at least {0} of these fields."));

在比较了该函数 1.11.1 版本与此答案中的版本的行为后,我注意到这个版本似乎不会像现有版本那样进行贪心再验证。此版本在表单提交时会重新验证,但运输版本仅在最少字段有值(onkeyup)时立即清除验证消息。如果有人需要贪心再验证以满足其用例,这只是一个提示。 - jinglesthula

3

编辑: 实际上,这个修复已经被纳入到版本1.12.0中,你可以在这里找到它的CDN指针: http://jqueryvalidation.org/

供参考:

http://ajax.aspnetcdn.com/ajax/jquery.validate/1.12.0/jquery.validate.js
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.12.0/jquery.validate.min.js
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.12.0/additional-methods.js
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.12.0/additional-methods.min.js

我在找到上面提到的解决方案之前发现了下面的代码,所以我的建议是使用上面引用的CDN链接,而不是将下面的代码粘贴到您的JS文件中。
现在GitHub上有一个更好的修复方法(滚动到最底部),我将其复制在这里。 这不是我的工作,编写它的GitHub用户sfreytag似乎不是SO贡献者,我只是想将它放入SO,以便其他人不必在GitHub线程中挖掘:
jQuery.validator.addMethod("require_from_group", function(value, element, options) {
    var validator = this;
    var selector = options[1];
    var validOrNot = $(selector, element.form).filter(function() {
        return validator.elementValue(this);
    }).length >= options[0];

    if(!$(element).data('being_validated')) {
        var fields = $(selector, element.form);
        fields.data('being_validated', true);
        fields.valid();
        $(element.form).valid();
        fields.data('being_validated', false);
    }
    return validOrNot;
}, jQuery.format("Please fill at least {0} of these fields."));

到目前为止,我已经进行了有限的测试,但它似乎像您预期的那样工作,所有验证都会发生(而不是像以前一样通过任何非“require_from_group”验证),所以我目前很满意。 我只是在我的JS代码顶部的验证器声明之后添加了它:

$.validator.setDefaults({
    debug: true,
    success: "valid"
});

jQuery.validator.addMethod("require_from_group", function(value, element, options) {
    var validator = this;
    var selector = options[1];
   //continuation of code...

1
这是适合我的版本。它不会违反其他规则,并在按键抬起时重新验证组字段。 - jinglesthula

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接