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

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

本文关键字:js jqTree 变量 方法 覆盖 文件 访问 源文件      更新时间:2023-09-26

(新增JS、jQuery和jqTree)

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

我已经读过要覆盖 js 方法的一般内容,我只需要重新定义它。 所以我正在尝试在方法上做到这一点,我想我被困在访问具有原始方法(JqTreeWidget)的变量上。 我认为挑战在于原始方法位于tree.jquery.js(源)中,与我自己的其他custom.js文件分开,我想在其中进行覆盖。

这个问题的目标是允许我在custom.js中写这样的东西(<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单独的源tree.jquery.js添加到该代码笔的 JS 设置中。

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

谢谢!

原型对象可以通过以下方式获得:

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

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

我发现了这个笨拙的解决方法。 但是由于这是一个黑客,我仍然希望找到这个问题中提出的答案(所以请继续回答我在问题中提到的<reference to JqTreeWidget.prototype.openNode>,谢谢)......

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

解决方法:

  1. 在 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开头调用全局变量引用函数 (破解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内部调用被覆盖的方法。 所以这是黑客,因为全局变量,并修改tree.jquery.js源。

这暂时有效,但希望有一个不那么笨拙的解决方案,如这个原始问题中所述...... 谢谢!