动态加载js和css文件

 var require = (function () {
        var head = document.getElementsByTagName('head')[0];
        function load (url,callback) {
            var node,type = url.substr(url.lastIndexOf('.') + 1).toLowerCase();
            if(type == 'css'){
                node = document.createElement('link');
                node.href = url;
                node.rel = 'stylesheet';
                node.type = 'text/css';
            }else{
                node = document.createElement('script');
                node.src = url;
                node.type = 'text/javascript';
            }
            if(typeof callback == 'function'){
                if (!node.readyState) {
                    node.onload = callback;
                } else {
                    node.onreadystatechange = function () {//IE
                        if (this.readyState == 'loaded' || this.readyState == 'complete') {
                            this.onreadystatechange = null;
                            callback();
                        }
                    };
                }
            }
            head.appendChild(node);
        }
        return function (path, callback) {
            if(!path || path.length === 0){
                throw new Error('param "path" is required !');
            }
            if(typeof path === 'string'){
                path = [path];
            }
            load(path.shift(),finish);
            function finish () {
                if (!path.length) {
                    typeof callback === 'function' && callback();
                }else{
                    load(path.shift(),finish);
                }
            }
        }
    }) ();
    require(['js/test1.js','css/css1.css', 'lib/jquery3.1.js', 'js/test2.js', 'js/test3.js'], function () {
        console.log('加载完毕');
    });
    Firefox, Opera, Chorme 和 Safari 3+会在<script>节点接收完成之后发出一个 load 事件。你可以监听这一事件,得到脚本加载完毕的通知。

Internet Explorer 支持另一种实现方式,它发出一个 readystatechange 事件。<script>元素有一个 readyState属性,它的值随着下载外部文件的过程而改变。
readyState 有五种取值:“uninitialized”默认状态、“loading”下载开始、“loaded”下载完成、“interactive”下载完成但尚不可用、“complete”所有数据已经准备好
    微软文档上说,在<script>元素的生命周期中,readyState 的这些取值不一定全部出现,但并没有指出哪些取值总会被用到。实践中,我们最感兴趣的是“loaded”和“complete”状态。
Internet Explorer 对这两个readyState 值所表示的最终状态并不一致,有时<script>元素会得到“loader”却从不出现“complete”,但另外一些情况下出现“complete”而用不到“loaded”。
最安全的办法就是在 readystatechange 事件中检查这两种状态,并且当其中一种状态出现时,删除 readystatechange 事件句柄(保证事件不会被处理两次)。

 

posted @ 2016-10-20 14:58  minimal虾米  阅读(234)  评论(0编辑  收藏  举报