jQuery验证一些输入必须彼此不同

时间:2016-12-21 12:30:10

标签: javascript jquery jquery-validate

EDIT2:

我觉得我接近解决方案。根据vicgoyso的建议,我从输入(而不是数组)创建了一些对象,然后我对它们进行了比较:see the jsfiddle

由于此比较正常:comparison on jsfiddle我希望上面的代码能够正常工作,但事实并非如此。

修改 我正在研究的jQuery方法与此类似:

$().ready(function(){
    $.validator.addMethod("same_names", function(value, element) {
        if (!$('#surname').val() || $('#surname').val() != null 
                && !$('#surname1').val() || $('#surname1').val() != null){
            return $('#name').val() != $('#name1').val() 
            && $('#surname').val() != $('#surname1').val() 
            && $('#nickname').val() != $('#nickname1').val()
        }

        }, " Your input is equal to another");

    $("#myForm").validate({
        rules: {
            name: {
                required: false,
                same_names: true
            },
            name1: {
                required: false,
                same_names: true
            },
            surname: {
                required: false,
                same_names: true
            },
            surname1: {
                required: false,
                same_names: true
            },
            nickname: {
                required: false,
                same_names: true
            },
            nickname1: {
                required: false,
                same_names: true
            },
        },
        messages: {
         ...
        }
    })
});

它继续说名字,姓氏和昵称是必需的,但它们不是。 没有jQuery我的方法类似于:

$('#myForm').submit(function (event) {
    var errors = false;
    if ($('#name').val() == $('#name1').val() &&
        $('#surname').val() == $('#surname1').val() &&
        $('#nickname').val() == $('#nickname1').val()
        ||
        $('#name').val() == $('#name2').val() &&
        $('#surname').val() == $('#surname2').val() &&
        $('#nickname').val() == $('#nickname2').val()
        ||
        $('#name').val() == $('#name3').val() &&
        $('#surname').val() == $('#surname3').val() &&
        $('#nickname').val() == $('#nickname3').val()
        ||
        $('#name').val() == $('#name4').val() &&
        $('#surname').val() == $('#surname4').val() &&
        $('#nickname').val() == $('#nickname4').val()
        ....
        ||
        $('#name').val() == $('#name10').val() &&
        $('#surname').val() == $('#surname10').val() &&
        $('#nickname').val() == $('#nickname10').val()
        ||
        $('#name1').val() == $('#name2').val() &&
        $('#surname1').val() == $('#surname2').val() &&
        $('#nickname1').val() == $('#nickname2').val()
        ||
        $('#name1').val() == $('#name3').val() &&
        $('#surname1').val() == $('#surname3').val() &&
        $('#nickname1').val() == $('#nickname3').val()
        .... and so on
        ) {
        $("#error").show(); 
        location.href = "#";
                location.href = "#error";
            errors = true;
    } else { 
      errors = false; 
      $("#error").hide();
    }
    if (errors == true) {
      event.preventDefault();
    }
});

我的实际jsp与此类似(有10个输入组,由姓名+姓氏+昵称组成):

<form id="myForm" method="post">
<input id="name" name="name" />
<input id="surname" name="surname" />
<input id="nickname" name="nickname" />
    <br/ >
<input id="name1" name="name1" />
<input id="surname1" name="surname1" />
<input id="nickname1" name="nickname1" />
<br/>
<input id="name2" name="name2" />
<input id="surname2" name="surname2" />
<input id="nickname2" name="nickname2" />
    <br />
<input id="name3" name="name3" />
<input id="surname3" name="surname3" />
<input id="nickname3" name="nickname3" />
    <br />
    <br />
<input id="submit" type="submit" value="submit" />   
</form>

如果这个组中的一个(名字,姓氏,昵称)等于另一个,我想成为一个错误,例如这是一个错误:

  • 约翰
  • 史密斯
  • 王子 *
  • 约翰
  • 史密斯
  • 王子 *
  • 约翰
  • 史密斯
  • 雪人

但这不是:

  • 约翰
  • 史密斯
  • 王子 至少有一个字段不同,所以输入正常
  • 约翰
  • 史密斯
  • 雪人 *至少有一个字段不同,所以输入正常
  • 约翰
  • 史密斯
  • 火球至少有一个字段不同,所以输入正常

问题 如果我想使用此代码该怎么办:
https://stackoverflow.com/a/16965721/4477899

在这里解决这个问题:
Form validate some input must be different from each other

我问,因为我已经在使用jQuery验证,如果字段超过两个组,或者为空(不需要这些字段),之前的方法效果不佳。

2 个答案:

答案 0 :(得分:1)

仅关于此部分:

  

<强> EDIT2

     

我觉得我接近解决方案。根据vicgoyso的建议,我从输入(而不是数组)创建了一些对象,然后我对它们进行了比较:see the jsfiddle

     

由于这种比较是有效的:比较jsfiddle我希望上面的代码能够正常工作,但事实并非如此。

您未能在jsFiddle中包含jQuery本身。

主要是它无论如何都不会起作用,因为你的布尔逻辑是向后。找到匹配项后,您将获得true。但是,您可以使用return true方法addMethod(),因此使用true告诉您 PASS 验证。要验证失败,您必须 return false

return !duplicateFound;

最后,要使字段可选,您需要更多逻辑......

return this.optional(element) || !duplicateFound;

DEMO https://jsfiddle.net/awb4tcyy/3/

总的来说,随着您使用更多字段组进行扩展,您的代码将变得异常复杂。我建议你利用某种类型的循环算法。祝你好运。

答案 1 :(得分:0)

首先需要定义自定义验证方法: https://jqueryvalidation.org/jQuery.validator.addMethod/

@Ajax

在自定义验证中,获取/存储数组中的输入值: jQuery get values from inputs and create an array

然后检查数组是否有重复项,如果找到重复项则返回true: How can I check if the array of objects have duplicate property values?

然后将自定义验证规则的名称添加到输入验证中,如下所示:

jQuery.validator.addMethod("laxEmail", function(value, element) {
   var duplicateFound = false;

  //apply input values in array
  //check for duplicates
  duplicateFound = true; //update variable if duplicate found 

  return duplicateFound;
}, 'Input values cannot be identical');
相关问题