异步脚本加载的解决思路

详细诠释如何做到兼容加载的解决方案

不错鼓励并赞赏 标签: Javascript      评论 / 2019-09-15

关于html无阻塞加载文件方式有很多,本文主要讲述如何通过Script Dom 的方式来动态插入解决的思路

首先需要判断当前文件是什么类型,一般就是CSS和Javascript类型。

   function extname(path){
    var splitPath = /^(\/?)([\s\S]+\/(?!$)|\/)?((?:\.{1,2}$|[\s\S]+?)?(\.[^.\/]*)?)$/;
    var fileName = (path.match(splitPath) || [])[4] || "";
            return fileName.toLowerCase();
   }
   var type = extname(url).split('.')[1].split('?')[0]

因为根据不同的文件类型加载的方式和位置是不一样的

然后再根据不同类型进行节点方式选择

  var node  = document.createElement(type === 'css' ? 'link' : 'script')

最关键的是加载的状态判定,如果您要考虑IE 8的加载状态,就要使用 onreadystatechange 的方法,同时还要根据 node.readyState来进行判断

node.readyState有以下几种状态

  • uninitialized(未初始化):对象存在尚未初始化;

  • loading(正在加载):对象正在加载数据;

  • loaded(加载完毕):对象数据加载完成

  • interactive(交互):可以操作对象,但是还没有完全加载;

  • complete(完成):对象已经加载完毕。

实现代码如下:

 var loadStatus = 'onload' in node,
     readyEvent = loadStatus ? 'onload' : 'onreadystatechange';

     node[readyEvent] = function(){
        if(readyEvent == 'onload'){
            //todo something
        }else{
            //IE加载状态监测,为了兼容性更好,多增加loaded判断。如果没有在IE会提前加载的异常抛出
            if(/loaded|complete/.test(node.readyState)){
                //todo something
            }
        }
     }

当然如果再执行过程中出现任何异常可以发起讨论

Hi 看这里!

大家好,我是PRO

我会陆续分享生活中的点点滴滴,当然不局限于技术。希望笔墨之中产生共鸣,每篇文章下面可以留言互动讨论。Tks bd!

博客分类

您可能感兴趣

作者推荐

呃,突然想说点啥

前端·博客

您的鼓励是我前进的动力---

使用微信扫描二维码完成支付