• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
行动至上
博客园    首页    新随笔    联系   管理    订阅  订阅

离线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方法用于手工执行本地缓存的更新只能在applicationCatche的updateready事件被触发时调用,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参数用?',[为?赋值],funsuccess,funerror)

 

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

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

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

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

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

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

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

posted @ 2014-09-22 23:44  深秋寒露  阅读(361)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3