gpt4 book ai didi

javascript - 延迟脚本运行,直到所有 Assets 都已加载

转载 作者:行者123 更新时间:2023-11-30 18:15:04 24 4
gpt4 key购买 nike

简要说明

这并不像听起来那么基础,所以在您阅读并理解我正在尝试做的事情之前,请不要跳到回答 :-)。

我有一个名为 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 的函数的回调运行。这确保 jQuerySineMacula 都传递给插件。

问题

这就是问题所在,因为正在将库加载到 SineMacula 对象中,因此无法检测它们是否已加载。

例如,如果其中一个库包含名为 setDate() 的函数插件,我运行:

SM.setDate()

这不一定有效,因为 setDate() 函数可能尚未加载到 SineMacula 对象中,因此它将返回“未捕获的类型错误... '.

有人可以建议对 SineMacula.ready() 函数进行很好的改编以检测库是否存在吗?

请不要对 jQuery.load() 函数提出建议,我很清楚这一点。

除非绝对必要,否则我不希望解决方案是函数 load() 的回调。

我希望这是有道理的,如果没有让我知道,我会发布更多信息。希望尽可能简短。

提前致谢

更新

忘了说我有一个测试页面here您可以在哪里看到我遇到的错误并更好地理解我在做什么 :-)

最佳答案

如果我理解正确,是用户从他们的脚本中调用 SM.run(),然后调用 SM.load(),加载其他部分图书馆的。

因此,如果是这种情况,那么无论如何,他们的脚本都会在加载库的任何其他部分之前完成执行。

我认为您需要做的是要求用户将他们的 .run() 放在与其余代码分开的单独脚本中。然后您可以使用 document.write 加载其他脚本。这将导致他们加载并阻止下一个脚本,该脚本将包含用户代码的其余部分:

function load(options){
// BUILD A QUERY HERE
// ...
// Complete the url by appending the query
document.write('<scr' + 'ipt type="text/javascript" ',
' src="//libraries.sinemaculammviii.com/' + query,
'"><\/scr' + 'ipt>');
}

<script type="text/javascript" src="/path/to/your/lib.js"></script>
<script type="text/javascript">
SineMacula.load('all');
</script>

<!-- The document.write will write the new script here, and it will be loaded
syncronously, so it will block. -->

<script type="text/javascript">
// code that uses the loaded library parts
</script>

关于javascript - 延迟脚本运行,直到所有 Assets 都已加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13500229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com