javascript脚本的延时加载
向HTML页面中插入js代码的主要方法是使用<script>
标签,在实际的开发中多采用外部文件的方式,主要考虑到外部js代码的可维护性及可缓存性等优点。传统的做法是将所有的外部文件放在<head>
元素中,这意味着等到所有的javascript代码都被下载、解析和执行之后,再开始渲染页面内容。这种情况下,当加载的外部js代码很多的时候,会导致浏览器渲染页面出现明显的延时,延时期间窗口会显示一片空白,即所谓的假死状态,也成为阻塞状态。
为了避免这种“假死”状态的出现,我们一般建议将外部js代码放在<body>
元素之后加载。
defer延时脚本
为了更好的解决页面渲染出现阻塞问题,在HTNL4.01中为<script>
标签定义了defer
属性,改属性只适用于外部脚本,其意图是在加载或执行脚本时不影响DOM的渲染。
<html>
<head>
<script type="text/javascript" defer="defer" src="demo1.js"></script>
<script type="text/javascript" defer="defer" src="demo2.js"></script>
</head>
<body>
//DOM创建等操作
</body>
</html>
上文代码中加入了两个外部script脚本,且其中都设置了defer属性,相当于告诉浏览器,立即下载脚本,但延时执行,在整个DOM加载完成后再执行。
另外,在HTML5中要求脚本按照期出现的先后顺序执行,即demo1要先于demo2执行,且两者都要先于DOMContentLoaded事件执行,而在现实中延时脚本不一定会按顺序执行,也不一定在DOMContentLoaded事件触发前执行,因此建议在页面中只包含一个延时脚本。
async异步加载
async表示异步,是单词asynchronous[异步的]简写。顾名思义,该属性表示异步加载脚本,与defer属性一样,也只适用于外部脚本。
async属性通知浏览器立刻下载脚本,与defer不同的是,async并不保证它们的先后执行顺序。async属性是为了让页面实现异步加载,而无需等待脚本的加载和执行。
<html>
<head>
<script type="text/javascript" async src="demo1.js"></script>
<script type="text/javascript" async src="demo2.js"></script>
</head>
<body>
//DOM创建等操作
</body>
</html>
在上述代码中,第二个脚本可能会优先于第一个脚本执行,因此一定要保证两个脚本之间没有依赖关系。