zoukankan      html  css  js  c++  java
  • 动态加载js css 插件

    简介      

          动态加载js,css在现在以及将来肯定是很重要的。目前来看前端代码编写的业务量已经远远超过后端编写的。随着对用户体验度逐渐增强,前端业务复杂,加载速度变得很慢很慢。为了解决这个问题,目前出现的两个前端模块加载器为require.js与sea.js,这两款模块加载器都不错。但是呢,有时候我仅仅需要的只是动态加载一个js,不需要把代码模块化,那我们只能自己手写一个加载函数。

    简单的加载js

    /**
     * HTML动态加载js
     * @path {String} src地址必须带有后缀名.js
     * */
    function addJs(path){
           var head = document.getElementsByTagName('head')[0];
           var script = document.createElement('script');
           script.src = path;
           script.type = 'text/javascript';
           head.appendChild(script);
    }

    这段代码已经满足我们需求,动态加载js。随之问题又来了,假设某一个前端小白不知道你加载了没有,又加载了一次,这样就是浪费流量,时间,还有可能造成一些问题。现在我来优化一下。

    次佳的加载js

    /**
     * HTML动态加载js
     * @path {String} src地址必须带有后缀名.js
     * */
    var cache=[];
    function addJs(path){
        var flag=0;//检查是否加载的状态
        for(var i=cache.length;i--;){
            cache[i]==path?flag=1:flag=0;
        }
        if(flag){//如果已经加载则不加载    
            return;
        }
        var head = document.getElementsByTagName('head')[0];
        var script = document.createElement('script');
        script.src = path;
        script.type = 'text/javascript';
        head.appendChild(script);
        cache.push(path);//把加载过的存起来
    }

    一天线上又出现bug了,结果一看是因为动态加载的js导致,因为只加载了,由于加载的js文件过大,导致还没加载成功,下边就开始使用了。下面在完善一下。

    不错的加载js

    /**
     * HTML动态加载js
     * @path {String} src地址必须带有后缀名.js
     * @callback {Function} 加载成功的回掉函数
     * */
    var cache=[];
    function addJs(path,callback){
        var flag=0;//检查是否加载的状态
        for(var i=cache.length;i--;){
            cache[i]==path?flag=1:flag=0;
        }
        if(flag){//如果已经加载则不加载    
            return;
        }
        var head = document.getElementsByTagName('head')[0];
        var script = document.createElement('script');
        script.src = path;
        script.type = 'text/javascript';
        head.appendChild(script);
        script.onload = script.onreadystatechange = function() {/*判断是否加载成功*/
        if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete" ) {
            script.onload = script.onreadystatechange = null;
                callback(); 
            }
        };
        cache.push(path);//把加载过的存起来
    }

    可以看出现在稍微完善一点,一天技术总监说,首页加载太慢了,js,css都要动态加载。这下我们还需要更改代码,再次优化一下。

    推荐使用的动态加载js,css

    var addStyleJs = (function(dom) {
        var cache = {}, /*缓存加载过的css或者js*/
        funct;
        /**
         * HTML动态加载css或者js
         * @path {String} src 或 link 地址必须带有后缀名.js或者.css
         * @callback {Function} 加载成功的回掉函数
         * */
        funct = function(path, callback) {
            if(!path) { /*检查路径是否为空*/
                throw new Error("请输入path路径!");
            };
            var fn=Object.prototype.toString.call(callback)=="[object Function]"?callback:function(){};
            if(".js" == path.substr(-3)) { /*检查路径后缀名是否为.js*/
                addJs(path, fn);
            } else if(".css" == path.substr(-4)) { /*检查路径后缀名是否为.css*/
                addCss(path, fn);
            } else {
                throw new Error('请输入正确的path路径!');
            }
        };
        /**
         * HTML 动态添加 CSS
         * @path {String}  link 地址必须带有后缀名.css
         * @callback {Function} 加载成功的回掉函数
         * */
        function addCss(path, callback) {
            if(!checkcache(path)) { /*检查是否加载过*/
                var head = dom.getElementsByTagName('head')[0];
                var link = dom.createElement('link');
                link.href = path;
                link.rel = 'stylesheet';
                link.type = 'text/css';
                head.appendChild(link); /*添加到HTML中*/
                link.onload = link.onreadystatechange = function() { /*判断是否加载成功*/
                    if(!this.readyState || this.readyState === "loaded" || this.readyState === "complete") {
                        link.onload = link.onreadystatechange = null;
                        callback();
                    }
                };
                cache[path] = 1; /*存储加载过的css路径,值设为1*/
            }
        };
        /**
         * HTML动态加载js
         * @path {String} src 地址必须带有后缀名.js
         * @callback {Function} 加载成功的回掉函数
         * */
        function addJs(path, callback) {
            if(!checkcache(path)) { /*检查是否加载过*/
                var head = dom.getElementsByTagName('head')[0];
                var script = dom.createElement('script');
                script.src = path;
                script.type = 'text/javascript';
                head.appendChild(script); /*添加到HTML中*/
                script.onload = script.onreadystatechange = function() { /*判断是否加载成功*/
                    if(!this.readyState || this.readyState === "loaded" || this.readyState === "complete") {
                        script.onload = script.onreadystatechange = null;
                        callback();
                    }
                };
                cache[path] = 1; /*存储加载过的js路径,值设为1*/
            }
        };
        /**
         * 检查是否加载
         * @path {String} 路径
         * */
        function checkcache(path) {
            if(cache[path]) { /*判断是否加载过的js路径*/
                return true;
            } else {
                return false;
                }
        };
        return funct;
    }(document));

    总结

           动态加载js与动态加载css在日常开发中也许会不常用,但是对于我们来说这是必须要会的。代码也许学几天就会写,但是写一段高质量的代码则需要你常常写,常常总结,思考。欢迎大家与我一同进步。如有问题请大家指出哦!

  • 相关阅读:
    HOOK劫持自己
    迷宫程序
    文件检索
    查看typedef类型
    位运算计算加法
    mfc进制转换
    递归进制转换_strrev
    printf("%x",12)//按十六进制输出
    MFC补码原码反码转换工具
    basename
  • 原文地址:https://www.cnblogs.com/xiaoxiaokun/p/7351122.html
Copyright © 2011-2022 走看看