jQuery 使用 require_from_group 之外的另一个输入验证插件问题

jQuery Validate plugin issue with another input outside of require_from_group

以不同的方式提出一个新问题,因为我的上一个问题与已经回答的问题太相似了。

我有一个包含三个字段的基本表单; fieldOnefieldTwofieldThree

fieldOnefieldTwo 相互依赖,这意味着必须至少提供其中之一。 fieldThree 应始终提供。所以总是会提供最少两个字段,最多三个字段。

这是我目前的代码。

var validator = $("#my_form").validate({
    groups: {
        datagroup: "fieldOne fieldTwo"
    },
    rules: {
        fieldOne: {
            require_from_group: [1, '.datagroup'],
            email: true,
            maxlength: {
                param: 40,
                depends: function (element) {
                    var valTwo = $('#fieldTwo').val();
                    var valThree = $('#fieldThree').val();
                    return ((!valTwo || (valTwo.length < 8) || (valTwo.length > 18) && !valThree));
                }
            }
        },
        fieldTwo: {
            require_from_group: [1, '.datagroup'],
            minlength: {
                param: 8,
                depends: function (element) {
                    var valOne = $('#fieldOne').val();
                    var valThree = $('#fieldThree').val();
                    return ((!valOne || (valOne.length > 40))&& !valThree);
                }
            }
        },
        fieldThree: {
            required: {
                depends: function(element){
                    var valOne = $('#fieldOne').val();
                    var valTwo = $('#fieldTwo').val();
                    return (!valOne || !valTwo);
                }
            }
        }
    }
});

现在已经到了我需要的时候了。例如,如果我只提供 fieldThree,它会要求我至少输入其他两个字段之一。如果我只提供 fieldOne,它会要求我完成 fieldThree

只有一件事我似乎无法克服。我似乎通过仅提供 fieldOnefieldTwo 来通过验证。 fieldThree 总是需要的,所以这不应该通过。

我怎样才能阻止这种情况发生?实际上只有三种情况可以通过:

fieldOne with fieldThree
fieldTwo with fieldThree
fieldOne and fieldTwo with fieldThree

这就是我想要实现的目标。

谢谢

我认为这里的一个问题是您的 fieldThree 总是 returns true 不要误会我的意思,但我认为整个事情似乎有点过于复杂,但也许我错过了什么。我不知道您的表单实际是什么样子,但这里有一个示例,我认为这就是您可以如何处理您正在寻找的内容。

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

var validator = $("#my_form").validate({
  rules: {
    fieldOne: {
      require_from_group: [1, '.datagroup'],
      email: true,
      maxlength: 40
    },
    fieldTwo: {
      require_from_group: [1, '.datagroup'],
      maxlength: 18,
      minlength: 8
    },
    fieldThree: {
      required: true
    }
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="http://jqueryvalidation.org/files/dist/jquery.validate.min.js"></script>
<script src="http://jqueryvalidation.org/files/dist/additional-methods.min.js"></script>

<form id="my_form">
  <label for="fieldOne">Email: </label>
  <input type="email" class="datagroup" id="fieldOne" name="fieldOne">
  <br/>
  <label for="fieldTwo">Name: </label>
  <input type="text" class="datagroup" id="fieldTwo" name="fieldTwo">
  <br/>
  <label for="fieldThree">Accept: </label>
  <input type="checkbox" id="fieldThree" name="fieldThree" />
  <br/>
  <input type="submit" value="Validate!">
</form>

还有一件事要注意,请注意 40email 上的 maxlength。据我所知,一封电子邮件中的最大字符数约为 250 个,但对此不太确定 ,我认为这是电子邮件过滤器的一部分 。不,只是输入了大约 1000 个字符而没有触发验证。

希望这对您有所帮助。