热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HTML5离线应用与客户端存储的实现

这篇文章主要介绍了关于HTML5离线应用与客户端存储的实现,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
这篇文章主要介绍了HTML5离线应用与客户端存储的实现的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

支持离线 Web 应用开发是 HTML5 的另一个重点。所谓离线 Web 应用,就是在设备不能上网的情况下仍然可以运行的应用。

开发离线Web 应用需要几个步骤。首先是确保应用知道设备是否能上网,以便下一步执行正确的操作。然后,应用还必须能访问一定的资源(图像、Javascript、CSS等),只有这样才能正常工作。最好,必须有一块本地空间用户保存数据,无论能否上网都不妨碍读写。

HTML5 及其相关的 API让开发离线应用成为现实。

离线检测

要知道设备是否在线还是离线,HTML5 定义了一个 navigator.onLine 属性,这个属性值为 true 表示设备能上网,值为 false 表示设备离线。

if (navigator.onLine) {
    // 正常工作
} else {
    // 执行离线状态时的任务
}

由于 navigator.onLine 存在一定的兼容性问题,因此除了 navigator.onLine 属性之外,为了更好地确定网络是否可用,HTML5 还定义了两个事件 online 和 offline。

当网络在离线和在线之间切换时在 window 对象上触发这两个事件:

window.addEventListener('online', function() {
    // 正常工作
});

window.addEventListener('offline', function() {
    // 执行离线状态时的任务
});

在实际应用中,最好在页面加载后,最好先通过 navigator.onLine 取得初始的状态。然后通过上述两个事件来确定网络连接状态是否变化。当上述事件触发时,navigator.onLine 属性的值也会改变,不过必须要手工轮询这个属性才能检测到网络状态的变化。

应用缓存

HTML5 的应用缓存(application cache),或者简称为 appcache,是专门为开发离线 Web 应用而设计的。Appcache 就是从浏览器的缓存中分出来的一块缓存区。要想在这个缓存中保存数据,可以使用一个描述文件(manifest file),列出要下载和缓存的资源。描述文件示例:

CACHE MANIFEST
# Comment

file.js
file.css

然后在 html 中引用:

xxx.manifest 文件的 MIME 类型必须是 text/cache-manifest。

该 API 的核心是 applicationCache 对象,这个对象有一个 status 属性,属性的值是常量,表示应用缓存的如下当前状态:

  • 0: 无缓存,即没有与页面相关的应用缓存

  • 1: 闲置,即应用缓存未得到更新

  • 2: 检查中,即正在下载描述文件并检查更新

  • 3: 下载中,即应用缓存正在下载描述文件中指定的资源

  • 4: 更新完成,即应用缓存已经更新了资源,而且所有资源都已下载完毕,可以通过 swapCache() 来使用了

  • 5: 废弃,即应用缓存的描述文件已经不存在了,因此页面无法再访问应用缓存

相关事件:

  • checking: 在浏览器为应用缓存查找更新时触发

  • error: 在检查更新或者下载资源期间发生错误时触发

  • noupdate: 在检查描述文件发现文件无变化时触发

  • downloading: 在开始下载应用缓存资源时触发

  • progress: 在文件下载应用缓存的过程中持续不断地触发

  • updateready: 在页面新的应用缓存下载完毕且可以通过 swapCache() 使用时触发

  • cached: 在应用缓存完整可用时触发

一般来讲,这些事件会随着页面加载按上述顺序依次触发。也可以通过调用 update() 方法手动触发上述事件。

数据存储

COOKIE

HTTP COOKIE,通常直接叫做 COOKIE,是在客户端用于存储会话信息的。该标准要求服务器对任意 HTTP 请求发送 Set-COOKIE HTTP 头信息作为响应的一部分,其中包含会话信息。服务器响应头示例:

HTTP/1.1 200 OK
Content-type: text/html
Set-COOKIE: name=value
Other-header: other-header-value

然后浏览器 Set-COOKIE 的会话信息,之后为每个请求添加 COOKIE HTTP 头将信息发送回服务器,如下所示:

GET /index.html HTTP/1.1
COOKIE: name=value
Other-header: other-header-value

