JS异步加载及解决方式

1.js中的同步加载和异步加载有什么不同?
javascript语言是单线程机制。所谓单线程就是按次序执行,执行完一个任务再执行下一个。
对于浏览器来说,也就是无法在渲染页面的同时执行代码。
同步加载:也就是说一个事件处理程序没加载完之前,不会加载后面的程序。
异步加载:也就是并发加载,会同时处理几个事件处理程序。
举个生活中的例子:
早上起床,先刷牙,再烧水,等水烧开了洗脸,再整理发型.是同步
先刷牙,再烧水,再整理发型,等水壶滴的一声通知我水烧开了,我再取刚烧开的水洗脸,是异步.
2.js是同步加载的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div>
        <strong></strong>
    </div>
    <p></p>
    <span></span>
</body>
</html>

js在执行上述代码时:
首先绘制DomTree:
在这里插入图片描述
3.JS实现异步加载的三种方式
1.defer 异步加载,但是要等到dom文档全部解析完毕才会被执行。(可以在行间书写js代码)(只适用于IE)

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

//行内js
<script type="text/javascript"  defer="defer">
console.log(“a”);
</script>

2.async 异步加载1,加载完毕就会执行,async只能加载外部js脚本,不能把js书写在script标签内(W3C标准方法)

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

3.创建script,插入到DOM中,加载完毕后callback(通吃的方法)

<body>
    <script>
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = '123.js';
    document.head.appendChild(script);   
    
    //123.js 文件
//     function test(){
//     console.log('a');
// }
    </script>
</body>

直接调用 外部链接js文件中的test()函数;

  <script>
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = '123.js';
    document.head.appendChild(script);   
    
    //123.js 文件
//     function test(){
//     console.log('a');
// }
    //直接调用 test();
   // test();  
    // test is not undefined  (因为js文件会有一个加载的过程)

    //使用定时器,1s后调用test();
    setTimeout(function(){
        test();
    },1000)  //1s后打印了a
    </script>

判断js文件是否加载完毕之后进行后续操作:
chrome,oprea,firefox,safari

 script.onload = function(){
              test();
             }  //script.onload 在js加载完后触发```


ie

 script.onreadystatechange = function(){
                if(script.readyState == 'complete' || script.readyState == 'loaded')
                 {
                     test();
                 }
             }  //根据状态变化判断js是否加载完毕执行后续操作

封装函数:


    <script>
    function loadscript(url,callback){
    var  script = document.createElement('script');
    script.type = "text/javascript";
    //chrome,opera,firefox,safari
    script.onload = function(){
        callback();
    }
    //IE
    script.onreadystatechange = function(){
        if(this.readyState == 'complete' || 
        this.readyState == 'loaded')
        {
            callback();
        }
    }
    script.src = url;
    document.head.appendChild(script);
}
loadscript('123.js',function (){
    test();
});
</script>

因为IE会有状态判断的过程,如果程序小所消耗的时间极少,那么ie状态下函数就不会被触发,所以将加载js文件放到最后可以避免这个错误。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值