文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何在HTML5中实现客户端存储

2023-06-09 14:22

关注

如何在HTML5中实现客户端存储?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

离线检测

要知道设备是否在线还是离线,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 中引用:

<html manifest="./xxx.manifest">

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

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

相关事件:

一般来讲,这些事件会随着页面加载按上述顺序依次触发。也可以通过调用 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);    }};

使用方法:

// 设置 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());

大小限制

Web Storage

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

Storage 类型有如下方法:

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

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);        };    }}

限制

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