高性能JavaScript--加载和执行(简要学习笔记一)

简介:
1.多数浏览器使用单一进程来处理用户界面刷新和JavaScript脚本的执行。所以同一时刻只能做同一件事。JavaScript执行过程耗时越久,浏览器等待相应的时间就越长。
 
2.<script>标签用来加载出现在<head>中的外链JavaScript文件,紧挨着<link>标签用来加载外部css文件或者其他页面元素。理论上来说,把与样式和行为有关的脚本放在一起,并先加载他们,这样有助于确保页面的渲染和交互的正确性。但这样会带来严重的性能问题。
 
3.由于脚本阻塞页面其他资源的下载, 建议将所有的<script>标签放到<body>标签的底部
 
4.多个<script>外链脚本的下载会带来HTTP请求的性能开销。所以下载单个100KB的文件将比下载4个25KB的文件快。也即减少页面中外链的数量将会改善性能。
 
5.无阻塞脚本的秘诀在于, 在页面完成加载后才加载javascript。意味着在window对象的load事件触发后在下载脚本。
 
6. 方法一:defer属性(IE中)
属性规定是否对脚本执行进行延迟,直到页面加载为止。
该属性指明元素含有的脚本不会修改DOM。
复制代码
<html>
<body>
 
<script type="text/javascript" defer="defer">
alert(document.getElementById("p1").firstChild.nodeValue);
</script>
 
<p>上面的脚本会从下面的段落中请求信息。通常,这是做不到的,因为在段落加载之前,脚本已经运行过了。</p>
 
<p id="p1">hello zqz!</p>
 
<p>然而,defer 属性规定了脚本必须在页面加载完毕后执行。这样,脚本就可以从段落中请求数据了。</p>
 
<p><b>注释:</b>该属性只能在 Internet Explorer 中运行。</p>
 
</body>
</html>
复制代码

 
方法二:html5中新增加的方法async="true"(IE9中可以)

async 属性规定一旦脚本可用,则会异步执行。

注释:async 属性仅适用于外部脚本(只有在使用 src 属性时)。

复制代码
<!DOCTYPE html>
<html>
<body>
<p id="p1">Hello ZQZ!</p>
<script type="text/javascript" src="/example/html5/demo_async.js" async="async"></script>
</body>
</html>
复制代码

 

 

 

方法三:动态加载脚本

动态加载脚本节点下载文件时,返回的代码通常会立即执行。

书上说在火狐,谷歌等浏览器上可以使用<script>元素接收完成时触发的一个load事件来监听脚本加载完成时的状态

复制代码
<script>

    var script=document.createElement("script");
    script.type="text/javascript";

    script.load=function(){

        alert("接收外部script完成!");
    };

    script.src="scprit1.js";
    document.getElementsByTagName("head")[0].appendChild(script);


</script>
复制代码

可在我测试后,无论是在哪个浏览器都没有效果,不知道是为什么!求知道的博友们留言给我。谢谢!

 

而IE中有另外一种实现方式,他会触发一个readystatechange事件。可以用来监听script的加载完成。<script>元素提供一个readyState属性。

该属性有5种取值:

复制代码
"uninitialized"  //初始状态

"loading"  //开始下载

"loaded"   //下载完成 

"interactive"  //数据完成下载但尚不可用

"complete"  //所有数据已准备就绪
复制代码

然后在微软的相关文档中表明,在<script>生命周期中,并非每个取值都会用到。所以最靠谱的就是检查“loaded”跟"complete"。

复制代码
var script=document.createElement("script");
    script.type="text/javascript";

    
    script.onreadystatechange=function(){
        //alert("0")
        if(script.readyState=="loaded" || script.readyState=="complete"){

            script.onreadystatechange=null;   //删除事件处理器,避免处理两次 
            alert("外部js接收完成");
        }

    };

    script.src="scprit1.js";
    document.getElementsByTagName("head")[0].appendChild(script);
复制代码

 

该书中还有一个封装好的标准及IE特有的实现方法:

复制代码
function loadscript(url,callback){
    var script=document.createelement("script");
    script.type="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("scprit1.js",function(){

  alert("外部js加载完成!")  

})

转载:http://www.cnblogs.com/zqzjs/p/4802908.html

目录
相关文章
|
5月前
|
缓存 JavaScript 前端开发
高效打造跨平台桌面应用:Electron加载服务器端JS
【9月更文挑战第17天】Electron 是一个基于 Chromium 和 Node.js 的开源框架,允许使用 HTML、CSS 和 JavaScript 构建跨平台桌面应用。加载服务器端 JS 可增强应用灵活性,实现代码复用、动态更新及实时通信。通过 HTTP 请求、WebSocket 或文件系统可实现加载,但需注意安全性、性能和兼容性问题。开发者应根据需求选择合适方法并谨慎实施。
222 3
|
3月前
|
缓存 前端开发 JavaScript
JavaScript加载优化
JavaScript加载优化
|
3月前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
优化CSS和JavaScript加载
|
3月前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
Next.js和Nuxt.js在优化CSS和JavaScript加载方面提供了多种策略和工具。Next.js通过代码拆分、图片优化和特定的CSS/JavaScript优化措施提升性能;Nuxt.js则通过代码分割、懒加载、预渲染静态页面、Webpack配置和服务端缓存来实现优化。两者均能有效提高应用性能。
|
3月前
|
Web App开发 JavaScript 前端开发
高性能的纯Js滚动条美化插件smooth-scrollbar
smooth-scrollbar是一款高性能的纯JavaScript滚动条美化插件。该滚动条为现代浏览器而制作,它具有高性能,自由配置,平滑滚动等特点,支持各种现代桌面浏览器和手机设备。
|
5月前
|
JavaScript 前端开发 API
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
|
5月前
|
Web App开发 前端开发 JavaScript
HTML/CSS/JS学习笔记 Day3(HTML--网页标签 下)
HTML/CSS/JS学习笔记 Day3(HTML--网页标签 下)
|
4月前
|
JavaScript 前端开发
【干货分享】JavaScript学习笔记分享
【干货分享】JavaScript学习笔记分享
73 0
|
6月前
|
编解码 缓存 算法
Three.js如何降低3D模型的大小以便更快加载
为加快600MB的3D模型在Three.js中的加载速度,可采用多种压缩方法:1) 减少顶点数,使用简化工具或LOD技术;2) 压缩纹理,降低分辨率或转为KTX2等格式;3) 采用高效文件格式如glTF 2.0及draco压缩;4) 合并材质减少数量;5) 利用Three.js内置优化如BufferGeometry;6) 按需分批加载模型;7) Web Workers后台处理;8) 多模型合并减少绘制;9) 使用Texture Atlas及专业优化工具。示例代码展示了使用GLTFLoader加载优化后的模型。
722 12
|
6月前
|
前端开发 JavaScript Linux
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败

热门文章

最新文章