我有以下代码,旨在随时检查函数是否存在。 此代码目前没有任何错误。我使用它是因为我的 javascript 文件以任意顺序加载,并且对于我的项目以这种方式完成是必需的。由于我的 javascript 文件是分开的以便在它们之间运行函数,因此您必须将它们存储在全局变量中,然后从全局变量中调用该函数。
Javascript 文件示例:“checker.js” // 检查函数是否存在!
var funcList = {};
$(document).ready(function(){
funcList.requireJS =
function requireJS(requires,callback){
console.log("requireJS Starting With Requires Below:");
console.log(requires);
var attempts = 0;
attemptRequire();
function attemptRequire(){
$.each(requires, function (key, value){
attempts++;
console.log("Checking:"+value+" attempts="+attempts);
if (typeof eval(value) !== 'undefined'){
callback(); //them run the function
}else{
console.log("require JS waiting...");
setTimeout(function(){attemptRequire();}, 100);//wait and try again every 100 milliseconds.
}
});
}
console.log("requireJS Finished!...");
};
});
使用全局函数示例:sample.js
$(document).ready(function(){
console.log("Quote.Js Loading...");
requires = {
0 : "$.fn.mask"
};
funcList["requireJS"](requires, function(){
$("#partone_phone").mask("(999) 999-9999? x99999");
console.log("Quote.Js Loaded!");
});
});
这个想法是,如果 jQuery 上的“屏蔽”插件尚未加载,那么它不会尝试运行代码,但一旦加载它就会运行。在未加载插件时尝试运行 .mask 将导致字段没有所需的影响。我以 jquery.mask 为例,但这可能适用于任何事情。
然而,我正在使用 jquery.mask,因为作为一个 jquery 函数,它似乎是引用它的唯一方法是使用 $.fn.mask
通常我可以通过说来测试函数typeof functionNameHere !== 'undefined'
并且这有效,但是由于这是一个 jquery 函数,如果我发送字符串 '$.fn.mask' 它就不起作用,除非我在它周围放置一个 eval() ......正如我们都知道是坏形式!
有没有人有更好的选择来使用 eval() 来完成这项工作?
另请注意:
requires = {
0 : $.fn.mask
};
尝试不带字符串直接发送函数是行不通的,因为如果它是未定义的,它会在它转到 requireJS 时保持未定义。