当前位置:首页 > 学习提升 > javascript > 正文内容

异步加载js的方法

自由小鸟2年前 (2023-01-03)javascript914

一、为什么要写异步加载
①js加载本身是属于同步加载的,加载js文件会阻塞文档,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作。但是有些工具方法需要按需加载,有一些工具js文件它是不会改变页面的,用到再加载,不用不加载。

②但是实际开发中我们只需要把script标签放在页面的最下面。完全没有必要写赘余代码,但是按需加载一定是面试的重中之重!!!

二、JS异步加载的三种方案:

①defer

​ script标签中增加defer属性,异步加载

​ 1.但要等dom文档全部解析完(dom树生成)才会被执行。

​ 2.只有IE能用;

②async

​ script标签中增加async属性,异步加载

​ 1.加载完就执行;async只能加载外部脚本

​ 2.不能把js写在script标签里。

​ 3.w3c标准,IE9以下不支持

③封装一个函数兼容性的异步加载js文件并且可以按需执行该文件里面的函数(按需加载)

<script>
        function loadScript(url,callback){
            //url是按需加载的js文件
            //callback是按需加载的js文件中某个函数

            // 1. 创建一个script标签
            var script = document.createElement('script');    
            // 处理ie的兼容
            if(script.readyState){
                script.onreadystatechange = function(){
                    // 如果script已经下载完成
                    if(script.readyState == 'complete' || script.readyState == 'loaded'){
                        callback();
                    }
                }
            }else{
                // 监听script的下载的状态 当状态变为下载完成后 再执行callback
                script.onload = function(){
                    callback();
                }
            }
            //在后面引入的目的是如果在IE上如果下载太快(比读程序还快)
            //IE的readystatechange 事件检测状态码的时候,它早已经从loading变成complete或者loaded(以极快的速度加载完了文件,你还没来得及检测)
            // 那你再检测它就不会变了,它一直都是complete或者loaded
            //这个时候就是马后炮了,检测也没用了。
            // 2. 给script标签添加src 引入一个js文件
            script.src = url;
            // 3. 追加到body
            document.body.appendChild(script);
        }
    </script>

三、最后补充: document三个状态

​ ①loading 加载中状态,dom树正在绘制中

​ ②interactive 活跃状态,dom树绘制完成

③complete 完成状态(老版本的浏览器可能是loaded),dom树绘制完成并且所有的资源下载完成

转发

版权声明:本文由Web学习之路发布,如需转载请注明出处。

本文链接:https://webge.net/?id=165

“异步加载js的方法” 的相关文章

未命名

未命名

1、clientHeight:表示的是可视区域的高度,不包含border和滚动条;2、offsetHeight:表示的是可视区域的高度,包含了border和滚动条3、scrollHeight:表示了所有区域的高度,包含了因为滚动被隐藏的部分;4、clientTop:表示边框border的厚度,在未指...

js拖拽功能的实现

如果要设置物体拖拽,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒。 1.onmousedown:鼠标按下事件2.onmousemove:鼠标移动事件3.onmouseup:鼠标抬起事件 拖拽的基本原理就是根据鼠标的移动来移动被拖拽的元素。鼠标的移动也就是x、y坐标的变化;元素的移动就是...

说说你对作用域链的理解

说说你对作用域链的理解

˂a name="一、作用域" class="reference-link" href="#"˃一、作用域作用域,即变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合 换句话说,作用域决定了代码区块中变量和其他资源的可见性举个例子 function myFunction() {...

Javascript如何实现继承

JavaScript想实现继承的目的:重复利用另外一个对象的属性和方法 ˂a name="一,原型链继承" class="reference-link" href="#"˃一,原型链继承让一个构造函数的原型是另一个类型的实例,那么这个构造函数new出来的实例就具有该实例的属性。当试图访问一个对象的...