【问题标题】:jQuery ValidationEngine: How to validate that at least one of a set of fields is not empty?jQuery ValidationEngine:如何验证一组字段中至少有一个不为空?
【发布时间】:2011-06-25 15:43:40
【问题描述】:

在我们的项目中,我们使用的是 ValidationEngine,我们没有能力用另一个插件替换它。

我们的表单有十个输入,其中一些是可选的,但必须至少包含一个可选字段。

那么,在这种情况下,您如何验证输入?

示例:

form
  input1
  input2
  intpu3

输入1:必需

至少必须有一个 input2 和 input3 ——如果两者都是空的,验证应该失败。

【问题讨论】:

  • +1 你找到这个问题的答案了吗?

标签: jquery jquery-validation-engine


【解决方案1】:

验证引擎现在支持组验证。转到jQuery form validation plugin @ github 并查看groupRequired。语法看起来像这样。

<input value="" class="validate[groupRequired[payments]]" type="text" name="creditcard" id="creditcard" />
<input class="validate[groupRequired[payments]]" type="text" id="paypal" name="paypal"/>

【讨论】:

  • 其他人注意——我对上面示例中的“付款”或它引用的内容有点困惑——因为所有其他验证器都引用了另一个字段 id——但“付款”只是您在要分组的字段中保持通用的任意术语。 'groupRequired' 也不适用于我发现的复选框。我假设因为它们已经有一个值 s 它将默认为有效 - 与它是否被检查无关
【解决方案2】:

看来 ValidationEngine 插件允许您指定使用自定义函数来确定有效性的验证规则。

如果您像这样在input1 上添加验证类...

<input id="input1" class="validate[required,funcCall[myValidationFunction]]" />

那么 ValidationEngine 将使用以下函数。您几乎可以在其中放置任何类型的逻辑。如果我正确阅读了您的场景,这应该可以完成您所追求的。

function myValidationFunction() {
  var input1 = $.trim($("#input1").val());
  var input2 = $.trim($("#input2").val());
  var input3 = $.trim($("#input3").val());

  if (input1.length == 0) {
    return "input1 is required";
  }

  if (input2.length == 0 && input3.length == 0) {
    return "Either input2 or input3 is required";
  }

  // We don't need to return anything if there is no error.
}

这里是源代码中_funcCall函数的链接: https://github.com/posabsolute/jQuery-Validation-Engine/blob/master/js/jquery.validationEngine.js#L574

【讨论】:

  • +1 很好的例子,除了我认为他希望在所有情况下都需要字段 1,并且至少存在字段 2 和 3 之一。所以 if 语句可以使用一个小的重写。
  • 我在控制台中得到“options.customFunctions is undefined”,直到我将函数定义为myValidationFunction = function() {...}
【解决方案3】:

如果有人想让 groupRequired 对复选框起作用,您需要将错误消息添加到 groupRequired 的语言文件中。例如如果是jquery.validationEngine-en.js,应该是这样的:

"groupRequired": {
  "regex": "none",
  "alertText": "* You must fill one of the following fields",
  "alertTextCheckboxMultiple": "* Please select an option",
  "alertTextCheckboxe": "* This checkbox is required"
}

【讨论】:

  • 这样做有点脏(如果你不小心它会在下次更新时被覆盖)。但是我想知道为什么默认情况下不添加它...
  • 谢谢!为什么最初没有使用它
【解决方案4】:

一种解决方案是在验证之前附加验证并在验证结束后删除。

jQuery(document).ready(function(){
    jQuery("#formID").validationEngine();

    $("#formID").bind("jqv.form.validating", function(event){
        var fieldsWithValue = $('input[type=text]').filter(function(){
            if($(this).val().length>0){
                return true;
            }
        });
        if(fieldsWithValue.length<1){
            $('input[type=text]').addClass('validate[required,funcCall[requiredOneOfGroup]]');
        }
    });

    $("#formID").bind("jqv.form.result", function(event, errorFound){
        $('input[type=text]').removeClass('validate[required,funcCall[requiredOneOfGroup]]');
    });
});

function requiredOneOfGroup(field, rules, i, options){
    var fieldsWithValue = $('input[type=text]').filter(function(){
        if($(this).val().length>0){
            return true;
        }
    });
    if(fieldsWithValue.length<1){
        return "At least one field in this set must have a value.";
    }
}

【讨论】:

    【解决方案5】:
    !!$('#input2,#input3').filter('[value]').length
    

    【讨论】:

    • 这真的是评论,而不是问题的答案。请使用“添加评论”为作者留下反馈。
    • @Faust - 不,真的不是。那行代码验证了 OP 的要求。请不要对超过一年的您甚至都懒得理解的帖子做出不正确的批评。
    • 抱歉——你是对的,这显然是一个有效的答案。仅供参考,评论文本是这样生成的。这个答案被 SO 自动标记为“由于其长度和内容而质量低劣”,并被放置在“低质量帖子”队列中以供审查。现在那里有将近 40k 的帖子,所以我一直在努力帮助进行评论,最近每天砍掉几十个。我一定是按错了按钮。我通常接受所有 1-liner jQuery 答案,因为我精通框架,所以这是一个错误。
    【解决方案6】:

    jquery 验证插件中有一个规定可以对元素进行摸索。

    groups: {groupName: "text1 text2 text3 .. so on"}
    
    errorPlacement: function(error, element) {
                        // Write Done your business logic to display error 
    
                 if ( element.attr("name") == "text1" -- define other text elements also) {
                   error.insertAfter("#error_location_placeholder_id");
                        }else{
                   error.insertAfter(element);
                 }               
    
               }
    

    并且您在规则方法中的业务验证至少有一个不能为空逻辑

    groupName:{
    
                        required: function(element) {
    // Your business logic for validation
    
                            if( $("#text1").val().length > 0 ){
                                return false;
                            }else{
                                return true;
                            }
    
                        }
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-04
      • 2023-03-10
      • 2022-12-08
      • 2011-07-21
      • 2011-02-18
      • 2014-06-17
      • 1970-01-01
      • 2013-02-16
      相关资源
      最近更新 更多