2012-04-26 64 views
3

我發現這個優秀的代碼片段Make my userscript wait for other scripts to load,它告訴我如何在調用它之前等待函數可用。我需要一個通用的JavaScript「等待功能可用」

目前我已經在我的腳本這個本地代碼,我已經把它爲我的作品

waitForFnc(); 

function waitForFnc() { 
    if (typeof Portal.Management_Init == "undefined") { 
     window.setTimeout(waitForFnc, 50); 
    } 
    else { 
     Portal.Management_Init(); 
    } 
} 

不過,我想編寫的「waitForFnc」仿製藥,因爲我需要做同樣的在幾個地方的事情。像

waitForFnc(Portal.Management_Init); 

function waitForFnc(fnc) { 
    if (typeof fnc == "undefined") { 
     window.setTimeout(waitForFnc(fnc), 50); 
    } 
    else { 
     fnc(); 
    } 
} 

其中我傳遞函數的名稱,當它變得可用時被調用。上面的代碼不起作用,但我不確定如何解決它。

問候 保羅

回答

2

有一些潛在的問題,你試圖做什麼。如果你在Portal定義之前調用waitForFnc(),你將會得到一個null屬性訪問異常。如果你想一個真正通用的解決方案,你可能會使用eval()*喘氣*

雖然我們在這,讓我們添加的參數傳遞給我們等待的功能支持。

function waitForFn(fnName, args){ 
    var fn; 
    try{ 
     eval("fn = " + fnName); 
     if(fn){ 
      fn.apply(null, args); 
     }else{ 
      setTimeout(function(){waitForFn(fnName, args);}, 50); 
     } 
    }catch(e){ 
     setTimeout(function(){waitForFn(fnName, args);}, 50); 
    } 
} 

waitForFn("Portal.Management_Init", [arg0, arg1]); 
+0

感謝您的回答,它對我來說非常合適。 – 2012-04-26 12:13:50

3

基本上,當執行這行代碼:被設置在超時之前window.setTimeout(waitForFnc(fnc), 50);,將「waitForFnc」進行評價。而您需要將調用語句作爲參數傳遞。

這裏是你如何做到這一點:

window.setTimeout(function() {waitForFnc(fnc);}, 50); 

這裏做的事情,它定義了一個功能,如果你願意把它寫到變量以同樣的方式:

var myFunc = function() { 
    waitForFnc(fnc); 
}; 

此功能尚未執行,只是定義。然後你將它傳遞到「setTimeout」:

window.setTimeout(myFunc, 50); 

這使得「setTimeout」在50毫秒後執行該函數。當它發生時,它會調用waitForFnc(fnc)

0

在你的代碼替換:

window.setTimeout(waitForFnc(fnc), 50); 

與封閉:

window.setTimeout(function() {waitForFnc(fnc)}, 50); 

但我會問你爲什麼需要這樣一個奇怪的代碼?我寧願期望有一個API允許註冊一些回調:

Portal.onManagementInitAvailable(fn); 
+1

顯然,你的期望就不會在這裏得到滿足。 – Chuck 2012-04-26 07:37:27

+0

我使用ASP MVC,我有一個動態加載ajax的部分視圖。在主要部分視圖中,還有其他部分視圖會不時顯示,需要使用由父部分視圖動態加載的常見JavaScript。在初始頁面加載時,子部分視圖需要等待以確保腳本在調用初始化例程之前已被加載。 – 2012-04-26 12:17:43

相關問題