覆盖javascript库函数

时间:2014-08-11 18:36:20

标签: javascript jquery override spinner

我试图修改jquery UI微调器的行为,并希望避免黑客攻击原始的js文件。这是一个名为_doSpin的js文件中的一个函数,如果我修改我可以实现我想要的效果(我希望它以百分比的形式更改值 - 而不是像内置的百分比方法那样给用户提供一个真正的百分比,但是我需要正常的整数增加或减少一个百分比,不得有100%到0%的界限。

但我不想破解原始文件,因此我想在我的页面中使用ui.spinner.js覆盖该函数。我无法从我的html页面中找到如何到达库文件的命名空间。我已经尝试过stackoverflow提供的大量提示,但似乎在我的情况下都没有。库文件以(function($,undefined))开头,但是我无法理解我在html页面中定义的命名空间是如何定义的,因此我可以在'中断'并覆盖函数。

BTW函数在库文件内部使用,在这种情况下可能无法覆盖它?我不想在我的html页面中本地使用它,我调用更高级的方法来开展业务,我只需要更改库内部的工作方式。

2 个答案:

答案 0 :(得分:0)

首先,您是否完全确定通过指定微调器对象的选项无法解决问题?似乎使用minmaxstep选项,您可以使step成为创建微调器或集合时所需范围的任意百分比范围。这是step选项的the doc


如果这是一个内部函数(未在公共API中公开或作为公共对象上的方法公开),那么一切都取决于它是如何编码的。如果它没有放入公共名称空间并且在其他功能中定义,那么你就无法重新定义它。函数的内部不是你可以从Javascript中的函数外部获得的东西,除非它们以某种方式显式地被公众访问。

如果它位于某个公共API中,那么您可以将新函数分配给API所在的任何符号并替换原始函数(通常首先保存原始函数,以便在需要时仍然可以使用它)。


如果您没有向我们展示您想要覆盖的实际代码,我们无法更具体地为您提供帮助。仅供参考,我无法在jQueryUI source repository中找到名为_doSpin的功能,因此我不知道您尝试覆盖哪些代码的功能。


修改:在Google搜索中,我发现another version of a jQuery UI spinner确实有_doSpin()方法。在该版本中,_doSpin()方法最终作为spinner窗口小部件对象(它是用于其所有对象的jQuery UI对象结构)的原型上的方法。我个人对jQueryUI没有多少经验,但是从小工具上阅读他们的文档,听起来你可以继承现有的widget并替换原型上的方法。或者,您可能直接破解原型 - 虽然需要做一些工作来弄清楚jQueryUI存储它的方式/位置或者如何到达它。

答案 1 :(得分:0)

最终这项工作做得更好。

<html>
<script type='text/javascript'> 

var mainarray = [1,2,3,4,5];

function scrolltxtbox (e) {
    var evt=window.event || e;
    var delta=evt.detail ? evt.detail*(-120) : evt.wheelDelta;

    var targ;
    if (evt.target) targ = evt.target;
    else if (evt.srcElement) targ = evt.srcElement;

    (delta<=-120)?multiplier=0.95:multiplier=1.05;

    changeweight(targ.id, multiplier);

    if (evt.preventDefault) 
        evt.preventDefault()
    else return false
}

function changeweight(targid, multiplier) {
    var u = targid.match(/myspinner(.*)/); 
    mainarray[u[1]] = mainarray[u[1]]*multiplier;

    document.getElementById(targid).value = mainarray[u[1]].toPrecision(3);
}
var mousewheelevt=(/Firefox/i.test(navigator.userAgent))? "DOMMouseScroll" : "mousewheel" 
var index;

for (index = 0; index < mainarray.length; ++index) {
    document.write('<input type="text" size=6 id="myspinner'+index+'" value='+mainarray[index]+' autocomplete="off"><br>');
    if (window['myspinner'+index].attachEvent) {
        window['myspinner'+index].attachEvent("on"+mousewheelevt, scrolltxtbox);
    } else if (window['myspinner'+index].addEventListener) {
        window['myspinner'+index].addEventListener(mousewheelevt, scrolltxtbox, false);
    }
}           

</script>
</html>

它可能(绝对是!)过度,但效果很好。