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

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

这次给大家带来H5离线应用与客户端存储使用详解,使用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
# 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,允许本地文件访问。

相信看了本文案例你已经掌握了方法,更多精彩请关注 第一PHP社区 其它相关文章!

推荐阅读:

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

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

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


推荐阅读
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • css元素可拖动,如何使用CSS禁止元素拖拽?
    一、用户行为三剑客以下3个CSS属性:user-select属性可以设置是否允许用户选择页面中的图文内容;user-modify属性可以设置是否允许输入 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • ECMA262规定typeof操作符的返回值和instanceof的使用方法
    本文介绍了ECMA262规定的typeof操作符对不同类型的变量的返回值,以及instanceof操作符的使用方法。同时还提到了在不同浏览器中对正则表达式应用typeof操作符的返回值的差异。 ... [详细]
  • CSS|网格-行-结束属性原文:https://www.gee ... [详细]
  • pyecharts 介绍
    一、pyecharts介绍ECharts,一个使用JavaScript实现的开源可视化库,可以流畅的运行在PC和移动设备上,兼容当前绝大部 ... [详细]
  • JavaWeb介绍概念JavaWeb,是用Java技术来解决相关web互联网领域的技术总和。web包括:web服务器和web客户端两部分。Java在客户端的应用有javaapplet,不过使 ... [详细]
  • 文章目录简介HTTP请求过程HTTP状态码含义HTTP头部信息Cookie状态管理HTTP请求方式简介HTTP协议(超文本传输协议)是用于从WWW服务 ... [详细]
  • 最近在学Python,看了不少资料、视频,对爬虫比较感兴趣,爬过了网页文字、图片、视频。文字就不说了直接从网页上去根据标签分离出来就好了。图片和视频则需要在获取到相应的链接之后取做下载。以下是图片和视 ... [详细]
  • 前端提高篇(七十):SVG基本使用、基本样式、路径path
    SVG是使用XML来描述二维图形和绘图程序的语言。SVG遵循的是xml的规范,与html5的使用有所区别SVG绘制出来的是矢量图,放大之后不会失真官方文 ... [详细]
  • Scrapy 爬取图片
    1.创建Scrapy项目scrapystartprojectCrawlMeiziTuscrapygenspiderMeiziTuSpiderhttps:movie.douban.c ... [详细]
  • 目录爬虫06scrapy框架1.scrapy概述安装2.基本使用3.全栈数据的爬取4.五大核心组件对象5.适当提升scrapy爬取数据的效率6.请求传参爬虫06scrapy框架1. ... [详细]
author-avatar
标榜贾_120
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有