重写jQuery验证高亮显示/取消高亮显示方法

重写jQuery验证高亮显示/取消高亮显示方法,jquery,jquery-validate,Jquery,Jquery Validate,抱歉如果之前已经回答过,我在搜索时无法找到任何东西 我正在覆盖jqueryvalidator的highlight和unhighlight方法,但我希望继续调用这些方法的“stock”版本。例如,在C#中,这类似于调用base.unhighlight 目前,我被迫复制并粘贴原始代码,从而模拟对父级的调用 jQuery.validator.setDefaults({ unhighlight: function (element, errorClass, validClass) {

抱歉如果之前已经回答过,我在搜索时无法找到任何东西

我正在覆盖jqueryvalidator的highlight和unhighlight方法,但我希望继续调用这些方法的“stock”版本。例如,在C#中,这类似于调用base.unhighlight

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

jQuery.validator.setDefaults({
    unhighlight: function (element, errorClass, validClass) {
        // base.unhighlight(element, errorClass, validClass) // <-- desired functionality
    ...
jQuery.validator.setDefaults({
取消高亮显示:函数(元素、errorClass、validClass){

//base.unhighlight(元素、errorClass、validClass)//按照这种结构,这是在不修改插件的情况下所能做的最好的事情。原因是,当你调用setDefault方法时,它会覆盖插件自己的默认值副本。事实证明,这很难解决,但我通过分离默认值对象来修复它&并制作一个副本以供参考。Ho在这一点上,从插件源中嵌套地复制简单逻辑可能是更好的方法,因为对于整个实现,您应该只调用一次setDefaults

看看我的承诺&如果你愿意的话,请随意用叉子

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

unhighlight: function (el, error, valid, _orig) {
  _orig(el, error, valid); // runs directly from the defaults.
  // do other stuff.
}
这是我的建议


编辑:哇。该插件的作用域是waayy advanced。实现我的解决方案所花的时间比我想象的要长。下面是一个工作演示:

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

看看我的承诺&如果你愿意的话,请随意用叉子

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

unhighlight: function (el, error, valid, _orig) {
  _orig(el, error, valid); // runs directly from the defaults.
  // do other stuff.
}
这是我的建议


编辑:哇。该插件的作用域是waayy advanced。实现我的解决方案所花的时间比我想象的要长。这里有一个工作演示:

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

我不确定您对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方法。当然,复制粘贴一次不会太难。

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

我不确定您对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方法。当然,复制粘贴一次也不会太难。

我有一个正在运行的演示,现在-请随意查看。我有一个正在运行的演示,现在-请随意查看。您所做的令人印象深刻,我希望有更多类似的东西-我只是无法完全理解语法不幸的是,插件的设置并不像你链接到的问题那样有效。为了做到这一点,程序的大部分都必须修改,这样你就失去了从上游合并的能力。语法的哪一部分给你带来了麻烦?一般来说,我是一个JS/jQuery nub=)我想可能是因为语法不正确,我打破了prototype.call方法。但是根据你所说的核心问题是jQuery验证代码本身并不支持它——该死!是的,差不多。在这种情况下,传递函数的原始副本是最好的解决方案。因为在内部,它没有使用原型链来构造它的设置。所以当你调用setDefault时,按照最初的设计,它会破坏原始的默认属性。这也不是说插件不好,它只是没有像我知道的一些.NET方法那样被设计成有13个不同的签名….:P..jk。你所做的令人印象深刻,我希望如此更像-我只是不能很好地理解链接解决方案的语法。不幸的是,插件的设置并不像你链接到的问题那样有效。为了做到这一点,程序的大部分都必须修改,这样你就失去了从上游合并的能力。哪一部分语法的错误给你带来了麻烦?通常我是JS/jQuery nub=)我想可能是因为我没有正确的语法,我打破了prototype.call方法。但是根据你所说的,核心问题是jQuery验证代码本身并不支持它——该死!是的,差不多。在这个场景中,传递函数的原始副本是最好的解决方案。因为在内部,它没有使用原型链来构造它的设置。因此,当你调用setDefault时,按照原始设计,它会破坏原始的默认属性。而且插件也不是坏的,它只是没有像某些.NET meth那样被设计为具有13个不同的签名据我所知的ods:P..jk。