覆盖jQuery验证突出显示/取消高亮显示方法

时间:2012-07-13 20:23:17

标签: jquery jquery-validate

如果之前已经回答道歉,那么在搜索时我无法挖掘任何东西。

我正在重写jQuery验证器的亮点& unhighlight方法 - 但我希望继续调用方法的'stock'版本。在C#中,这就像调用base.unhighlight一样。

目前,我被迫复制&粘贴原始代码,从而模拟对父母的调用。

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

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

2 个答案:

答案 0 :(得分: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>'); }
});

但如果我想全局更改突出显示方法,我可以这样做:

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

所以你真的应该只需要调用一次setDefaults方法。肯定复制粘贴一次也不会太难。

答案 1 :(得分:1)

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

查看我的提交here&amp; here。如果您愿意,请随意分叉。

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

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

这是file

编辑:哇。该插件的范围是waayy高级。实现我的解决方案花了比我想象的更长的时间。这是一个有效的演示:http://jsfiddle.net/fjMFk/24/