H5离线应用与客户端存储使用详解

这次给大家带来H5离线应用与客户端存储使用详解,使用H5离线应用与客户端存储的注意事项有哪些,下面就是实战案例,一起来看一下。

支持离线 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# Commentfile.jsfile.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 包括:

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

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

域: cookie 对于哪个域是有效的。

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

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

安全标志: 指定后,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);    }};

使用方法:

// 设置 cookieCookieUtil.set('name', 'lai');CookieUtil.set('sex', 'man');// 读取 cookieCookieUtil.get('name'); // 'lai'CookieUtil.get('sex'); // 'man'// 删除 cookieCookieUtil.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 < len) {                            // 插入新值                store.add(users[i++]);            }            alert("Database initialized for first time. Database name: " + database.name + ", Version: " + database.version);        };    } else {        alert("Database already initialized. Database name: " + database.name + ", Version: " + database.version);                // transaction() 创建事务,objectStore() 将存储空间传入事务        request = database.transaction("users").objectStore("users").get("007");        request.onsuccess = function (event) {            alert(event.target.result.firstName);        };    }}

限制

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

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

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

相信看了本文案例你已经掌握了方法,更多精彩请关注创想鸟其它相关文章!

推荐阅读:

webpack打包压缩js与css步骤详解

加载移除js与css文件步骤详解

以上就是H5离线应用与客户端存储使用详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1546132.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月21日 17:52:44
下一篇 2025年12月21日 17:52:56