发送回服务器的额外信息可以用于唯一验证客户来自于发送的哪个请求。

完整的 COOKIE 包括:

  1. 名称: 一个唯一确定 COOKIE 的名称。必须被 URL 编码。

  2. 值: 存储在 COOKIE 中的字符串值。必须被 URL 编码。

  3. 域: COOKIE 对于哪个域是有效的。

  4. 路径: 对于指定域中的那个路径,应该向服务器发送 COOKIE。

  5. 失效时间: 表示 COOKIE 何时应该被删除的时间戳。

  6. 安全标志: 指定后,COOKIE 只有在使用 SSL 连接的时候才发送到服务器。

代码如下:

Set-COOKIE:name=value; domain=www.laixiangran.cn; path=/; expires=Mon, 29 Oct 2018 03:53:10 GMT; secure;

基本用法

在 Javascript 中操作 COOKIE 有些复杂,这是因为 document.COOKIE 属性在不同的使用方式中表现出不同的行为。

当用来获取属性值时,document.COOKIE 返回当前页面可用的所有 COOKIE 字符串,一系列由分号隔开的键值对,如下所示:

document.COOKIE
// name1=value1;name2=value2;name3=value3;

当用来设置值时,document.COOKIE 属性会设置一个新的 COOKIE 字符串添加到现有的 COOKIE 集合中,并不会像普通对象设置属性一样覆盖原 COOKIE 的值,除非设置的 COOKIE 的名称已经存在,如下所示:

// COOKIE 的名称不存在
document.COOKIE = 'name4=value4'
// name1=value1;name2=value2;name3=value3;name4=value4;
// 而不是 name4=value4;
// COOKIE 的名称存在
document.COOKIE = 'name3=value4'
// name1=value1;name2=value2;name3=value4;

从上面的代码我们可以看出,我们要读取或者修改或者删除指定 COOKIE 的值都不是很直观方便,因此我们可以封装一些方法,方便我们对 COOKIE 的操作:

var COOKIEUtil = {

    get: function (name) {
        var COOKIEName = encodeURIComponent(name) + "=",
            COOKIEStart = document.COOKIE.indexOf(COOKIEName),
            COOKIEValue = null,
            COOKIEEnd;

        if (COOKIEStart > -1) {
            COOKIEEnd = document.COOKIE.indexOf(";", COOKIEStart);
            if (COOKIEEnd == -1) {
                COOKIEEnd = document.COOKIE.length;
            }
            COOKIEValue = decodeURIComponent(document.COOKIE.substring(COOKIEStart + COOKIEName.length, COOKIEEnd));
        }

        return COOKIEValue;
    },

    set: function (name, value, expires, path, domain, secure) {
        var COOKIEText = encodeURIComponent(name) + "=" + encodeURIComponent(value);

        if (expires instanceof Date) {
            COOKIEText += "; expires=" + expires.toGMTString();
        }

        if (path) {
            COOKIEText += "; path=" + path;
        }

        if (domain) {
            COOKIEText += "; domain=" + domain;
        }

        if (secure) {
            COOKIEText += "; secure";
        }

        document.COOKIE = COOKIEText;
    },

    unset: function (name, path, domain, secure) {
        this.set(name, "", new Date(0), path, domain, secure);
    }
};

使用方法:

// 设置 COOKIE
COOKIEUtil.set('name', 'lai');
COOKIEUtil.set('sex', 'man');

// 读取 COOKIE
COOKIEUtil.get('name'); // 'lai'
COOKIEUtil.get('sex'); // 'man'

// 删除 COOKIE
COOKIEUtil.unset('name');
COOKIEUtil.unset('sex');

// 设置 COOKIE,包括它的路径、域、失效日期
COOKIEUtil.set('name', 'lai', '/', 'www.laixiangran.cn', new Date());

大小限制

  • 每个域的 COOKIE 总数是有限,不同浏览器之间所有不同,IE6 以下是最多 20 个,IE7 以上最多 50 个,Firefox最多 50 个,Opera 最多 30 个,Safari 和 Chrome 不限制。

  • COOKIE 的尺寸也有限制,大多数浏览器有大约 4096B。

