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

Posted

技术标签:

【中文标题】从不同的 .js 文件中访问来自 1 个 .js 源文件 (jqTree) 的变量以覆盖方法【英文标题】:Access variable from 1 .js source file (jqTree), from within different .js file, to override method 【发布时间】:2016-02-19 20:04:16 【问题描述】:

(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 单独的源 tree.jquery.js 是在该 codepen 的 JS 设置中外部添加的。

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

谢谢!

【问题讨论】:

上方的 CodePen,forked & updated with Accepted Answer here. 【参考方案1】:

原型对象可以通过:

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

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

【讨论】:

看起来这确实得到了原型对象,谢谢! 请注意,参数“get_widget_class”不打算被替换:字面上保留它,并按原样使用此答案中的代码。 (起初我很困惑,以为我需要用我的树的 CSS 选择器替换它,但事实并非如此) 只是好奇:介意解释一下“.fn.tree("get_widget_class")”是如何工作的吗?或者你有这些方法的 API 参考吗?谢谢 jQuery.fn 是所有 jQuery 插件注册其功能的地方。它基本上是所有 jQuery 对象的原型。通过阅读tree.jquery.js 文件可以看到其余部分。我不知道它被记录在任何地方。 非常感谢。我猜在了解了所有这些之后,您可能已经通过文本搜索“fn”或“$.fn”来缩小 tree.jquery.js 的相关部分。不错【参考方案2】:

我发现了这个 hacky 解决方法。但由于这是一个 hack,我仍然希望找到这个问题中提出的答案(所以请继续回答我在问题中提到的&lt;reference to JqTreeWidget.prototype.openNode&gt;,谢谢)。 ..

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

解决方法:

    Declare global var in html

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

    custom.js中,将全局变量设置为函数(我想在JqTreeWidget.prototype.openNode之前调用的那个):

    window.changeAncestorHeightRecursively = changeAncestorHeightRecursively;

    调用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 中调用被覆盖的方法。 所以这是 hacky,因为全局 var 和修改 @ 987654340@来源。

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

【讨论】:

FWIW:理论上这有风险 changeAncestorHeightRecursively 在定义之前被调用(因为我的 custom.js 是最后加载的)。但实际上, JqTreeWidget.prototype.openNode 仅在用户输入时调用。所以当输入发生时,所有的js都会被加载,因为用户必须在输入之前看到加载的页面:)

以上是关于从不同的 .js 文件中访问来自 1 个 .js 源文件 (jqTree) 的变量以覆盖方法的主要内容,如果未能解决你的问题,请参考以下文章

JS 运算符的优先级 (来自MDN)

在 node.js/angular 应用程序中查询来自不同主机的数据时,如何遵守访问控制起源异常? [复制]

如何从 json 响应中连接来自不同对象数组的值? Node.js、Discord.js

如何使用AngularJS访问不同js文件中的变量数据

如何在 Node.js 中从不同的应用程序注入模块

从多个/不同文件INPUTS访问文件到JS Var