我在某个未命名的供应商文档中看到了此代码示例。它似乎异步加载脚本,然后从中调用一个函数。我意识到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中它将一直有效。因为异步代码调试非常有趣......也许它对他们有用......
这是我的怀疑:)。
答案 0 :(得分:11)
怀疑是对的。发布的代码几乎可以保证在支持async属性的浏览器中无法正常工作。
基本上有3种“模式”:
来源: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中的新功能:由 到目前为止,我发现在我的网站上没有任何问题,在任何浏览器中使用此代码调用外部脚本: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类似的东西),所以这个异步代码可能非常有意义,如果浏览器中的所有东西都在缓存中(=对象已经在那里) )只是中断加载过程。