javascript – HTML5脚本元素 – 异步属性 – 何时(以及如何最好)使用?

你能确认我的理解HTML5的<脚本异步>属性?

>页面中其他代码引用的任何库都不应该指定async属性。

例如,我的脚本引用可能看起来像:

<script src="jquery..." />         <!-- async not used - ensure that this is loaded before JQuery UI and my code -->
<script src="jquery.ui..." />      <!-- async not used - ensure that this is loaded before my code -->
<script src="my_code1.js" async /> <!-- async used, for page load performance -->
<script src="my_code2.js" async /> <!-- async used, for page load performance -->

>对于$(document).ready(function(){}块中的任何代码,我可以放心所有异步脚本已经加载。

我有这个权利吗?

最佳答案
与所有新的HTML5功能,我认为找到答案的最好的方法是测试他们在尽可能多的当前浏览器,我们可以。作为一般规则,旧的浏览器应该完全忽略async标志,因此代码应该按预期工作,从顶部到底部按顺序解析。

只要浏览器在处理它们时不一致,就应该避免在生产代码中使用它们,如果你不确定它们会工作。

这个功能的主要问题是,支持它的浏览器,事件被触发的顺序,例如,如果你在一个异步加载脚本中定义一个jQuery ready函数,它会被激发?您的ready事件在异步脚本加载之前或之后触发?

我创建了几个测试文件,你是非常欢迎有他们在不同的浏览器上玩,看看他们的行为。

短回答

关于@ Dave的假设:

For any code in a $(document).ready(function(){} block, I can be assured that all async script have already loaded.

它看起来不像迄今为止,它是相当不一致。在Chrome中,主就绪事件在异步文件加载之前触发,但在Firefox中它触发。

jQuery开发人员将不得不弥补他们的想法,如果他们将(并可以)支持它在未来或不。

测试页

我的测试脚本吐出一个字符串,显示你的顺序是它执行的不同部分。它可以通过以下方式构建:

> D:这意味着主文件中的脚本块被执行。有可能
后跟:ok如果函数in
异步加载脚本如果定义,
或:undefined如果不是。
> R:这意味着主文件中的jQuery ready事件被执行。
它可以后跟:ok如果
函数在异步加载脚本中
如果定义,或:undefined如果它是
不。
> L:异步加载脚本文件已执行。
> AR:jQuery ready事件在异步加载脚本已经
执行。

检测结果

支持异步的浏览器:

> Google Chrome 11.0.696.68:D:undefined R:undefined L AR
> Firefox 4.0.1:D:undefined L R:ok AR

浏览器支持异步,但没有异步测试(期待相同的结果):

> Google Chrome 11.0.696.68:L D:ok AR R:ok
> Firefox 4.0.1:L D:ok AR R:ok

不支持异步的浏览器(期待相同的结果):

> Internet Explorer 9:L D:ok AR R:ok
> Opera 11.11:L D:ok AR R:ok

测试脚本

test.html

<!DOCTYPE HTML>
<head>
    <title>Async Test</title>
    <script type="text/javascript">
        var result = "";
    </script>

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
    <script type="text/javascript" src="test.js" async></script>

    <script type="text/javascript">
    try{
        myFunc();
        result += "D:ok ";
    } catch(ex) { result += "D:undefined "; }

    $(function(){
        try{
            myFunc();
            result += "R:ok ";
        } catch(ex) { result += "R:undefined "; }
        $('body').text(result);
    });
    </script>
</head>
<body>
</body>
</html>

test.js

// Fires straight away when this file is loaded.
result += "L ";
$('body').text(result);

// A test function to see if it's defined in certain parts of the main file.
function myFunc(){
    return;
}

// A ready function to see if it fires when loaded async.
$(function(){
    result += "AR ";
    $('body').text(result);
});

转载注明原文:javascript – HTML5脚本元素 – 异步属性 – 何时(以及如何最好)使用? - 代码日志