Javascript Async = true属性

时间:2013-05-08 06:46:06

标签: javascript asynchronous

我在某个未命名的供应商文档中看到了此代码示例。它似乎异步加载脚本,然后从中调用一个函数。我意识到if-undefined检查可以防止明显的错误,但这不是完全错误吗?

我相信在IE8 / 9中它可以正常工作但阻止执行,直到LOADER_URL脚本加载并执行;我相信许多其他支持async属性的浏览器,这只会导致内联块仅在部分时间内在if-block内执行代码。文档状态"标签是异步的,不会减慢页面的加载速度。"

<script type="text/javascript" src="LOADER_URL" async="true"></script>
<script type="text/javascript">
if (typeof (OBJECT_DEFINED_IN_LOADER_URL) != "undefined") { OBJECT_DEFINED_IN_LOADER_URL.Load(false); }
</script>

查看其文档的早期版本,它没有async属性的建议,也没有提出此声明。一些技术作家是否犯了错误并且说'#34;是的,那将会工作&#34;没有在所有浏览器中充分测试?在IE&lt; = 9中它将一直有效。因为异步代码调试非常有趣......也许它对他们有用......

这是我的怀疑:)。

5 个答案:

答案 0 :(得分:11)

怀疑是对的。发布的代码几乎可以保证在支持async属性的浏览器中无法正常工作。

基本上有3种“模式”:

  1. 如果存在async属性,则脚本一旦可用就会异步执行。
  2. 如果async属性不存在但是存在defer属性,则在页面完成解析后执行脚本。
  3. 如果两个属性都不存在,则在用户代理继续解析页面之前立即获取并执行脚本。
  4. 来源:http://www.w3.org/html/wg/drafts/html/master/scripting-1.html

    注意:忽略async属性值,仅存在属性表示脚本应异步执行。因此,将值设置为false仍然与将其设置为true相同。

答案 1 :(得分:3)

“Async = true”,当浏览器支持时,基本上意味着:浏览器将异步加载脚本并在需要时执行它。
因此,没有保证第二个脚本将在第一个脚本之后执行。

只有在页面中没有直接使用在asynch脚本中加载的对象的任何其他代码时,才能安全地使用“asynch js load”。

我有证据证明这一切,因为我在我的一个项目中犯了类似的错误,但通过小提琴或类似的东西复制并不容易。

因此,问题中提出的代码有时会工作,有时则不行。

答案 2 :(得分:3)

如果异步为真

脚本将尽快下载并执行,HTML页面将同时解析

,如果async为false

脚本下载和执行的过程将在开始任何HTML页面解析之前执行,因此在下载脚本并首先执行脚本时,HTML pasing将暂停。

答案 3 :(得分:1)

正如here所述,它是HTML5中的新功能:由 async属性作为其值指定异步执行的脚本(仅适用于外部脚本)。 / p>

到目前为止,我发现在我的网站上没有任何问题,在任何浏览器中使用此代码调用外部脚本:

function include(src, attr, value)
{
    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.setAttribute(attr, value);
    script.async = 'async';
    script.src = src;
    head.appendChild(script);
}

include('LOADER_URL', 'custom-attr', 'custom-value');

答案 4 :(得分:0)

这是否有意义取决于代码的结构。

您必须记住,浏览器会缓存某些文件(这包括脚本)。你的脚本似乎是某种类型的库,可以根据需要加载所需的资源(也许像require.js类似的东西),所以这个异步代码可能非常有意义,如果浏览器中的所有东西都在缓存中(=对象已经在那里) )只是中断加载过程。