接下来就给你们介绍一下几种延迟加载javascript方法:javascript
将js文件放在body底部(经常使用)html
可是第一种方法有时候会收到google延时加载js的警告,处理这种问题html5
在body底部接入以下代码
<script type="text/javascript"> function downloadJSAtOnload() { var element = document.createElement("script"); element.src = "defer.js"; document.body.appendChild(element); } if (window.addEventListener) window.addEventListener("load", downloadJSAtOnload, false); else if (window.attachEvent) window.attachEvent("onload", downloadJSAtOnload); else window.onload = downloadJSAtOnload; </script>
setTimeout延时加载(经常使用)java
defer和async。浏览器
- defer="defer":该属性用来通知浏览器,这段脚本代码将不会产生任何文档内容。例如 JavaScript代码中的document.write()方法将不会起做用,浏览器遇到这样的代码将会忽略,并继续执行后面的代码。属性只能是 defer,与属性名相同。在HTML语法格式下,也容许不定义属性值,仅仅使用属性名。 - async="true/false":该属性为html5中新增的属性,它的做用是可以异步地下载和执行脚本,不由于加载脚本而阻塞页面的加载。一旦下载完毕就会马上执行。 defer和async的比较
相同点:app
加载文件时不阻塞页面渲染; 对于inline的script无效; 使用这两个属性的脚本中不能调用document.write方法; 有脚本的onload的事件回调; 容许不定义属性值,仅仅使用属性名;
不一样点:异步
html的版本html4.0中定义了defer;html5.0中定义了async;这将形成因为浏览器版本的不一样而对其支持的程度不一样; 执行时刻:每个async属性的脚本都在它下载结束以后马上执行,同时会在window的load事件以前执行。因此就有可能出现脚本执行顺序被打乱 的状况;每个defer属性的脚本都是在页面解析完毕以后,按照本来的顺序执行,同时会在document的DOMContentLoaded以前执 行。
这两个属性会有三种可能的组合:async
若是async为true,那么脚本在下载完成后异步执行。 若是async为false,defer为true,那么脚本会在页面解析完毕以后执行。 若是async和defer都为false,那么脚本会在页面解析中,中止页面解析,马上下载而且执行。