构建js

(function(){
    //用于兼容构建的函数,当没有构建时也不致于未定义报错!
    window.__inline = window.__pkg = window.__uri = function(p){return p;}
    //生成ajax请求
    function createHttpRequest() {
        var xmlHttp;
        if (window.ActiveXObject) { 
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
        } 
        else if (window.XMLHttpRequest) { 
            xmlHttp = new XMLHttpRequest(); 
        }
        return xmlHttp;
    }

    //通过ajax请求资源
    function ajaxResource(url, callback, index, needTag) {
        var xmlhttp = createHttpRequest();
        xmlhttp.onreadystatechange=function(e){
            if(this.readyState == 4) {
                if(this.status == 200) {
                    callback&&callback(this.responseText);
                    //通过重试成功的资源
                    if(index > 0) {
                        window.__SENDDEBUGLOG && window.__SENDDEBUGLOG('reload resource '+url+' success count:' + index, true, '9001999902');
                    }
                }
                else {
                    //重试一次
                    if(index < 2 && this.status != 404) {
                        index++;
                        url = url.replace('qian-img.tenpay.com', location.hostname);
                        ajaxResource(url, callback, index, needTag);
                    }
                    else {
                        callback&&callback();
                    }
                    window.__SENDDEBUGLOG && window.__SENDDEBUGLOG('load resource '+url+' error count:' + index + ' status:'+this.status, true, '9001999901');
                }
            }
        };
        xmlhttp.open("GET",url,true); 
        //缓存中没有,指定了需要TAG处理,则优先返回,并延时处理资源
        if(index === 0 && needTag) {
            //css延时请求,因为如果缓存中没有的话,会直接生成link标签保证加载顺序
            setTimeout(function(){
                xmlhttp.send(null); 
            }, 800);
        } 
        else {
            xmlhttp.send(null); 
        }                                    
    }

    //资源加载
    //needTag 为表示是否需要用tag标签来加载没有缓存的资源,影响是否提前调用回调
    function loadResource(url, callback, index, needTag) {
        try {
            index = index || 0;
            var key = url.replace(location.hostname, 'qian-img.tenpay.com');
            var contentkey = '/*' + key + '*/'; //这里是完整的url,带有md5
            var sindex = key.indexOf('?');
            if(sindex > -1) key = key.substr(0, sindex);
            var content = window.localStorage.getItem(key);//先从缓存中取 
            //如果缓存中的内容配区上url(通常url中带有版本信息)               
            if(content && content.indexOf(contentkey) === 0) {
                callback&&callback(content);
            }
            else {                    
                ajaxResource(url, function(content){
                    if(content) {
                        content = contentkey + '\r\n' + content;
                        window.localStorage.setItem(key, content);                      
                    }
                    //needTag如果为true,则不再重复callback
                    if(!needTag) callback&&callback(content);      
                }, 0, needTag);
                //缓存中没有,指定了需要TAG处理,则优先返回
                if(needTag) callback && callback();
            }
        }
        catch(e){
            callback && callback();
        }
    }

    //加载JS
    //needScript 如果缓存没有是否需要用script加载
    window.loadJS = function(url, callback, needScript) {
        if(typeof callback == 'boolean') {
            needScript = callback;
            callback = null;
        }
        //如果是数组,加载多个js
        if(typeof url == 'object' && url.length) {
            var rets = [];
            for(var i=0;i<url.length;i++) {
                window.loadJS(url[i], function(ret){
                    rets.push(ret);
                    if(rets.length >= url.length) {
                        callback && callback.apply(this, rets);
                    }
                }, needScript);
            }
            return;
        }
        var jsLoaded = false;
        loadResource(url, function(content) {
            if(jsLoaded) return;
            jsLoaded = true;
            if(content) {
                try{
                    eval(content);
                }
                catch(e){
                    window.__docWriteScript && window.__docWriteScript(url); 
                }
                callback && callback(1);
            }
            else {
                if(needScript) window.__docWriteScript && window.__docWriteScript(url);  
                callback && callback(0);
            }
        }, 0, needScript);
    }
    //加载CSS,neetLink表示是否需要用link标签在无缓存时优先加载
    window.loadCSS = function(url, callback, container, neetLink) {
        var cssLoaded = false;
        loadResource(url, function(content) {
            if(cssLoaded) return;//不重复加载
            if(content) {
                var s = document.createElement('style');
                s.innerHTML = s.textContent = content;
                switch(container) {                        
                    case 'body':
                    case 'box': {
                        var box = document.querySelector('[data-role="page"]');
                        if(box&&box.length) {
                            box = box[box.length];
                        }
                        else {
                            box = document.body;
                        }
                        if(box) {
                            box.appendChild(s);
                            break;
                        }                            
                    }
                    case 'head':
                    default: {
                        document.head.appendChild(s);
                        break;
                    }
                }
                callback && callback(1);
            }
            else {
                window.__docWriteLink && window.__docWriteLink(url); 
                callback && callback(0);
            }
            cssLoaded = true;
        }, 0, typeof neetLink=='undefined'?true:neetLink);
    }        
})(); 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容