0

在我的表单中有两个字段,它们相互比较以查看它们是否有效:

<input type="text" name="StartDate" id="StartDate" value="2"
       data-val="true" data-val-equalto="xx" data-val-equalto-other="EndDate"/>   
<input type="text" name="EndDate" id="EndDate" value="3"
       data-val="true" data-val-equalto="xx" data-val-equalto-other="StartDate"/> 

当我开始模糊时StartDateEndDate也会得到验证。所以 jQuery 设法避免一个和另一个之间的验证循环。

现在,我正在尝试在我的自定义验证规则中实现相同的机制。我从“其他”字段中获取值,如果一切正确,我也会在“其他”中触发验证,但这会以验证循环结束:

$.validator.addMethod("customequal-method", function (val, el, p) {
    var $other = $(el).closest('form').find('input[name=' + p.other + ']'); 
    if($other.val() == val){        
        try{$other.valid();}
        finally{return true;}
    }
    return false;
});

我如何应用与 jQuery 相同的方法?我的意思是,鉴于这两个领域:

<input type="text" name="StartDate2" id="StartDate2" value="2"
       data-val="true" data-val-customequal="xx xxx" data-val-customequal-other="EndDate2"/>   
<input type="text" name="EndDate2" id="EndDate2" value="3"
       data-val="true" data-val-customequal="xx xx" data-val-customequal-other="StartDate2"/> 

我希望在修改 EndDate2 时,在模糊之后,StartDate2 也得到验证,并且两者都以与 jQuery 相同的方式变得有效。

我一直在尝试在 jsFiddle 中编写一个示例,但是我无法使我的自定义方法起作用:http: //jsfiddle.net/vtortola/vu6tm/(如果您发现问题,我将不胜感激),我开始了一个单独的关于这个的线程jQuery unobtrusive custom adapter and method in jsFiddle 上讨论这个问题

干杯。

4

1 回答 1

1

您需要一个堆栈来了解您返回到以前验证过的元素。单个值是不够的,因为每个元素都可能与其他元素一起参与其他规则。您可以在闭包中定义包含堆栈的 var(isInStack 验证元素是否在数组中):

(function () {
var stack = [];
$.validator.addMethod("customequal-method", function (val, el, p) {
var iAmTheRoot = stack.length == 0;
var $other = $(el).closest('form').find('input[name=' + p.other + ']'); 
if($other.val() == val){        
    try{
      if (!isInStack($other[0]) ) $other.valid();
    }
    finally{
    if (iAmTheRoot) stack = [];
    return true;}
}
return false;
});})();
于 2013-07-27T14:15:36.980 回答