zoukankan      html  css  js  c++  java
  • 动态加载JS过程中如何判断JS加载完成

    在正常的加载过程中,js文件的加载是同步的,也就是说在js加载的过程中,浏览器会阻塞接下来的内容的解析。这时候,动态加载便显得尤为重要了,由于它是异步加载,因此,它可以在后台自动下载,并不会妨碍其它内容的正常解析,由此,便可以提高页面首次加载的速度。

    那么,既然js是异步加载,我们又该如何判断它是否加载完成呢?

    在IE或一些基于IE内核的浏览器中(如Maxthon),它是通过script节点的readystatechange方法来判断的,而其它的一些浏览器中,往往是通过load事件来决定的,如下代码:

    [javascript] view plaincopy
     
    1. function dynamicLoad()  
    2. {  
    3.    var _doc=document.getElementsByTagName('head')[0];  
    4.    var script=document.createElement('script');  
    5. script.setAttribute('type','text/javascript');  
    6. script.setAttribute('src','jquery-1.4.4.js');  
    7. script.onload=script.onreadystatechange=function(){  
    8.    if(!this.readyState||this.readyState=='loaded'||this.readyState=='complete'){  
    9.    alert('done');  
    10. }  
    11. script.onload=script.onreadystatechange=null;  
    12. }  
    13. }  

    我们把该方法添加到body的load事件中,<body onload='dynamicLoad()'>,运行,会发现IE或Maxthon中,会弹出‘done’对话框,但是firefox或chrome中却完全没有反应,why?

    这是因为,如果script节点没有添加到DOM树中,那么在chrome和firefox中是不会响应script的load事件的。但是IE中却可以。。修改后如下代码:

    [javascript] view plaincopy
     
    1. function dynamicLoad()  
    2. {  
    3.    var _doc=document.getElementsByTagName('head')[0];  
    4.    var script=document.createElement('script');  
    5. script.setAttribute('type','text/javascript');  
    6. script.setAttribute('src','jquery-1.4.4.js');  
    7. _doc.appendChild(script);  
    8. script.onload=script.onreadystatechange=function(){  
    9.    if(!this.readyState||this.readyState=='loaded'||this.readyState=='complete'){  
    10.    alert('done');  
    11. }  
    12. script.onload=script.onreadystatechange=null;  
    13. }  
    14. }  

    这时候,所有的浏览器都可以响应,你可以尝试一下~动态加载JS过程中如何判断JS加载完成

  • 相关阅读:
    奇技淫巧训练之一
    基于JS模块化现状谈谈选择ES6模块的原因
    vue-cli3项目搭建配置以及性能优化
    Umi + DvaJS
    ReactFragment用法介绍
    什么是纯函数
    10.25考试
    10.23考试
    线段树合并(雨天的尾巴 题解)
    10.21考试
  • 原文地址:https://www.cnblogs.com/daishuguang/p/3599705.html
Copyright © 2011-2022 走看看