2012-07-13 28 views
1

如果已经回答过此问题,我在搜索时无法挖掘任何东西。覆盖jQuery验证突出显示/ unhighlight方法

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

就目前而言,我不得不复制&粘贴代码,从而模拟对父代的调用。

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

我该如何去做这件事?非常感谢 -

+0

我有一个工作演示,现在 - 随时检查出来。 – 2012-07-13 23:20:48

回答

1

通过这种结构化的方式,您可以在不修改插件的情况下做到最好。原因是,当你调用setDefault方法时,它会覆盖插件的默认副本。事实证明这很难解决,但我通过将默认对象分离出来并将其复制回来以解决它。诚实地从插件源中复制简单的逻辑可能是更好的路线,因为您应该只在整个实施过程中调用setDefaults一次。

查看我的提交here & here。如果你愿意,随意分叉。

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

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

这里的file

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

+0

这是令人印象深刻的,你已经做了,我希望有更多的东西像http://stackoverflow.com/questions/560829/calling-base-method-using-javascript-prototype-我只是不能grown的语法链接解决方案 – Malachi 2012-07-13 23:39:06

+0

不幸的是,该插件没有设置为像您链接的问题一样工作。为了做到这一点,程序的很大一部分将不得不进行修改,这样你就失去了能够从上游合并的变化。语法的哪一部分给你带来麻烦? – 2012-07-13 23:57:37

+0

一般来说,我是一个JS/jQuery nub =)我以为也许是因为我无法获得正确的语法,我打破了原型.call的方法。然而,根据你所说的核心问题是,jQuery验证代码本身不支持它 - 当然! – Malachi 2012-07-14 00:01:06

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