首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTML <脚本defer>能在< async>之前执行吗?

问HTML <脚本defer>能在< async>之前执行吗?
EN

Stack Overflow用户
提问于 2015-03-30 15:06:55
回答 2查看 1.7K关注 0票数 4

我正在问一个问题,这个问题已经得到了很好的探索,我的问题有很多相近的答案,但我还没有找到一个简单问题的确切答案。

我理解延迟脚本按照它们在页面上出现的顺序运行,但只在DOM构建之后才运行,并且我尽可能地让异步脚本运行,而且我知道没有一个阻止HTML解析器。

问题是:在所有异步脚本执行之前,是否存在延迟脚本可以执行的情况?本质上,如果HTML解析器已经解析了整个文档并准备好运行延迟脚本,但仍然有一些异步脚本尚未加载,那么它会等待这些异步脚本加载(并执行),还是会运行延迟脚本?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-30 16:29:46

从一个非常简单的测试来看,defer似乎没有等待async脚本加载.但是(总是有一个但是)它似乎也取决于浏览器。

我在Chrome 41、Firefox 36和Internet 11上进行了测试,对Chrome和FF ( defer在async之前执行)得到了相同的结果,但在IE上得到了不同的结果(async总是在defer之前执行)。

如果IE忽略了async属性(解析并立即执行代码),这可以解释,但是根据W3Schools和MDN,IE10支持async。因此,我猜IE以与其他浏览器不同的方式处理异步调用,使它在分析整个页面之前(然后在延迟脚本之前运行)加载和执行得更快。

这是我用于测试的HTML代码:

代码语言:javascript
复制
<!doctype html>
<html>

    <head>
        <title>Test</title>
        <script type="text/javascript" src="./async.js"></script>
        <script type="text/javascript" src="./defer.js"></script>
    </head>

    <body>
        Testing
    </body>

</html>

现在,async.js的内容:

代码语言:javascript
复制
console.log("async");

以及defer.js的内容:

代码语言:javascript
复制
console.log("defer");

如果我运行它“如实”,控制台的结果是:

异步 延时

这是预期的,因为脚本在浏览器继续解析页面之前立即执行。

现在让我们来看看async和defer,看看结果:

代码:

代码语言:javascript
复制
<script type="text/javascript" src="./defer.js" defer></script>
<script type="text/javascript" src="./async.js" async></script>

结果:

延时 异步

注意:这是Chrome和Firefox的结果;对于IE,控制台是异步的,然后推迟

Defer.js在async.js之前执行。但这可能是因为async.js在后面的代码中被放置,所以让我们交换它们。

代码:

代码语言:javascript
复制
<script type="text/javascript" src="./async.js" async></script>
<script type="text/javascript" src="./defer.js" defer></script>

结果:

延时 异步

注意:这是Chrome和Firefox的结果;对于IE,控制台是异步的,然后推迟

Defer.js仍然在async.js之前执行,即使以前已经调用了async.js。因此,回答您的问题:是的,在加载和解析所有异步脚本之前,会有延迟脚本执行的情况。

代码:

代码语言:javascript
复制
<script type="text/javascript" src="./async.js"></script>
<script type="text/javascript" src="./defer.js" defer></script>

或

代码语言:javascript
复制
<script type="text/javascript" src="./defer.js" defer></script>
<script type="text/javascript" src="./async.js"></script>

结果:

异步 延时

这个结果是预期的,因为在本例中,async.js将立即执行,并推迟等待页面解析(即使交换script位置,我们也会得到相同的结果)。

最后,测试在没有异步/延迟的异步脚本之前调用的异步脚本(不需要反过来测试,因为它将在调用异步之前立即执行):

代码:

代码语言:javascript
复制
<script type="text/javascript" src="./async.js" async></script>
<script type="text/javascript" src="./defer.js"></script>

结果:

延时 异步

票数 6
EN

Stack Overflow用户

发布于 2021-11-17 11:13:55

是的,理论上,具有async属性的脚本在具有defer脚本的脚本之后执行是可能的。您应该相应地对脚本进行编程。

即使在实践中没有出现这种情况,您仍然应该按照这种期望编写脚本,因为规范并不保证async脚本将在defer脚本之后执行,因此浏览器可以自由地以这种方式实现执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29349710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档