1

抱歉,如果之前已经回答过这个问题,我在搜索时无法挖掘任何东西。

我正在覆盖 jQuery 验证器的 highlight 和 unhighlight 方法——但我也希望继续调用这些方法的“stock”版本。例如,在 C# 中,这就像调用 base.unhighlight。

就目前而言,我被迫从原始代码中复制和粘贴代码,从而模拟对父级的调用。

jQuery.validator.setDefaults({
    unhighlight: function (element, errorClass, validClass) {
        // base.unhighlight(element, errorClass, validClass) // <-- desired functionality
    ...

我该怎么做呢?非常感谢 -

4

2 回答 2

3

当然,正如您所建议的那样,另一种方法是从源代码复制默认值。事实证明,这可能是一种更聪明的方法,因为正如我在另一个答案中所说,您应该只需要调用一次 setDefaults 。

我不确定您对 jQuery/JS 的熟悉程度。但通常情况下,每次调用验证器时都会传入选项。

因此,如果我有三种形式,我可以这样做:

$('#form1').validate({
   unhighlight: function(el, error, valid){ el.append('<div class="errormsg">Required for Form1</div>'); }
});

$('#form2').validate({
   unhighlight: function(el, error, valid){ $(el).append('<div class="errormsg">Required for Form2</div>'); }
});

$('#form3').validate({
   unhighlight: function(el, error, valid){ $(el).append('<div class="errormsg">Required for Form3</div>'); }
});

但是,如果我想全局更改 highlight 方法,我可以这样做:

jQuery.validator.setDefaults({
   highlight: function(el, error, valid){ $(el).siblings('.errormsg').remove; }
});

所以实际上你应该只需要调用一次 setDefaults 方法。当然复制粘贴一次也不会太难。

于 2012-07-14T00:05:06.083 回答
1

使用这种结构方式,这是您在不修改插件的情况下所能做的最好的事情。这样做的原因是,当您调用 setDefault 方法时,它会覆盖插件自己的默认值副本。事实证明这很难解决,但我通过将默认对象分离出来并制作一个副本以供参考来修复它。老实说,从插件源代码中复制简单的逻辑可能是此时更好的方法,因为您应该只为整个实现调用一次 setDefaults。

在这里这里查看我的提交。如果您愿意,请随意分叉。

基本上,现在你调用的函数有一个额外的参数,_orig(或任何你想要的)。也一样highlight

unhighlight: function (el, error, valid, _orig) {
  _orig(el, error, valid); // runs directly from the defaults.
  // do other stuff.
}

这是文件

编辑:哇。该插件的范围非常先进。实施我的解决方案花费的时间比我想象的要长。这是一个工作演示:http: //jsfiddle.net/fjMFk/24/

于 2012-07-13T20:46:07.137 回答