JavaScript加载和执行
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 5 <title>无标题文档</title> 6 <script> 7 window.onload =function(){ 8 var a=6; 9 document.getElementById("header").innerHTML="hello"; 10 } 11 </script> 12 </head> 13 <body> 14 <h1 id="header">zzzzz</h1> 15 <script> 16 alert(a); 17 </script> 18 </body> 19 </html>
以上代码 脚本放在<head></head>里,需要下载脚本花时间,代码执行花时间,如果脚本很多或者执行时间长,有些阻塞页面渲染,导致用户访问页面会先出现空白文档;
ReferenceError: a is not defined
如果没有window.onload,也会出错,因为页面还没加载完,比如没有<h1>也就取不到,根本改变不了innerHTML;当然了定义的a 是可以访问到的;
如果是下面这种形式,<script>放在底部
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
<script>
var a=6;
</script>
</head>
<body>
<h1 id="header">zzzzz</h1>
<script>
alert(a);
document.getElementById("header").innerHTML="hello";
</script>
</body>
</html>
这时候,页面先是出现zzzzz,之后弹出a的值,然后zzzzz的值改变hello;
2.组织脚本
考虑到HTTP请求会带来额外的性能开销,因此下载单个100kb的文件将比下载4个25kb的文件更快!减少页面中外链脚本文件的数量将会改善性能!网络上有工具可以合并<script>。
3.无阻塞脚本
就是页面加载完成后加载JavaScript代码。可以用defer属性或者HTML5的async属性,区别在于执行实际,async是加载完成后自动执行,defer等待页面完成后执行;defer现在被很多浏览器支持
<script type="text/javascript" src="file.js" defer></script>可以放在文档的任何位置!会下载,合适时机再执行(Dom加载完成)。注意是外链脚本!
4.动态脚本
无论在合适启动下载,文件的下载和执行过程不会阻塞页面其他进程;
<script>
function loaScript(url,callBack){
var script = document.createElement("script");
script.type = "text/javascript";
if(script.readyState){
script.onreadystatechange = function(){
if(script.readyState == "loaded" || script.readyState == "complete"){
scriot.onreadystatechange = null;
callBack();
}
};
}else{
script.onload = function(){
callBack();
}
}
script.src = null;
document.getElementsByTagName("head")[0].appendChild(script);
}
//如果你有多个外链脚本,如下调用
loadScript("file1.js",function(){
loadScriot("file2.js",function(){
loadScriot("file3.js",function(){
loadScriot("file4.js",function(){
alert("all file are loaded!")
})
})
});
})
</script>
5.XMLHttpRequest脚本注入。(优点:可以下载JavaScript代码但不立即执行)(缺点:JavaScript文件必须与所请求页面处于相同的域,意味着不能从CDN下载)
<script>
var xhr = new XMLHttpRequest();
xhr.open("GET","file1.js",true);
xhr.onreadystatechange = function(){
if(xhr.readyState==4){
if(xhr.status>=200&&xhr.status<300||xhr.status==304){
var script = document.createElement("script");
script.type = "text/javascript";
script.text = xhr.responseText;
document.body.appendChild(script);
}
}
};
xhr.send(null);
</script>

浙公网安备 33010602011771号