延迟属性和onload事件

时间:2016-01-12 20:52:32

标签: javascript

拥有以下代码:

<html>
    <head>  

        <script>            
            function elem_onload() {
                console.log("elem_onload");
            };      
        </script>

    </head>

    <body onload="elem_onload()">       
        <script type="text/javascript" src="script.js" defer></script>      
    </body>
</html>

的script.js:

console.log("external script");

defer属性似乎不起作用。输出是:

external script
elem_onload

是否带有延迟属性。 Shoudn&#ttt

elem_onload
external script 

是否定义了延迟?

重复的答案!?

我想说明我的答案不是

的重复

How exactly does <script defer=“defer”> work?

引用的推荐答案是内联脚本,浏览器行为对我来说很明显 - 它只是忽略defer。我的问题是关于外部脚本,在这种情况下,浏览器应该执行外部延迟脚本

  解析文档后

因为文档在onload事件后声明。

所以我等着得到合适的答案......

2 个答案:

答案 0 :(得分:4)

defer属性延迟的外部脚本在触发(DOMContentLoaded)之前执行,即初始HTML文档已完全加载和解析时。另一方面,onLoad标记上的<body>属性仅在网页完全加载时触发。

因此,defer属性确实有效。您可以通过尝试以下两种情况来测试它。在这两种情况下, script.js 文件的内容应为:

console.log(document.getElementById('sample').innerHTML);

CASE 1 HTML - defer - &gt;记录&#34;示例文本&#34;

<body onLoad="elem_onload()">       
<script type="text/javascript" src="script.js" defer></script>    
<div id="sample">Sample text</div>
</body>

案例2 HTML - 没有defer - &gt;记录错误

<body onLoad="elem_onload()">       
<script type="text/javascript" src="script.js"></script>    
<div id="sample">Sample text</div>
</body>

答案 1 :(得分:-1)

THX。一切都是为了帮助。

所以语句&#34; ...在文档被解析之后&#34;来自原始文件。 (MDN <script> tag) 从12.2.6 The end

开始说步骤#0

当文档被完全解析时,现在有几个任务需要完成。这些任务包括运行外部延迟脚本 是事先(#3)到onload事件。

我是对的吗?