异步加载JS

 

异步加载的方法:

异步加载就相当于是添加了一条线程,与HTML和CSS并行加载,不会阻塞

 

1.defer:

<script type="text/javascript" src="demo.js" defer="defer"></script>

这样这个JS就是异步加载形式的了

但是只能IE来用,其他浏览器不支持

可以引入外部文件

 

2.async:

 <script type="text/javascript" src="demo.js" async="async"></script>

IE9以上都能执行,比较普遍

注意,这个在script标签里面不能写代码

只能引入外部文件

 

3.标准的开发异步加载形式

<script type="text/javascript" >
    var script=document.createElement("script");
    script.type="text/javascript";//设置Type
    script.src="toos.js";//设置src
    document.head.appendChild(script);//异步加载
    script.onload=function(){
        test();
    }
    </script>

我们创建一个script标签,并且引入我们的工具toos.js文件,里面有一个方法:


function test(){
    console.log("a");
}

当我们把它加入到head标签里面的时候就是异步加载,但是我们不能紧接着直接调用test,因为可能还没有加载完这个js文件,所以我们要

script.onload=function(){
        test();
    }

当他加载完以后再执行

这种形式的异步加载除了IE浏览器无法执行,其他都是可以的

那么IE的方法是什么呢:

IE提供了自己的方法:

readyState:这是一个状态码

当我们的readyState变成complete或者是loaded的时候表示加载完成我们才能调用这个函数

当然我们需要一个方法来监听这个状态码是否发生变化:onreadystatechange

var script=document.createElement("script");
script.type="text/javascript";//设置Type
script.src="toos.js";//加载文件
if(script.readyState){
        script.onreadystatechange=function(){
            if(script.readyState=="complete"||script.readyState=="loaded"){
                test();
            }
        }
    }

注意:

但是有一种情况,先说明一下,onreadychange是一个监听变化过程的函数,也就是说必须要有一个变化过程出现才能调用下面的test函数,但是如果因为一些外部条件,让toos.js加载的非常快,在监听之前,readyState就已经变成了completed,事件都还没来得及绑定,那么就触发不了这个函数了,所以我们把加载文件放在绑定事件的后面,先绑定事件:

var script=document.createElement("script");
script.type="text/javascript";//设置Type
if(script.readyState){
        script.onreadystatechange=function(){
            if(script.readyState=="complete"||script.readyState=="loaded"){
                test();
            }
        }
    }
script.src="toos.js";//加载文件

所以我们为了兼容性的问题,我们封装一个函数:

function loadScript(url,callback){//url是文件名,callback是需要调用的函数
    var script=document.createElement("script");
    script.type="text/javascript";//设置Type
    if(script.readyState){
        script.onreadystatechange=function(){
            if(script.readyState=="complete"||script.readyState=="loaded"){
                callback();
            }
        }
    }
    else{
        script.onload=function(){
        test();
        }
    }
    script.src="url";//设置src
    document.head.appendChild(script);
}

 

注意:异步加载JS中不能又doucument.write()方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值