
(图片来源:http://www.cnblogs.com/sharpxiajun/p/4072396.html)
这是清除浏览器缓存后,第一次访问百度首页的场景,在Firefox的瀑布图中可以看到:javascript文件下载完毕后,有一段时间没有请求处理。这段时间过后,请求才会接着执行,这段时间就是HTTP请求阻塞。
当浏览器遇到<script>标签时,浏览器会停止处理页面,先执行Javascript代码,然后再继续解析和渲染页面。在这个过程中,页面和用户的交互完全被阻塞了。通常表现为显示空白页面,用户无法浏览内容。
现在的浏览器都支持并行下载文件,比如上图同时下载多个图片。而且,IE8 、FireFox3.5、Safari4和Chrome2都支持并行下载javascript文件,但是javascript文件的下载会阻塞其他资源的下载。尽管脚本的下载过程不会相互影响,但是页面仍然需要等待javascript的执行完毕才能继续。所以,新浏览器通过并行下载提高了性能,但是脚本阻塞问题仍然没有解决。
解决方法有:
(1)把<script>标签放到</body>闭合之前
由于脚本会阻塞其他资源的下载,因此推荐把所有的<script>标签尽可能的放到<body>标签的底部。<span style="font-size:14px;"> var script=document.createElemetn("script");
script.type="text/javascript";
script.src="file.js";;
document.getElementsByTagName("head").appendChild(script);</span>var script =document.createElement("div");
script.type="text/javascript";
script.onload=function(){
alert("ok");
};
script.src="file.js";
document.getElementsByTagName("head")[0].appendChild(script);
var script=document.createElement("script");
script.type="text/javascript";
//IE
script.onreadystatechange=function(){
if(script.readyState=="loaded"||script.readyState="complete"){
script.onreadystatechange=null;
alert("ok");
}
}function loadScript(url ,callback){
var script=document.createElement("script");
script.src="text/javascript";
if(script.readyState){//IE
script.onreadyStateChange=function(){
if(script.readyState=="loaded"||script.readyState=="complete"){
script.onreadystatechange=null;
callback();
}
};
}else{//其他浏览器
script.onload=function(){
callback();
};
}
script.src=url;
document.getElementsByTagName("head")[0].appendChild(script);
}
loadScript("file1.js",function(){
alert("ok")
});loadScript("file1.js",function(){
loadScript("file2.js",function(){
loadScript("file3.js",function(){
alert("ok");
});
});
});<script type="text/javascript" src="test.js"></script>
<script type="text/javascript">
loadScript("file.js",function(){
alert("ok");
});
</script>
参考:(http://www.cnblogs.com/sharpxiajun/p/4072396.html)
《高性能JavaScript 》
原文地址:http://blog.csdn.net/vuturn/article/details/46574651