相关推荐

  • H5新增标签与属性使用方法归纳

    这次给大家带来H5新增标签与属性使用方法归纳,H5新增标签与属性使用的注意事项有哪些,下面就是实战案例,一起来看一下。 HTML5语法 大部分延续了html的语法不同之处:开头的 字符编码变得简洁, 不区分大小写, 添加了布尔值,类似checked,selected 引号可以省略,但是编码规范来说,…

    好文分享 2025年12月21日
    000
  • H5+WebWorkers多线程开发使用详解

    这次给大家带来H5+WebWorkers多线程开发使用详解,H5+WebWorkers多线程开发的注意事项有哪些,下面就是实战案例,一起来看一下。 我们都知道,浏览器执行js代码是单线程的,当页面脚步执行时,页面是没办法响应别的的,直到脚步的结束,而这里介绍的WebWorkers就可以改变这一切。 …

    好文分享 2025年12月21日
    000
  • H5+canvas卷积核图像处理步骤详解

    这次给大家带来H5+canvas卷积核图像处理步骤详解,H5+canvas卷积核图像处理的注意事项有哪些,下面就是实战案例,一起来看一下。 什么是卷积? 就跳过一些用专业属于描述专业术语看完懵逼的解释了, 语文成绩很差的我尝试从字面解释什么是卷积… 卷,理解成一种压缩;积,乘积,积累; …

    好文分享 2025年12月21日
    000
  • HTML5 新的Input类型

    这篇文章主要介绍了关于HTML5 新的Input类型,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 inpute类型:color     color类型用在input字段主要用于选取颜色,如下所示: 自选教程(如约智惠.com) 选择你喜欢的颜色: Input类型:date    d…

    好文分享 2025年12月21日
    000
  • HTML5 新表单元素

    这篇文章主要介绍了关于HTML5 新表单元素 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 html5 元素     元素规定输入域的选项列表     属性规定form或input域应该拥有自动完成功能。当用户在自动完成域中开始输入时,浏览器应该在该域中显示填写的选项;    使用…

    好文分享 2025年12月21日
    000
  • HTML5资源预加载(Link prefetch)详细介绍

    这篇文章主要介绍了关于html5资源预加载(link prefetch)详细介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 不管是浏览器的开发者还是普通web应用的开发者,他们都在做一个共同的努力:让Web浏览有更快的速度感觉。有很多已知的技术都可以让你的网站速度变得更快:使用C…

    好文分享 2025年12月21日
    000
  • 让IE支持HTML5的方法

    这篇文章主要介绍了关于让ie支持html5的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 越来越多的站点开始使用 HTML5 标签,但是目前的情况是还有很多人在使用IE6、IE7、IE8。为了让所有浏览者都可以正常的访问,解决方案有下面两个越来越多的站点开始使用 HTML5 标…

    2025年12月21日
    000
  • Html5实现二维码扫描并解析

    这篇文章主要介绍了html5实现二维码扫描并解析 的相关资料,需要的朋友可以参考下 引子: 最近公司项目有个需求,微博客户端中, h5 的页面上的某个按钮能够与native 交互呼起摄像头,扫描二维码并且解析。在非微博客户端中(微信或者是原生浏览器,如:safari)呼起系统的拍照或者上传图片按钮,…

    2025年12月21日
    000
  • H5如何操作声音录制/播放

    这次给大家带来H5如何操作声音录制/播放,H5操作声音录制/播放的注意事项有哪些,下面就是实战案例,一起来看一下。 html代码: H5调用声音 var recorder; var audio = document.querySelector(‘audio’); function startReco…

    好文分享 2025年12月21日
    000
  • HTML5文本格式化

    这篇文章主要介绍了关于HTML5文本格式化,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 文本格式化:     :加粗文字     :斜体文字     :用于强调,效果和相同     :用于强调,效果和相同。 立即学习“前端免费学习笔记(深入)”;     :用于放大文字     :…

    2025年12月21日
    000
  • HTML5表单相关元素和属性

    这篇文章主要介绍了关于HTML5表单相关元素和属性,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 可以指定id、style、class等核心属性,还可以指定onclick事件属性。除此之外,还可以指定如下几个属性。 action:指定表单提交的URL或URI。   method:指定…

    好文分享 2025年12月21日
    000
  • HTML5 video视频字幕的使用和制作方法

    这篇文章主要介绍了html5 video视频字幕的使用和制作,html5允许我们使用元素为视频指定字幕,需要的朋友可以参考下 HTML5允许我们使用 元素为视频指定字幕。这个元素的各种属性允许我们指定这样的东西,比如我们添加的内容的类型,它所在的语言,当然还有对包含实际字幕信息的文本文件的引用。 t…

    好文分享 2025年12月21日
    000
  • HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能

    这篇文章主要介绍了html5实现分享到微信好友朋友圈qq好友qq空间微博二维码功能的实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下 这是分享按钮: 通用分享微信好友朋友圈QQQQ空间微博  这是js调用代码: var nativeShare = new NativeShare() var…

    好文分享 2025年12月21日
    000
  • HTML5触摸事件实现移动端简易进度条的实现方法

    这篇文章主要介绍了关于html5触摸事件实现移动端简易进度条的实现方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 前言 HTML中新添加了许多新的事件,但由于兼容性的问题,许多事件都没有广泛的应用,接下来为大家介绍一些好用的移动端触摸事件: touchstart、touchmov…

    好文分享 2025年12月21日
    000
  • HTML5声音录制/播放功能的实现代码

    这篇文章主要介绍了关于html5声音录制/播放功能的实现代码,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 html代码: 火星黑洞 var recorder; var audio = document.querySelector(‘audio’); function startRe…

    好文分享 2025年12月21日
    000
  • HTML5中audio与video标签的使用

    这篇文章主要介绍了关于HTML5中audio与video标签的使用 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 最近做的微信分享页面中有大量的语音播放和视频展示,相关的好多方法属性以前都没接触过,现在记录下来! 1.  首先,了解关于两个标签的基本信息: 两个标签的基本属性: 属…

    好文分享 2025年12月21日
    000
  • django控件及传参使用详解

    这次给大家带来django控件及传参使用详解,django控件及传参使用的注意事项有哪些,下面就是实战案例,一起来看一下。 本文对djangoHTML的表单控件中的单选及多选进行介绍,并说明如何进行参数传递。 1.HTML中的表单控件: 在HTML中表单的书写一般为: 这个method代表方法,方法…

    好文分享 2025年12月21日
    000
  • HTML5的video标签操作视频详解

    这次给大家带来HTML5的video标签操作视频详解,HTML5的video标签操作视频的注意事项有哪些,下面就是实战案例,一起来看一下。 在现在对于网站制作的研究中,各方面的人员使用没有停止过,一直在不停的专研,其中HTML5的使用就是很大的一突破,对于HTML5的video标签相信很多人还不知道…

    好文分享 2025年12月21日
    000
  • H5的video标签操作摄像头

    这次给大家带来H5的video标签操作摄像头,H5的video标签操作摄像头注意事项有哪些,下面就是实战案例,一起来看一下。 详解HTML5 使用video标签实现选择摄像头功能 1. html // jquery reference // // Open WebCam Snap Photo 2. …

    好文分享 2025年12月21日
    000
  • H5+C3+JS实现楼层跳跃特效

    这次给大家带来H5+C3+JS实现楼层跳跃特效,H5+C3+JS实现楼层跳跃特效的注意事项有哪些,下面就是实战案例,一起来看一下。 楼层跳跃式的页面布局 *{ margin: 0; padding: 0; } body, html{ height: 100%; } ul{ list-style: n…

    好文分享 2025年12月21日
    000

发表回复

登录后才能评论
关注微信