2011-12-05 44 views
1

我有一個ExtJs應用程序,它載入了相當多的javascript文件。這導致了很多開銷,因此我們現在使用Ajax加載JavaScript文件。如何在腳本的其他部分使用存在於js文件中的函數(使用Ajax加載)?

因此,當用戶使用Ajax點擊一個按鈕,則JavaScript文件攜帶與該按鈕相關聯的功能被裝入以下方式:

Ext.Ajax.request({ 
    url:'filePath', 
    success:function(response){ 
     eval(response.responseText); 
     functionAssociatedWithButton();//Calling here the function associated with button 
    }, 
    failure:function(){ 
     return; 
    } 
}); 

functionAssociatedWithButton();//Calling here the same function throws an error of function being undefined 

的問題是,此功能 - functionAssociatedWithButton() - ,其存在於使用Ajax加載的JS文件中,並且僅在Ajax請求的成功功能中執行。

但是,如果我們嘗試在腳本的任何其他部分訪問這個功能,那麼JS引擎引發錯誤 - functionAssociatedWithButton()沒有定義。

怎麼會這樣的功能,這是目前在使用Ajax加載JS文件,可以在腳本的其餘部分可用?

我嘗試使用第四選項suggested here - 但這也沒有解決問題。

任何人都可以請扔在這一些輕。

在此先感謝。

PS:完整的腳本的ExtJS的onReady函數裏面寫。另外,考慮到Ajax可能沒有被時間函數加載的可能性在其他地方被調用,我已經通過在Ajax完成加載(使用isLoading()和setTimeOut())後調用該函數來嘗試這種情況,但即使Ajax已經完成加載後,該功能只能在Ajax的成功功能中識別,而不能在腳本的其他任何地方識別。

回答

1

這跟你所創建的函數的範圍。該功能僅在success功能中可用;你有效地結束了以下情況:

function foo() { 
    function bar() { 
     window.alert("hello"); 
    } 
} 

console.log(typeof foo); // function 
console.log(typeof bar); // undefined 

你可以有你的功能添加到,就像一個全局命名空間對象:

var test = {}; 

function foo() { 
    test.bar = function() { 
     window.alert("hello"); 
    } 
} 

console.log(typeof foo); // function 
foo(); 
console.log(typeof test.bar); // function 
+0

感謝傑克建議對全局命名空間。你的建議和這裏的討論 - http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string - 做的伎倆。乾杯。 – netemp

相關問題