`

使用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
分享到:
评论

相关推荐

    iOS webview Hybrid开发预加载.zip

    可能的实现方式包括监听网络状态、制定预加载策略(如优先级、最大并发数)、以及对预加载结果的反馈和错误处理。 总的来说,iOS Webview Hybrid开发中的预加载技术是一个关键的优化手段,能够显著提高应用的响应...

    电信设备-一种基于Sencha+Touch的移动办公应用的预加载优化方法.zip

    预加载是在用户启动应用之前预先加载部分或全部资源,以减少首次使用时的等待时间,提升用户体验。在Sencha Touch中,我们可以采用以下几种策略进行预加载优化: 1. **异步加载**:对于大型应用,可以将数据和组件...

    浅谈移动端网页图片预加载方案

    总结来说,移动端网页图片预加载方案需要考虑到各种设备和网络环境的差异。在iOS设备上,由于其特定的图片加载策略,单纯依赖浏览器缓存可能无法达到预期效果。采用Base64编码结合localStorage的方法,可以有效地...

    JavaScript客户端-在调用REST地图服务的同时使用5.0预缓存

    3. **本地存储**:使用HTML5的`localStorage`或`IndexedDB`来存储预加载的资源。这些存储机制允许在客户端持久化大量数据。 4. **检查本地缓存**:在发起请求前,检查本地是否已有预加载的资源,如果有,则直接使用...

    jQuery:图片缓存 10 jQuery Image Cache Plugins and Scripts

    - **PreloadJS**: 一个强大的预加载库,不仅支持图片,还能预加载音频和 JSON 等资源。 - **imgpreload**: 简单易用的预加载插件,适用于快速实现图片预加载功能。 - **imagesLoaded**: 主要用于检测图片是否已经...

    H5+C3 移动端小动画

    5. 视频处理:了解如何优化视频编码,设置合适的分辨率和比特率,以及如何处理视频预加载问题。 6. 响应式设计:让H5+C3动画适应不同设备的屏幕尺寸和方向,确保在手机、平板等设备上的良好展示。 7. 测试和调试:...

    基于vue20vuexlocalStorage开发的本地记事本

    通过Vue.js构建用户界面,Vuex管理应用状态,localStorage实现数据持久化,Sass提升样式编写效率,Webpack进行资源管理和优化,共同创建了一个功能完善的本地记事本应用,满足了多平台使用的需求。开发者可以在这个...

    基于html5 的移动阅读器.zip

    Service Worker技术更是增强了这一能力,它能在后台运行,拦截网络请求,实现预加载和缓存策略,提高应用响应速度。 表单控件在HTML5中也得到了改进,例如新增的日期选择器、输入类型限制等,这有助于提升移动设备...

    vue+vuex+localstorage记账小程序应用.zip

    7. Unit和E2E测试:可能使用Jest或Mocha等工具进行单元测试和端到端测试,确保应用的功能正确性和稳定性。 综上所述,这个"vue+vuex+localstorage记账小程序应用"是一个全面的前端项目,融合了Vue.js的组件化开发、...

    hangman:使用 Canvas、LocalStorage 和离线存储的简单“刽子手”游戏网络应用程序

    这样,即使在网络断开时,用户仍然可以访问这些预加载的游戏资源,继续他们的游戏。 这个"刽子手"游戏的实现,不仅展示了Canvas的强大绘图功能,还体现了LocalStorage和离线存储在提高Web应用用户体验上的重要作用...

    bootstrap:使用 bootstrap 为评论部分创建此模板和 localstorage

    在“bootstrap:使用bootstrap为评论部分创建此模板和localstorage”这个主题中,我们将探讨如何利用Bootstrap创建一个评论系统,并结合localStorage实现数据持久化。 首先,Bootstrap的核心在于其栅格系统,它允许...

    JavaScript优化以及前段开发小技巧

    例如,当检测到第三方应用不支持localStorage时,可以使用惰性模式立即或首次使用时重定义获取和设置方法,以减少不必要的检查。 3. 使用缓存: 对于频繁访问的数据,使用变量缓存结果可避免重复计算。例如,计算...

    web端炫酷的30个前端动态加载页

    通过阅读和分析这些源代码,开发者可以学习到如何结合各种技术实现不同的动态加载效果,如渐进式加载、滚动加载、预加载等。 总的来说,这30个前端动态加载页展示了HTML5、JavaScript、CSS3和小程序技术在构建高...

    html5注意力游戏升级版

    总的来说,"html5注意力游戏升级版"是一款结合了HTML5核心技术的趣味游戏,通过Canvas绘图、Web Storage管理、图片预加载、事件处理和CSS3动画,为玩家提供了一次愉快且富有挑战性的记忆训练体验。

    JS Good Books 2013

    6. **浏览器缓存和预加载策略**:书中讨论了浏览器缓存机制,如HTTP缓存头、本地存储(localStorage和sessionStorage)以及预加载和预解析技术,帮助开发者更好地利用这些特性提升用户体验。 7. **调试和性能分析**...

    todo-bootstrap-jQuery:一个简单的待办事项列表,将jQuery和Bootstrap与localStorage结合使用

    3. 使用jQuery监听事件,如点击“添加”按钮,触发函数获取输入框的值,并将其作为新的待办事项添加到页面和localStorage。 4. 对于已完成的待办事项,通过改变CSS类或更新DOM状态,并同步更新localStorage。 5. ...

    滚动加载

    这包括延迟加载(只在内容即将进入视口时加载)、预加载(预先加载部分数据,减少延迟感)以及智能加载(根据用户滚动速度和习惯调整加载策略)。 4. **数据缓存**:为了避免重复加载相同的数据,前端可以使用...

    前端 45 道面试题及答案.docx

    前端开发面试题解读 本文将详细解读前端开发面试题,涵盖浏览器工作原理、浏览器内核、COOKIE、SESSIONSTORAGE 和 ...可以使用图片懒加载、图片预加载技术、特殊编码的图像等方法优化图片加载,给用户更好的体验。

Global site tag (gtag.js) - Google Analytics