• 离线web存储


    本地缓存与浏览器网页的缓存

    本地缓存与浏览器网页缓存的区别

    离线缓存需要 本地缓存web应用程序的所有html css js 文件本地缓存服务于整个web应用

    浏览器网页缓存只服务于单个网页,

    任何网页都具有缓存,而本地缓存只缓存你指定缓存的网页。网页缓存不安全、不可靠,我们不知道网站中缓存了哪些网页,缓存了哪些网页上的资源。本地缓存是可靠,我们可以控制对那些没内容进行缓存,开发人员还可用编程的手段来控制缓存的更新,利用缓存对象的属性、状态事件开发更强大的离线web应用。

    manifest文件

      web应用的本地缓存是通过每个页面的manifest文件进行管理的

    CACHE MANIFEST   //必须的

    #This is a comment

    CACHE         //要缓存文件用于离线使用

    index.html

    style.css

    NETWORK:   //  不进行本地缓存存储的文件

    search.php

    login.php

    FALLBACK:   //两个文件分别为能够在线时访问使用的资源,不能在线访问时用的资源

    /api offline.html

    applicationCache对象:代表本地缓存,用它来通知本地缓存已被更新,也允许用户手动更新

    当浏览器对本地缓存更新,装入新文件的时会触发applicationCatche对象的updateready事件 来通知本地缓存已被更新(可以用它来告诉用户,用户需要手工刷新来获取页面的最新版本)

    applicationCatche.onUpdateReady = function(){}

    swapCatch方法用于手工执行本地缓存的更新只能在applicationCatcheupdateready事件被触发时调用,updateReady事件只有在服务器上的manifest文件被修更新,且把manifest文件中所要求的资源下载到本地时出发

        setInterval(function() {

            // 手工检查是否有更新

            applicationCache.update();

        }, 5000);

        applicationCache.addEventListener("updateready", function() {

            if (confirm("本地缓存已被更新,需要刷新画面来获取应用程序最新版

    本,是否刷新?")) {

            // (3) 手工更新本地缓存

                applicationCache.swapCache();

                // 重载画面

                location.reload();

            }

        }, true);

    applicationCatche的其他事件

    function init()

    {

        var msg=document.getElementById("msg");

        applicationCache.addEventListener("checking", function() {

            msg.innerHTML+="checking<br/>";

        }, true);

        applicationCache.addEventListener("noupdate", function() {

            msg.innerHTML+="noupdate<br/>";

        }, true);

        applicationCache.addEventListener("downloading", function() {

            msg.innerHTML+="downloading<br/>";

        }, true);

        applicationCache.addEventListener("progress", function() {

            msg.innerHTML+="progress<br/>";

        }, true);

        applicationCache.addEventListener("updateready", function() {

            msg.innerHTML+="updateready<br/>"; 

        }, true);

        applicationCache.addEventListener("cached", function() {

            msg.innerHTML+="cached<br/>";         

        }, true);

        applicationCache.addEventListener("error", function() {

    msg.innerHTML+="error<br/>";

        }, true);

    }

           HTML5近十年来发展得如火如荼,在HTML5平台上,视频,音频,图象,动画,以及同电脑的交互都被标准化。HTML功能越来越丰富,支持图片上传拖拽、支持localstorage、支持web sql database、支持文件存储api等等。它任重而道远,致力于将Web带入一个更为成熟的应用平台。在所有炫酷特性中,最让我喜欢的是它具有离线缓存Web应用的功能。

    开发离线Web 应用程序:三大核心功能

    在开发支持离线的 Web 应用程序时,开发者通常需要使用以下三个方面的功能:

    1. 离线资源缓存:需要一种方式来指明应用程序离线工作时所需的资源文件。这样,浏览器才能在在线状态时,把这些文件缓存到本地。此后,当用户离线访问应用程序时,这些资源文件会自动加载,从而让用户正常使用。HTML5 中,通过 cache manifest 文件指明需要缓存的资源,并支持自动和手动两种缓存更新方式。

    2. 在线状态检测:开发者需要知道浏览器是否在线,这样才能够针对在线或离线的状态,做出对应的处理。在 HTML5 中,提供了两种检测当前网络是否在线的方式。

    3. 本地数据存储:离线时,需要能够把数据存储到本地,以便在线时同步到服务器上。为了满足不同的存储需求,HTML5 提供了 DOM Storage 和 Web SQL Database 两种存储机制。前者提供了易用的 key/value 对存储方式,而后者提供了基本的关系数据库存储功能。

    离线存储HTML5 Web SQL Database

    Web SQL Database 提供了基本的关系数据库功能,支持页面上的复杂的、交互式的数据存储。它既可以用来存储用户产生的数据,也可以作为从服务器获取数据的本地高速缓存。例如可以把电子邮件、日程等数据存储到数据库中。Web SQL Database 支持数据库事务的概念,从而保证了即使多个浏览器窗口操作同一数据,也不会产生冲突。

    它还引入了一套使用 SQL 来操纵客户端数据库(client-side database)的 API,这些 API 是异步的(asynchronous)。所使用的 SQL 语言为 SQLite 3.6.19。其中 SQLite 是一款轻型的数据库,占用资源非常低,支持 Windows/Linux/Unix 等主流操作系统,同时能够跟很多程序语言相结合,如 C#,PHP,Java,JavaScript 等,比起 Mysql,PostgreSQL 这两款开源的数据库管理系统来说,它的处理速度更快。目前iOS和Android平台支持运行Web SQL Database。

    var db = window.openDatabase("DBName", "1.0", "description", 5*1024*1024); //5MB

    db.transaction(function(tx) {

    tx.executeSql("SELECT * FROM test", [], successCallback, errorCallback);

    });

    Web Workers

    main.js:

    var worker = new Worker('task.js');

    worker.onmessage = function(event) { alert(event.data); };

    worker.postMessage('data');

    task.js:

    self.onmessage = function(event) {

    // Do some work.

    self.postMessage("recv'd: " + event.data);

    };

      HTML5 IndexedDB:轻量级NoSQL数据库

    IndexedDB是HTML5-WebStorage的重要一环,是一种轻量级NoSQL数据库。

    w3c为IndexedDB定义了很多接口,其中Database对象被定义为IDBDataBase。

    浏览器对象中,实现了IDBFactory的只有indexedDB这个实例。

    五步创建HTML5离线Web应用

    在HTML5提供的所有炫酷功能里,创建离线缓存网页是我最喜欢的一个特性,以下是五步快速创建HTML5离线Web应用的步骤

    1. 第一步:创建一个有效的HTML5文档,HTML5 doctype比xhtml更易于识记。

    创建一个名为index.html的文件,这里学习如何使用CSS3来策划网站布局。

    http://www.catswhocode.com/blog/create-an-adaptable-website-layout-with-css3-media-queries

    2. 新增.htaccess支持

    我们要创建的缓存页面称为manifest文件,假设你所使用的服务器是Apache,我们在创建文件之前,需要往.htaccess文件新增一个指令。

    打开.htaccess文件,该文件部署在网站的根目录下,新增以下代码:

    AddType text/cache-manifest .manifest

    该指令可以确保每一个.manifest文件文本高速缓存。如果该文件不存在,整个缓存效果就无法实现,页面也不能实现离线缓存。

    3. 创建.manifest文件

    在我们创建好了.manifest文件后,事情就变得有趣多了。创建好新文件,命名为offline.manifest,嵌入以下代码。

    CACHE MANIFEST

    #This is a comment

    CACHE

    index.html

    style.css

    image.jpg

    image-med.jpg

    image-small.jpg

    notre-dame.jpg

    现在你拥有了一个完美的manifest列表。其实原理很简单,在声明CACHE后,你可以列出自己想要离线缓存的文件。这个对于缓存一个简单的网页,已经是绰绰有余了,而HTML5的缓存有其它一些有趣的功能。

    CACHE MANIFEST   //必须的

    #This is a comment

    CACHE         //要缓存文件用于离线使用

    index.html

    style.css

    NETWORK:   //  不进行本地缓存存储的文件

    search.php

    login.php

    FALLBACK:   //两个文件分别为能够在线时访问使用的资源,不能在线访问时用的资源

    /api offline.html

    在这个示例中,manifest文件声明了CACHE,用于缓存index.html和style.css。同时,我们声明了NETWORK,用于指定不被缓存的文件,比如登录页面。

    最后声明的是FALLBACK,这个声明允许将用户转入一个指定的页面,比如本例中如果不打算离线查看API资源的话,可以转向Off.html页面。

    4. 将manifest 文件链接到HTML文档中。

    在manifest文件和主要的html文档准备好了以后,你唯一还需要做的事情是将manifest文件链接到html文档中。

    操作方法很简单,只需在html元算中添加manifest 属性,代码如下:

    本地数据库

     1.创建访问数据库的对象                  //var db = openDatabase('mysql','1.0','Test DB',2*1024*1024) 当数据库不存在时会创建数据库

    2.使用事务处理                                   //访问数据库调用transaction方法执行事务处理  参数为一个回调函数

    Eg bd.transaction(function(tx){

             tx.executeSql('CREATE TABLE IF NOT EXISTS MsgData(name TEXT, message TEXT, time INTEGER)',[]); 

            tx.executeSql('SELECT * FROM MsgData', [], function(tx, rs)

            { //removeAllData(); 

                for(var i = 0; i < rs.rows.length; i++)

                { 

                    showData(rs.rows.item(i)); 

                } 

            });  });  });

    Tx.executeSql('sql参数用?',[为?赋值]funsuccessfunerror)

     

    本地缓存通过每个页面的mainfest文件来管理。 

    浏览器和服务器的交互过程: 

      浏览器请求URL->服务器返回页面->浏览器解析页面->服务器返回所有资源->浏览器处理mainfest文件->服务器返回所有要求本地缓存的文件->浏览器对本地缓存进行更新 

      浏览器再次请求URL->浏览器发现缓存->浏览器解析缓存页面->浏览器请求mainfest->(无更新)服务器返回304(【如果已更新】->浏览器再次请求URL->浏览器发现缓存页面->浏览器解析缓存页面->浏览器请求mainfest文件->服务器返回更新过的mainfest->浏览器处理mainfest->浏览器返回本地缓存->浏览器对本地缓存进行更新) 

    【缓存更新在本地缓存更新完还是不能用,只有重新打开这个页面的时候才能使用更新过的资源文件】 

          通过触发applicationCache对象的onUpdateReady事件,告诉用户本地缓存已经被更新,需手工刷新页面来得到最新版本的应用程序。 

        通过触发applicationCache对象的swapcache方法手工执行本地缓存更新操作,他只能在applicationCache对象的updataReady事件里被触发调用。 

  • 相关阅读:
    多色图标字体
    css编写规则BEM
    css处理工具PostCss
    vue2.0点击其他任何地方隐藏dom
    vue2.0多页面开发
    Dijkstra算法(邻接矩阵存储)
    kmp算法c++代码实现
    最小生成树(prim算法,Kruskal算法)c++实现
    字符串匹配的KMP算法(转)
    筛选法求素数
  • 原文地址:https://www.cnblogs.com/hansu/p/3987325.html
Copyright © 2020-2023  润新知