【问题标题】:How to prevent JavaScript HTML blocking如何防止 JavaScript HTML 阻塞
【发布时间】:2010-01-26 17:31:47
【问题描述】:

如何防止 JavaScript 阻止其他 JavaScript 开始下载?

我的网站上有以下内容:

<html>
<body>
....
<script type="text/javascript" src="http://example.com/ex.js"></script>
<script type="text/javascript" src="http://google.com/google-maps.js"></script>
</body>
</html>

当我使用 YSlow Firefox 插件时,我可以从网络流量选项卡中看到 google.com/google-maps.js JavaScript 在 ex.js 完成下载之前不会开始下载。

问题:如何让ex.jsgoogle-maps.js 立即开始并行下载?

【问题讨论】:

    标签: javascript html blocking


    【解决方案1】:

    使用&lt;script&gt; 元素的async or defer attribute

    asyncdefer 脚​​本都开始 立即下载而无需暂停 解析器并且都支持 可选的onload 处理程序来解决 常见需要执行初始化 这取决于脚本。这 asyncdefer 之间的区别 以脚本为中心 执行。每个async 脚本都会执行 在它之后的第一个机会 完成下载之前 windowload 事件。这意味着它 可能(并且可能)async 脚本不按顺序执行 它们出现在页面中的位置。这 另一方面,defer 脚本是 保证按顺序执行 它们出现在页面中。那次执行 解析完成后开始 完成,但在document 之前 DOMContentLoaded 事件。

    • IE4+、Firefox 3.5+、Chrome 2+ 和 Safari 4+ 支持defer
    • Firefox 3.6+、Chrome 7+ 和 Safari 5+ 支持 async。 ( IE 支持!)

    defer 是您的最佳选择。脚本将并行下载并同步(按顺序)执行。它也比async 得到更好的支持和更可预测。 (另见this very detailed analysis of async/defer。)

    <script defer type="text/javascript" src="script.js"></script>
    

    【讨论】:

      【解决方案2】:

      这很难看,但您可以通过注入 DOM 元素来并行下载脚本……使用 javascript。

      查看this blog post 获取工作示例。

      【讨论】:

        【解决方案3】:

        这对于 HTML 中的内联脚本是正常的。您可以使用以下代码动态添加脚本:

        <script type="text/javascript">
            var head  = document.getElementsByTagName("head")[0]; 
            var sTag1 = document.createElement("script");
            var sTag2 = document.createElement("script");
            sTag1.type = sTag2.type = "text/javascript";
            sTag1.src = "http://example.com/ex.js";
            sTag2.src = "http://google.com/google-maps.js";
            head.appendChild(sTag1);
            head.appendChild(sTag2);
        </script>
        

        但是,这可能会导致意外结果 - 它们可能不会以正确的顺序下载和解析,如果脚本 2 引用脚本 1 中的变量或函数,这一点很重要。

        如果您只想在脚本加载之前加载 HTML,请保持它们的顺序并将它们 放在 HTML 文件的底部,而不是放在 head 标记中。这将在下载和解析脚本之前加载页面。见http://developer.yahoo.net/blog/archives/2007/07/high_performanc_5.html

        【讨论】:

        • 与@womp 推荐的相比,使用它的优点/缺点是什么。代码看起来完全不同
        • @Teddy - 查看提到的链接 womp,它们在功能上是相同的,但是该博客文章使用循环来迭代多个脚本源,然后以与我自己的代码类似的方式创建元素多于。看起来它只适用于 Firefox 和 Opera,而不是 Internet Explorer 或其他,它直接使用writeLn 编写 HTML。
        【解决方案4】:

        JavaScript 文件将始终按照指定的顺序下载。

        【讨论】:

        • 如何让JS文件并行下载?
        • @Teddy:你不能。这是浏览器的功能,而不是标记。 IIRC、Chrome 和 Safari 4 将对外部 JavaScript 进行一些并行加载,但您不能强制其他浏览器以这种方式运行。
        • @Eric Kolb,看看@womp - 他似乎有一个小脚本可以强制其他浏览器并行下载。
        • 好吧,这不是 my 脚本.. 但它应该可以完成这项工作
        猜你喜欢
        • 1970-01-01
        • 2017-12-09
        • 1970-01-01
        • 1970-01-01
        • 2015-04-22
        • 2016-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多