`

使用localstorage和预加载

 
阅读更多
## 

;(function (global) {
    'use strict';

    //检查文件类型
    var TYPE_RE = /\.(js|css)(?=[?&,]|$)/i;
    function fileType(str) {
        var ext = 'js';
        str.replace(TYPE_RE, function (m, $1) {
            ext = $1;
        });
        if (ext !== 'js' && ext !== 'css') ext = 'unknown';
        return ext;
    }

    //将js片段插入dom结构
    function evalGlobal(strScript){
        var scriptEl = document.createElement ("script");
        scriptEl.type= "text/javascript";
        scriptEl.text= strScript;
        document.getElementsByTagName("head")[0].appendChild(scriptEl) ;
    }

    //将css片段插入dom结构
    function createCss(strCss) {
        var styleEl = document.createElement('style');
        document.head.appendChild(styleEl);
        styleEl.appendChild(document.createTextNode(strCss));
    }

    // 在全局作用域执行js或插入style node
    function defineCode(url, str) {
        var type = fileType(url);
        if (type === "js"){
            //with(window)eval(str);
            evalGlobal(str);
        }else if(type === "css"){
            createCss(str);
        }
    }

    // 将数据写入localstorage
    var setLocalStorage = function(key, item){
        window.localStorage && window.localStorage.setItem(key, item);
    }

    // 从localstorage中读取数据
    var getLocalStorage = function(key){
        return window.localStorage && window.localStorage.getItem(key);
    }

    // 通过AJAX请求读取js和css文件内容,使用队列控制js的执行顺序
    var rawQ = [];
    var monkeyLoader = {
        loadInjection: function(url,onload,bOrder){
            var iQ = rawQ.length;
            if(bOrder){
                var qScript = {key: null, response: null, onload: onload, done: false};
                rawQ[iQ] = qScript;
            }
            //有localstorage 缓存
            var ls = getLocalStorage(url);
            if(ls !== null){
                if(bOrder){
                    rawQ[iQ].response = ls;
                    rawQ[iQ].key = url;
                    monkeyLoader.injectScripts();
                }else{
                    defineCode(url, ls)
                    if(onload){
                        onload();
                    }
                }
            } else {
                var xhrObj = monkeyLoader.getXHROject();
                xhrObj.open('GET', url, true);
                xhrObj.send(null);
                xhrObj.onreadystatechange = function(){
                    if(xhrObj.readyState == 4){
                        if(xhrObj.status == 200){
                            setLocalStorage(url, xhrObj.responseText);
                            if(bOrder){
                                rawQ[iQ].response = xhrObj.responseText;
                                rawQ[iQ].key = url;
                                monkeyLoader.injectScripts();
                            }else{
                                defineCode(url, xhrObj.responseText)
                                if(onload){
                                    onload();
                                }
                            }
                        }
                    }
                }
            }
        },

        injectScripts: function(){
            var len = rawQ.length;
            //按顺序执行队列中的脚本
            for (var i = 0; i < len; i++) {
                var qScript = rawQ[i];
                //没有执行
                if(!qScript.done){
                    //没有加载完成
                    if(!qScript.response){
                        console.error("raw code lost or not load!");
                        //停止,等待加载完成, 由于脚本是按顺序添加到队列的,因此这里保证了脚本的执行顺序
                        break;
                    }else{//已经加载完成了
                        defineCode(qScript.key, qScript.response)
                        if(qScript.onload){
                            qScript.onload();
                        }
                        delete qScript.response;
                        qScript.done = true;
                    }
                }
            }
        },

        getXHROject: function(){
            //创建XMLHttpRequest对象
            var xmlhttp;
            if (window.XMLHttpRequest)
                {
                    // code for IE7+, Firefox, Chrome, Opera, Safari
                    xmlhttp=new XMLHttpRequest();
                } else {
                    // code for IE6, IE5
                    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                }
                return xmlhttp;
        }
    };


    global.monkeyLoader = monkeyLoader.loadInjection;

})(this);

 

0
0
分享到:
评论

相关推荐

    SaFlickr:萨弗利克

    seed项目我正在使用引导程序样式我使用 localStorage 角度服务来保存选定的图像其他注意事项资产没有串联和缩小由于angular ng-attributes而无法验证我将 Flickr API 调用移到了 angular 服务中可以通过使用预加载器...

    brontodo:做MVC jQuery

    然后,我们使用ajax GET将用户GitHub通知(标题和ID)预加载到localStorage中。 下一步使用ajax POST将更新发送到GitHub,源将其保存到localStorage。作者布莱恩·雷(Brian Ray)( ) 罗纳德·金奇(Ronald Kinch...

    一个基于vue2.0开发的小说网站

    一个基于vue2.0开发的小说网站 1.0版本技术栈采用... store使用localStorage本地存储,dns预解析,vue-router路由组件的懒加载,部署后使用nginx缓存开启gzip压缩。 cd novel-vue yarn yarn serve 打包 yarn build

    Gu New Tab-故新标签页-crx插件

    新功能:• 修复图片长时间加载的bug• 修复磨砂滤镜下的黑边bug• 增加localStorage的安全封装v1.6.1:• 可直接在新标签页面修改motto/todo• 使用颜色预加载模式• 优化设置页面动画,版式• 新增fliker图源• ...

    人工智能-项目实践-html-一个基于vue2.0开发的小说网站.zip

    一个基于vue2.0开发的小说网站 1.0版本技术栈采用yarn、vue-cli3.0、axios、vue-router、vue-touch、... store使用localStorage本地存储,dns预解析,vue-router路由组件的懒加载,部署后使用nginx缓存开启gzip压缩。

    pwa-notes:一个渐进式Web应用程序,可将注释存储在localStorage中

    一个渐进式Web应用程序,可将注释存储在localStorage中 笔记 在发布任何预发行版之前,我的提交将不那么专业 主要提交内容将有完整的说明 其他提交(例如更改README.md或TODO)将具有基本说明(例如,“ Edited ...

    work-day-planner

    这是通过使用localStorage变量以及setItem和getItem方法来实现的。 实际的保存按钮是在引导程序,超棒的字体和预构建的style.css文件的帮助下创建的。 通过使用moment.js,该网站可以显示当前日期,同时还可以根据...

    Monitaure::bell:服务器正常运行时间监视渐进式Web应用程序-不再需要维护

    Monitaure是一项在线服务,旨在为SysAdmins提供一个干净,轻巧和快速配置的监控仪表板。 该应用程序不需要任何客户端安装或... 安全: 通过HTTPS服务, (TLS 1.2,OCSP装订,HSTS,HSTS预加载,转发保密等); CSRF代

    AzurLaneCDTool:碧蓝航线CD计算工具

    记录保存和加载(基于localStorage实现) 记录分享 界面优化: 移动端适配 航母装备选择辅助工具 基本功能 舰载机筛选: 支持对各位置的舰载机进行进一步的筛选 排序方式优化: 支持按Buff覆盖率排序 界面优化: ...

    LearnVue

    使用VueRouter / Vue Meta,预渲染/ serer渲染(SSR), C。 SEO友好网址d。 延迟加载而不是整个页面呈现e。 移动友好。 异步:异步函数是通过事件循环异步操作的函数,使用隐式Promise返回其结果。 异步等待使使用...

    WME_ChatJumper

    WME_ChatJumper 位智地图编辑器的“聊天跳线”。 /* 变更日志 0.0.7 - 修正错误,与 dummyd2 ...0.0.2 - 位置也保存在 localStorage 中,因此即使页面重新加载它也会被记住 0.0.1 - 初始版本 */ 许可证 MIT/BSD/X11

Global site tag (gtag.js) - Google Analytics