Web Storage

  • Web Storage 的目的是克服由 COOKIE 带来的一些限制,当数据需要被严格控制在客户端上时,无须持续地将数据发回服务器。Web Storage 的两个主要目标是:

  • 提供一种在 COOKIE 之外存储会话数据的路径。

  • 提供一种存储大量可以跨会话存在的数据的机制。

Web Storage 主要定义了两种对象:sessionStorage 和 localStorage,是 Storage 对象的实例,这两个对象区别如下:

  • sessionStorage: 存储特定于某个会话的数据,也就是该数据只保持到浏览器关闭。存储数据大小大多数限制在 2.5M,少数浏览器限制在 5M 或者不限制。

  • localStorage: 数据保存到通过 Javascript 删除或者是用户清除浏览器缓存。存储数据大小大多数限制在 5M,少数浏览器限制在 2.5M 或者不限制。

Storage 类型有如下方法:

  • clear(): 删除所有值。

  • getItem(name): 根据指定的名字 name 获取对应的值。

  • key(index): 获取 index 位置处的值的名字。

  • removeItem(name): 删除由 name 指定的键值对。

  • setItem(name, value): 为指定的 name 设置一个对应的值,值为字符串。

对 sessionStorage 和 localStorage 进行操作都会触发 storage 事件,该事件对象有以下属性:

  • domain: 发生变化的存储空间的域名。

  • key: 设置或者删除的键名。

  • newValue: 如果是设置值,则是新值;如果是删除键,则是null。

  • oldValue: 键被更改之前的值。

IndexedDB

Indexed Database API,简称为 IndexedDB,是在浏览器中保存结构化数据的一种数据库。其思想是创建一套 API,方便保存和读取 Javascript 对象,同时还支持查询和搜索。

IndexedDB 设计的操作完全是异步进行的。因此,大多数操作会以请求方式进行。

基本用法

var indexedDB = window.indexedDB || window.msIndexedDB || window.mozIndexedDB || window.webkitIndexedDB, // 获取 indexedDB
    request,
    store,
    database,
    users = [
        {
            username: "007",
            firstName: "James",
            lastName: "Bond",
            password: "foo"
        },
        {
            username: "ace",
            firstName: "John",
            lastName: "Smith",
            password: "bar"
        }
    ];

// 打开数据库
request = indexedDB.open("example");

// 注册 onerror 及 onsuccess 事件
request.Onerror= function (event) {
    alert("Something bad happened while trying to open: " + event.target.errorCode);
};
request.Onsuccess= function (event) {
    database = event.target.result;
    
    // 操作数据库
    initializeDatabase();
};

function initializeDatabase() {
    if (database.version != "1.0") {
    
        // 设置数据库版本号
        request = database.setVersion("1.0");
        request.Onerror= function (event) {
            alert("Something bad happened while trying to set version: " + event.target.errorCode);
        };
        request.Onsuccess= function (event) {
        
            // 使用 users 创建对象存储空间
            store = database.createObjectStore("users", {keyPath: "username"});
            var i = 0,
                len = users.length;

            while (i 

限制

  • 和 Web Storage类似,只能由同源(相同协议、域名和端口)页面操作,因此不能跨域共享信息。

  • Firefox 大小上限为 50M,移动端的 Firefox 大小上限为 5M,不允许本地文件访问。

  • Chrome 大小上限为 5M,允许本地文件访问。


以上就是HTML5离线应用与客户端存储的实现的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • ECMA262规定typeof操作符的返回值和instanceof的使用方法
    本文介绍了ECMA262规定的typeof操作符对不同类型的变量的返回值,以及instanceof操作符的使用方法。同时还提到了在不同浏览器中对正则表达式应用typeof操作符的返回值的差异。 ... [详细]
  • 使用chrome编辑器实现网页截图功能的方法
    本文介绍了在chrome浏览器中使用编辑器实现网页截图功能的方法。通过在地址栏中输入特定命令,打开控制台并调用命令面板,用户可以方便地进行网页截图操作。 ... [详细]
  • CSS|网格-行-结束属性原文:https://www.gee ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
author-avatar
mobiledu2502879833
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有