简要说明
这并不像听起来那么基本,所以在您阅读并理解我想要做的事情之前,请不要跳到回答:-)。
我有一个名为的对象SineMacula
,其中包含一些像这样的基本函数(ready
暂时忽略该函数):
(function(global, $){
// MOST CODE STRIPT OUT HERE */
/**
* Sine Macula Run
* Makes it easy to write plugins for the Sine Macula library
*
* @param function callback
*/
SM.run = run;
function run(callback){
// Call the function with the Sine Macula
// and jQuery objects
callback(SM, $);
}
/**
* Sine Macula Ready
* Executes code once the Sine Macula and jQuery
* libraries are ready
*
* @param function callback
*/
SM.ready = ready;
function ready(callback){
// Call the function with the Sine Macula
// and jQuery objects
jQuery(function($) {
callback(SM, $);
});
}
/**
* Sine Macula Load
* Load the Sine Macula Libraries and Plugins
* into the current document
*
* The options:
* - package: the package of libraries to load
* - packageURL: a remote source to load the package details from
* - libraries: any additional libraries to load
*
* @param object parameter The options for the Sine Macula load
*/
SM.load = load;
function load(options){
// BUILD A QUERY HERE
// ...
// Complete the url by appending the query
url = '//libraries.sinemaculammviii.com/'+query;
// Append the script tag to the end of the document
script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
$('head')[0].appendChild(script);
}
})(this, this.jQuery);
该load()
函数通过将相关的脚本标签附加到页面的 来简单地加载页面的所有相关插件/库head
。
加载页面中的所有脚本都作为调用函数的回调运行run
。这样可以确保两者jQuery
和SineMacula
都传递给插件。
问题
这就是问题所在,因为库正在加载到SineMacula
对象中,无法检测它们是否已加载。
例如,如果其中一个库包含一个名为 的函数插件setDate()
,我运行:
SM.setDate()
这不一定有效,因为该setDate()
函数可能尚未加载到SineMacula
对象中,因此它将返回“未捕获的 TypeError ...”。
任何人都可以建议对SineMacula.ready()
功能进行良好的调整以检测库是否存在?
请不要对jQuery.load()
功能提出建议,我很清楚。
我不希望解决方案是函数的回调load()
,除非绝对必要。
我希望这是有道理的,如果不让我知道,我会发布更多信息。想让它尽可能简短。
提前致谢
更新
忘了提到我在这里有一个测试页面,您可以在其中看到我遇到的错误并更好地了解我在做什么:-)