2016-02-19 21 views
1

(新到JS,jQuery的,& jqTree)訪問變量1周的.js源文件(jqTree),從不同js文件內,以覆蓋方法

我試圖覆蓋方法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文件分開,我想要做覆蓋。

這一問題的目標是,讓我在寫something like thiscustom.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來源。

見我custom.jshttp://codepen.io/cellepo/pen/LGoaQx 單獨源tree.jquery.js在該codepen的JS設置外部添加。

我怎麼能訪問(從我的custom.js文件內)JqTreeWidget變量,即源文件(tree.jquery.js)嗎?它甚至有可能嗎? JqTreeWidget是否不在tree.jquery.js以外的範圍內,還是不是全局變量?我希望treeContainer.tree.prototype會有它,但我到目前爲止還沒有運氣......

謝謝!

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

注意,這是不適合任何jQuery插件的一般化的解決方案:

+0

來自上面的CodePen,[在此處分叉並用已接受的答案更新](http://codepen.io/cellepo/pen/zrQXKZ)。 – cellepo

回答

1

原型對象可以通過得到。這是由樹插件明確實現的。

+0

看起來這個確實得到了原型對象,謝謝! – cellepo

+0

請注意,參數「get_widget_class」不打算替換:字面上將其保留,並按照原樣使用此答案中的代碼。 (我一開始以爲我需要用我的樹的CSS選擇器代替它,但事實並非如此) – cellepo

+0

只是好奇:介意解釋「.fn.tree(」get_widget_class「)」是如何工作的?或者你有這些方法的任何API參考?謝謝 – cellepo

0

我發現這個hacky解決方法。但因爲它是一個黑客,我還是更願意找到答案,因爲在這個問題(所以請繼續相對於我的問題提到<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開始全球-VAR引用函數(攻入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,而不是調用o從custom.js內刪除方法。所以這是因爲全球變種哈克,並修改tree.jquery.js來源。

這會適用於現在,但希望在這個原始問題中所述的少hacky解決方案...謝謝!

+0

FWIW:理論上這具有風險changeAncestorHeight在定義之前被遞歸調用(因爲我的custom.js最後加載)。但實際上,JqTreeWidget.prototype.openNode僅在用戶入侵時被調用。所以在輸入發生的時候,所有的js都會被加載,因爲用戶在輸入之前必須看到加載的頁面:) – cellepo