从不同的 .js 文件中的 1 个 .js 源文件(jqTree)访问变量以覆盖方法

Access variable from 1 .js source file (jqTree), from within different .js file, to override method

(JS 新手,jQuery,& jqTree)

我正在尝试覆盖一个方法 (JqTreeWidget.prototype.openNode) 来自一个 .js 文件 (tree.jquery.js ) 另一个 (我自己的 custom.js).

我读过 to override a js method in general, I just need to redefine it。所以我试图在方法上这样做,我想我坚持访问具有原始方法的变量 (JqTreeWidget)。我认为挑战在于原始方法位于 tree.jquery.js(源)中,它与我自己的其他 custom.js 文件分开,我想在其中进行覆盖。

这个问题的目标是让我在 custom.js 中写 something like this<reference to JqTreeWidget.prototype.openNode> 将是这个问题的答案):

var originalMethod = <reference to JqTreeWidget.prototype.openNode>;

// Override of originalMethod
<reference to JqTreeWidget.prototype.openNode> = function( node, slide ){
    // my code I want to happen 1st here
    changeAncestorHeightRecursively( node, true);

    // my code is done, and now I'm ready to call the original method
    originalMethod.call( this, node, slide );
}

我认为这将是进行覆盖的最非侵入性方式,而无需实际侵入 tree.jquery.js 源。

http://codepen.io/cellepo/pen/LGoaQx 查看我的 custom.js 在该代码笔的 JS 设置中外部添加了单独的源 tree.jquery.js

如何(从我的 custom.js 文件中)访问源文件 (tree.jquery.js) 中的 JqTreeWidget 变量? 有可能吗? JqTreeWidget 是否不在 tree.jquery.js 之外的范围内,或者它不是全局变量?我希望 treeContainer.tree.prototype 能得到它,但到目前为止我还没有运气......

谢谢!

原型对象获取途径:

jQuery.fn.tree("get_widget_class").prototype

请注意,这不是任何 jQuery 插件的通用解决方案。这是树插件明确实现的东西。

我发现了这个棘手的解决方法。但由于这是一个 hack,我仍然更愿意找到这个问题中提出的答案(所以 请继续回答我在问题 [=63= 中提到的 <reference to JqTreeWidget.prototype.openNode> ], 谢谢)...

如本问题所述,目标涉及在 custom.js 中从外部覆盖 JqTreeWidget.prototype.openNode(来自 tree.jquery.js)。因此,对 changeAncestorHeightRecursively(我的代码)和 JqTreeWidget.prototype.openNode 的调用都将由 custom.js 中的覆盖进行,并且 tree.jquery.js 源根本不会被修改。

解决方法:

  1. Declare global var in html:

    <script type='text/javascript' language="javascript"> changeAncestorHeightRecursively = 1; </script>

  2. custom.js中,将globar var设置为函数(我想在JqTreeWidget.prototype.openNode之前调用的函数):

    window.changeAncestorHeightRecursively = changeAncestorHeightRecursively;

  3. JqTreeWidget.prototype.openNode开头调用global-var-referenced函数(hack into tree.jquery.js):

    JqTreeWidget.prototype.openNode = function(node, slide) { // Only way I could figure out to get this to execute before the rest of this method // (global-var-referenced function in custom.js) changeAncestorHeightRecursively( node, true ); // Rest of original openNode code... }

这从 tree.jquery.js 中调用我的代码函数,而不是从 custom.js. 中调用覆盖的方法所以这个由于全局 var 和修改 tree.jquery.js source.

是 hacky

这暂时可行,但希望能有一个不那么棘手的解决方案,如这个原始问题中所述...谢谢!