1

假设我从我的主机网页加载这些脚本:

<script src="http://www.mywebsite.com/widget/widget.js?type=normal" type="text/javascript"></script>
<script src="http://www.mywebsite.com/widget/widget.js?type=rotation" type="text/javascript"></script>

我只想在第一个完成后才执行第二个(完全;它可以包含异步函数)。

我该怎么做?

4

4 回答 4

2

您已经做对了:脚本按照页面中的集成顺序执行,而不是加载。

编辑:正如 MaxArt 所指出的,这可能不是您想要的。他的回答很好。但通常,您需要使用 javascript 常用模式和基于事件的逻辑来避免此类问题:

  • 让您的大多数文件只定义类和函数(其中一些将回调作为参数)
  • 有一个main文件启动它并调用一系列动作,异步性通过回调处理。

我的主要代码通常看起来(有点)像这样:

$(window).ready(function() {
    var myBigEngine = new BigEngine();
    myBigEngine.init(function(){
      // do other things, no need to add other layers as user events and ajax message callback will do the rest
    });
});
于 2012-06-01T07:27:55.293 回答
1

尝试将 defer="defer" 属性应用于第二个<script>声明,例如

<script src="http://www.mywebsite.com/widget/widget.js?type=rotation" type="text/javascript" defer="defer" ></script>

于 2012-06-01T07:26:01.727 回答
1

将整个脚本包装在一个函数中,如下所示:

(function(id) {
    var id = setInterval(function() {
        if (!window.doneLoading) return;
        clearInterval(id);

        // The whole script file goes here
        ...
    }, 50);
})();

setInterval 轮询 (global, sorry) 变量doneLoading。在第一个脚本中,当您的异步函数完全加载时,您必须设置doneLoadingtrue或任何其他非 false 值,比如在 AJAX 请求结束时可能?

编辑:因为我建议在脚本中添加一个全局变量,它也可以添加一个全局函数。因此,不要设置setInterval调用,而是将第二个脚本包装在一个函数中......但是像这样:

function doneLoading() {
        // The whole script file goes here
        ...
}

在第一个脚本文件中,在回调函数结束时,只需调用doneLoading().

于 2012-06-01T07:31:05.487 回答
0

您可以将第二个脚本初始化函数放在 window.onload 事件中

window.onload = function(){

// call function from second script

}

或使用 jQuery

$(function(){

// call function from second script

});

您可以使用此功能添加第二个脚本

function loadScript(src){
    var f=document.createElement('script');
    if(f){
        f.setAttribute("type","text/javascript");
        f.setAttribute("src",src);
        document.getElementsByTagName("head")[0].appendChild(f);
    }
}
于 2012-06-01T07:24:30.113 回答