如何在另一个JavaScript文件之前加载外部JavaScript文件?

9

我在HTML页面中有两个外部JavaScript文件。

我需要确保第一个文件script1.js在第二个文件script2.js之前运行。

它们都在HTML页面的body中;我该如何确保只有在script1中的函数运行后才使用script2?

<!DOCTYPE html>
<html lang="en">

<head>
</head>

<body>

    <!-- Script 1 -->
    <script src="js/script1.js"></script>

    <!-- Script 2 -->
    <script src="js/script2.js"></script>
</body>
</html>

1
把一个放在另一个前面。你试过了吗?有问题吗? - epascarello
2
这已经是现状了,你有什么问题吗?默认情况下脚本是同步加载的。 - A. Wolff
1
你在尝试过某些事情之后才向我们提出这个问题吗?它起作用了吗?如果没有,为什么?是真的存在问题还是只是“闲着无聊”在问? - Alon Eitan
2
请记住,HTML是从上到下渲染的,所以您在代码中已经保证了script1.js会在script2.js之前执行。 - Drew Kennedy
1
我的第一个脚本调用了一个PHP函数,并且这个调用是异步的,所以你的问题就源于此。 - Roland Starke
显示剩余5条评论
8个回答

14
浏览器将按照它找到的顺序执行脚本。如果您调用了外部脚本,它会阻止页面直到脚本被加载并执行为止。
所以,如果您的代码是:
<body>

    <!-- Script 1 -->
    <script src="js/script1.js"></script>

    <!-- Script 2 -->
    <script src="js/script2.js"></script>
</body>

脚本1将在脚本2之前运行。


3

<script>标签可以帮助您管理它...但请继续阅读...

JavaScript是同步的,这意味着默认情况下它将逐行执行...

<!DOCTYPE html>
<html lang="en">

<head>
</head>

<body>

    <!-- Script 1 -->
    <script src="js/script1.js"></script> <!-- first gets executed and get finished -->

    <!-- Script 2 -->
    <script src="js/script2.js"></script> <!-- then second gets executed and get finished -->
</body>
</html>

但是JavaScript也可以是异步的...
因此,<script>标签有一个属性可以使加载变成异步的...在脚本标签上使用async属性...
<!DOCTYPE html>
<html lang="en">

<head>
</head>

<body>

    <!-- Script 1 -->
    <script src="js/script1.js" async></script> <!-- load asynchronously -->

    <!-- Script 2 -->
    <script src="js/script2.js" async></script> <!-- load asynchronously -->
</body>
</html>

定义和用法


async 属性是一个布尔属性。

当该属性存在时,它指定脚本将在可用时异步执行。

注意:async 属性仅适用于外部脚本(且仅在存在 src 属性时使用)。

注意:外部脚本可以有多种执行方式:

如果存在 async 属性:脚本会与页面的其他内容异步执行(脚本会在页面继续解析的同时执行)。如果不存在 async 属性但存在 defer 属性:脚本会在页面解析完成后执行。如果既没有 async 也没有 defer 属性:脚本会立即获取并执行,在浏览器继续解析页面之前。


0
为了确保您以正确的方式加载所有脚本,您必须使用一些依赖处理库,例如RequireJS,它允许您在声明的依赖项正确加载时执行代码。
如果您愿意,您可以使用类似jQuery.getScript的东西自己完成,或者将其作为示例在所有JavaScript中完成。

0
你可以使用 jQuery,尝试以下代码: 参考链接 - https://api.jquery.com/jquery.getscript/

$.getScript("js/script1.js", function() {
  console.log("script 1 loaded");
  $.getScript("js/script2.js",  function() {
      console.log("script 2 loaded");
   });
});


0
你无法检查它是否正在运行。你只能使用jQuery观察加载并在其完成时附加第二个脚本。

HTML:

<script id="first" src="js/script1.js"></script>

JS:

$("#first").on("load", function() {
    $("head").append('<script src="js/script2.js"></script>');
});

由于在添加事件监听器时已经加载了“#first”,我认为这种方法行不通。 - Roland Starke
DOM准备好后,加载不会开始吗?然后脚本应该在加载完成之前启动。否则,也可以通过js附加第一个脚本... - eisbehr

0

2
使用这种方式,您无法保证第一个脚本在第二个脚本之前加载。您在这里进行了一些异步Ajax调用。唯一的保证是$.getScript('script2.js');$.getScript('script1.js');之后被调用,但第一个脚本可能需要比第二个脚本更长的时间来完成。 - A. Wolff
这不是OP所说的吗?需要确保第一个文件script1.js在第二个脚本script2.js之前运行。 - Rob Scott
1
但是你的回答并不能解决问题,因为$.getScript()是异步的。实际上,OP发布的代码已经具有他期望的行为。毕竟,最初的问题并没有真正意义。 - A. Wolff

0
function loadJS(file) {
    // DOM: Create the script element
    var jsElm = document.createElement("script");
    // set the type attribute
    jsElm.type = "application/javascript";
    // make the script element load file
    jsElm.src = file;
    // finally insert the element to the body element in order to load the script
    document.body.appendChild(jsElm);
}



myScript.src = 'http://code.jquery.com/jquery-2.1.4.min.js';
myScript.onload = function() { 
  loadJS("js/script2.js")
};

0

你的第一个脚本新增了新功能。

function firstScriptFunction(){
 //i have done nothing here
}

你的 HTML 页面

<!DOCTYPE html>
<html lang="en">

<head>
</head>

<body>

    <!-- Script 1 -->
    <script src="js/script1.js"></script>

    <!-- Script to load script 2 -- >
    <script type="text/javascript">

       function loadSecondScript() {
            if (!(typeof firstScriptFunction == 'function')) {
                window.setTimeout(loadSecondScript, 3000);
            }
            else {
                var script = document.createElement('script');
                script.type = 'text/javascript';
                script.src = 'js/script2.js';
                document.getElementsByTagName('body')[0].appendChild(script);

            }
        }
        $(document).ready(function(){
          loadSecondScript();
       });
    </script>

</body>
</html>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接