我需要一个通用的JavaScript“等待功能可用”
我发现这个优秀的代码片段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();
}
}
其中我传递函数的名称,当它变得可用时被调用。上面的代码不起作用,但我不确定如何解决它。
问候 保罗
有一些潜在的问题,你试图做什么。如果你在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]);
基本上,当执行这行代码:被设置在超时之前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)
。
在你的代码替换:
window.setTimeout(waitForFnc(fnc), 50);
与封闭:
window.setTimeout(function() {waitForFnc(fnc)}, 50);
但我会问你为什么需要这样一个奇怪的代码?我宁愿期望有一个API允许注册一些回调:
Portal.onManagementInitAvailable(fn);
显然,你的期望就不会在这里得到满足。 – Chuck 2012-04-26 07:37:27
我使用ASP MVC,我有一个动态加载ajax的部分视图。在主要部分视图中,还有其他部分视图会不时显示,需要使用由父部分视图动态加载的常见JavaScript。在初始页面加载时,子部分视图需要等待以确保脚本在调用初始化例程之前已被加载。 – 2012-04-26 12:17:43
感谢您的回答,它对我来说非常合适。 – 2012-04-26 12:13:50