2015-07-02 42 views
-2

我在加載jQuery後調用它們的每個頁面都有一些JavaScript函數。
Questions.aspx頁面的功能是afterQuestions(),Default.aspx中的功能是afterDefault()等等....javascript中的函數陣列

在我的母版頁,我呼籲他們想:

if(typeof(afterQuestion) == 'function') afterQuestions(); 
if(typeof(afterDefault) == 'function') afterDefault(); 

由於數量功能增加了,我試過類似的東西:

var _fs = [After, AfterDefault, afterSettings, afterQuestions]; 
for (var i = 0; i < _fs.length; i++) if (typeof (_fs[i]) == "function") _fs[i](); 

但它不能這樣工作。你能幫我嗎?我怎樣才能創建一個函數列表並打電話給他們?

編輯:我認爲沒有人已經很好地閱讀了這個問題,看到所有函數將不會同時存在,這是創建數組的問題。我通過向全局數組添加創建的函數以及該數組中的循環和移植函數來解決此問題

+1

你可以嘗試添加一些花括號嗎? – Hacketo

+1

'deoesn't這樣工作' - 你是什麼意思? – thefourtheye

+2

你是什麼意思,「它不這樣工作」? – Archer

回答

1

如果函數未定義,您將嘗試引用未定義的變量,從而導致JavaScript錯誤。原始代碼中的支票類型可解決該問題。

最好的辦法是將函數命名爲一個對象並使用點符號。

var methods = { 
    After : function() {console.log("After"); }, 
    AfterDefault : function() {console.log("AfterDefault"); }, 
    afterSettings : function() {console.log("afterSettings"); } 
}; 

var _fs = [methods.After, methods.AfterDefault, methods.afterSettings, methods.afterQuestions]; 
for (var i = 0; i < _fs.length; i++) { 
    if (typeof (_fs[i]) == "function") { 
     _fs[i](); 
    } 
} 

現在,當你想註冊的方法,你可以添加到方法對象。

methods = methods || {}; 
methods.afterSettings = function() { console.log("added this in"); }; 

現在,如果沒有定義方法的命名空間將返回不確定和檢查將不會報錯了。

+1

感謝downvote!自從我與OP交談並解決問題以來,這就是答案,因爲您關閉它的人沒有讀到問題。 – epascarello

+0

但問題是每個函數都在一個單獨的頁面中,我無法在一個名稱空間中定義它們。我在我的母版頁的頭部創建了全局數組,例如:'var afterFuncs = [];',並且在創建函數時在每個頁面中添加它到此數組中:var a = function afterDefault(){.. 。} afterFuncs.push(a);'現在在我的母版頁的底部,我只是在循環中調用它們,甚至不需要檢查它們是否存在。 'for(var i = 0; i

+0

@AshkanMobayenKhiabani如果他們被調用的順序並不重要,那麼這是一個好的解決方案。除非保證你將它們推到數組的方式是你希望它們被調用。 如果名稱空間是全局的,則可以在一個名稱空間中完成所有操作。正如我上面提到的,您只需將該方法添加到該對象。 – epascarello