一、前言

       这章非常重要,由于之后需要负责平台手机APP的日后维护,如何让用户在离线状态下正常使用,以及联网后的数据合并变得非常重要。

二、内容

       离线检测

navigator.online —— 属性为true时表示设备能上网
online() —— 当网络从离线转在线触发
offline() —— 当网络从在线转离线触发 navigator.online取得初始状态,然后通过上述两个事件确定网络连接状态是否变化

数据存储

//Cookie
数量:每个域的cookie总数是有限的,一般每个域最多30~50个cookie
长度:整个cookie的长度限制在4095B以内 构成:
1.名称 URL编码
2.值 URL编码
3.域
4.路径 —— 指定域下的某个路径才能访问
5.失效时间
6.安全标志 —— 指定后cookie只有在使用SSL连接的时候才发送服务器 代码: var CookieUtil = { // 获取Cookie
get:function(name){
var cookieName = encodeURIComponent(name)+"=",
cookieStart = document.cookie.indexOf(cookieName),
cookieValue = null; if(cookieStart > -1){
var cookieEnd = document.cookie.indexOf(";",cookieStart);
if(cookieEnd == -1){
cookieEnd = document.cookie.length;
}
cookieValue = decodeURIComponent(document.cookie.substring(
cookieStart + cookieName.length, cookieEnd));
}
return cookieValue;
}, //设置Cookie
set:function(name, value, expires, path, domain, secure){
var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value);
if(expires instanceof Date){
cookieText += "; expires=" + expores.toGMTString();
}
if(path){
cookieText += "; path=" + path;
}
if(domain){
cookieText += "; domain=" + domain;
}
if(secure){
cookieText += "; secure";
}
document.cookie = cookieText;
}, //删除Cookie
unset:function(name,path,domain,secure){
this.set{name, "", new Date(0), path, domain, secure};
}
} //子Cookie
使用cookie值来存储多个名称值对
name=name1=value1&name2=value2&name3=value3 总结:
1.cookie太大容易影响性能
2.不能在cookie中存储重要和敏感的数据
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//Web存储机制 —— Web Storage
1.提供一种在cookie之外存储会话数据的途径
2.提供一种存储大量可以跨会话存在的数据的机制 Storage类型,有以下方法:
clear() —— 删除所有值
getItem(name) —— 根据名称获得值
key(index) —— 获得index处的值的名字
removeItem(name) —— 删除由name指定的名值对
setItem(name,valie) —— 为指定的name设置一个对应值
sessionStorage对象
该对象存储特定与某个会话的数据,该数据只保存到浏览器关闭,它是Storage的一个实例 //使用方法存储数据
sessionStorage.setItem("name", "Nicholas");
//使用属性存储数据
sessionStorage.book = "Nicholas";
//遍历
for(var key in sessionStorage){
var value = sessionStorage.getItem(key);
} 用途:sessionStorage对象主要用于仅针对会话的小段数据的存储

globalStorage对象
用途:globalStorage对象主要用于跨越会话存储数据,但有特定的访问限制,需要指定域
globalStorage["wrox.com"]对象是Storage的一个实例
使用时一定要指定一个域名!!!
//保存数据
globalStorage["wrox.com"].name = "Nicholas"; //获取数据
var name = globalStorage["wrox.com"].name;

localStorage对象
它是Storage的一个实例不能给localStorage指定任何访问规则;规则事先就设定好了
要访问一个localStorage对象,页面必须来自同一域名(子域名无效),使用同一种协议,在同一端口上
相当于globalStorage[location.host] storage事件
在Storage对象进行任何修改,都会在文档上触发storage事件,有以下属性:
domain:发送变化的存储空间的域名
key:设置或删除的键名
newValue:如果是设置值,则是新值;如果是删除键,则是null
oldValue:键被更改之前的值
总结:
1.因浏览器不同而对存储空间大小有限制
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//IndexedDB —— 在浏览器保存结构化数据的一种数据库
IndexedDB设计的操作完全是异步进行的
差不多每一次IndexedDB操作,都需要注册onerror或onsuccess事件
var indexedDB = window.indexedDB || windows.msIndexedDB || window.mozIndexedDB || window.webkitIndexedDB; 1.数据库
var request, database;
request = indexedDB.open("admin"); //传入数据库名称
request.onerror = function(event){
alert("open fail" + event.target.errorCode); //出现错误
};
request.onsucess = function(event){
database = event.target.result; //得到数据库实例
}; 默认情况下,IndexedDB数据库是没有版本号的,最好一开始就指定
if(database.version != "1.0"){
request = database.setVersion("1.0");
request.onerror = function(event){};
request.onsuccess = function(event){};
}else{}
2.对象存储空间
数据库建立连接后,下一步是使用对象存储空间。
如果数据库的版本与传入的版本不匹配,那么可能需要创建一个新的对象存储对象。
假设一条记录的对象如下所示:
var user = {
username:"007",
firstName:"James",
lastName:"Bond",
password:"foo"
}; var store = db.createObjectStore("users",{keyPath:"username"}); //指定空间名称及keyPath作为键
//使用add()或put()添加数据 —— store.add() / store.put()
//其中add()方法重写会返回错误,put()重写原有对象没问题
3.事务
创建完对象存储空间之后,接下来所有操作都是通过事务来完成的
调用transaction()创建事务
var transaction = db.transaction();
//或
var transaction = db.transaction("users"); //访问一个对象
//或
var transaction = db.transaction("users","anotherStore"); //访问多个对象 上述方法都是以只读方式访问数据,如果修改访问方式:
var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction;
var transaction = db.transaction("users",IDBTransaction.READ_WRITE);
其中:
IDBTransaction.READ_ONLY —— 只读
IDBTransaction.READ_WRITE —— 读写
IDBTransaction.VERSION_CHANGE —— 改变 使用objectStore()并传入存储空间的名称就可以访问特定的存储空间:
var request = db.transaction("users").objectStore("users").get("007");
request.onerror = function(event){
//do something
}
request.onsuccess = function(event){
var result = event.target.result;
alert(result.firstName);
}
事件本身也有事件处理程序:
transaction.onerror = function(event){//整个事务都被取消};
transaction.oncomplete = function(event){
//整个事务都成功完成,但访问不到event中的任何数据,
//必须在相应请求的onsuccess事件中才能访问
}; 
4.使用游标查询
检索多个对象时,需要在事务内创建游标 openCursor()
var store = db.transaction("users").objectStore("users"),
request = store.openCursor();
request.onerror = function(event){};
request.onsuccess = function(event){
var cursor = event.target.result; //返回一个IDBCursor实例
if(cursor){ //必须要检查
//do something
}
};
IDBCursor属性包含:
direction —— 游标移动方向
IDBCursor.NEXT(0) 下一项
IDBCursor.NEXT_NO_DUPLICATE(1) 下一个不重复项
IDBCursor.PREV(2) 前一项
IDBCursor.PREV_NO_DUPLICATE 前一个不重复项
key —— 对象的键
value —— 实际的对象,显示前需要使用JSON.stringify(value)来转成Json对象
primaryKey —— 游标使用的键 游标可以更新个别的记录 —— cursor.update() request.onsuccess = function(event){
var cursor = event.target.result,
value,
updateRequest;
if(cursor){
if(cursor.key == "foo"){
value = cursor.value;
value.password = "magic!"; updateRequest = cursor.update(value); //请求保存更新
udpateRequest.onsuccess = function(){//处理成功};
udpateRequest.onerror = function(){//处理成功};
}
}
}
游标也可以调用cursor.delete()删除相应记录,
如果当前事务没有修改对象存储空间的权限,update()与delete()会抛出错误 默认情况下,每个游标只发起一次请求,要想发起另一次请求,可以调用:
continue(key) —— 移动到结果集中的下一项
advance(count) —— 向前移动count指定的项数
5.键范围
单纯通过游标查询数据的方式太有限,键范围增加了灵活性
var IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange; only():
var onlyRange = IDBKeyRange.only("007"); lowerBound():
var lowerRange = IDBKeyRange.lowerBound("007"); //从007开始到最后,包含007
var lowerRange = IDBKeyRange.lowerBound("007",true); //从007开始到最后,不包含007

upperBound():
var upperRange = IDBKeyRange.upperBound("007"); //从007开始往上,包含007
var upperRange = IDBKeyRange.upperBound("007",true); //从007开始往上,不包含007

Bound():
var boundRange = IDBKeyRange.bound("下界键","上界键",是否跳过下界,是否跳过上界); 例:
var store = db.transaction("users").objectStore("users");
range = IDBKeyRange.bound("007","ace");
request = store.openCursor(range);
request.onsuccess = function(event){
var cursor = event.target.result;
if(cursor){};
}
6.设定游标方向
var IDBCursor= window.IDBCursor || window.webkitIDBCursor; var store = db.transaction("users").objectStore("users"),
request = store.openCursor(null, IDBCursor.NEXT_NO_DUPLICATE);//null为默认全范围 7.索引
对于某些数据,可能要为一个对象存储空间指定多个键,即主键与索引键
首先引用对象存储空间,然后调用createIndex() var store = db.transaction("users").objectStore("users"),
index = store.createIndex("username","username",{unique:false}); //其它空间也有可能含username 第一个参数:索引的名称
第二个参数:索引的属性的名字
第三个参数:是否在所有记录中唯一 使用一个已经存在的名为"username"的索引:
var store = db.transaction("users").objectStore("users");
index = store.index("username");
request = index.openCursor();
//如果只返回每条记录主键的游标:
request = index.openKeyCursor(); request.onsuccess = function(event){
//event.result.key中保存索引键
//event.result.value保存主键
}; //get()方法能够从索引中取得一个对象
request = index.get("007");
//要根据给定的索引键取得主键,使用getKey()
request = index.getKey("007"); IDBIndex对象含以下属性:
name —— 索引的名称
keyPath —— 传入createIndex()中的属性路径
objectStore —— 索引的对象存储空间
unique —— 标识索引键是否唯一 store.indexNames能访问到为该空间建立的所有索引
store.deleteIndex("name")则可以根据索引的名称删除索引 8.并发问题
如果浏览器的两个不同的标签页打开了同一页面,那么一个页面试图更新另一个页面尚未
准备就绪的数据库问题就有可能发生。因此,只有当浏览器中仅有一个标签页使用数据库情况下,调用setVersion()才能完成操作 正确的方式:
刚打开数据库时,要记着指定onversionchange事件处理程序。当同一个来源的另一个标签页调用setVersion()时,就会执行这个回调:
var request, database;
request = indexedDB.open("admin");
request.onsuccess = function(event){
database = event.target.result;
database.onversionchange = function(){
database.close()
};
} 在你想要更新数据库的版本但另一个标签页已经打开数据库的情况下,要触发onblocked事件:
var request= database.setVersion("2.0");
request.onblocked = function(){
alert("Please close all other tabs");
};
request.onsuccess = function(){
//do something
};
总结:
1.不能跨域共享信息
2.大约5MB或50MB的空间限制

【JavaScript】离线应用与客户端存储的更多相关文章

  1. js-新兴的API,最佳实践,离线应用于客户端存储

    离线应用于客户端存储: 1.离线检测:online以及offline事件,都是在window对象上触发 navigator.online为true的时候是表示设备能够上网 2.使用一个描述文件(man ...

  2. 《javascript高级程序设计》 第23章 离线应用与客户端存储

    23.1 离线检测23.2 应用缓存23.3 数据存储 23.3.1 Cookie 23.3.2 IE 用户数据 23.3.3 Web 存储机制 23.3.4 IndexedDB   23.1 离线检 ...

  3. 离线应用与客户端存储(cookie storage indexedDB)

    离线检测 HTML5定义一个属性:navigator.onLine的属性.这个属性值为true,表示设备在线,值为false,表示设备离线.为了更好的确定网络是否可用,HTML5还定义了两个事件.这两 ...

  4. JavaScript中离线应用和客户端存储(cookies、sessionStorage、localStorage)

    一.离线应用 所谓离线web应用,就是在设备不能上网的情况下仍然可以运行的应用. 开发离线web应用需要几个步骤:首先,确保应用知道设备是否能上网,以便下一步执行正确的操作:然后,应用还必须能访问一定 ...

  5. HTML5离线应用与客户端存储

    序言 本篇文章会详细介绍使用HTML5开发离线应用的步骤,以及本地存储与cookie的一些异同,最后利用上面所学例子来实现一个购物车场景. 使用HTML5离线存储的基本过程如下: 离线检测:首先要对设 ...

  6. 《JavaScript》web客户端存储

    Web存储: 兼容IE8在内的所有主流浏览器,不兼容早期浏览器:支持大容量但非无限量 LocalStorage和sessionStorage是window对象的两个属性,这两个属性都代表同一个stor ...

  7. JavaScript权威指南--客户端存储

    客户端存储web应用允许使用浏览器提供的API实现将数据存储在用户电脑上. 客户端存储遵循“同源策略”,因此不同站点的页面是无法读取对于存储的数据.而同一站点的不同的页面之间是可以互相共享存储数据的. ...

  8. JavaScript的客户端存储

    一.前言: 客户端存储实际上就是Web浏览器的记忆功能,通过浏览器的API实现数据存储到硬盘: 二.存储的不同形式: 1.Web存储:localStorage 和 sessionStorage 代表同 ...

  9. js023-离线应用与客户端存储

    js023-离线应用与客户端存储 本章内容: 进行离线检测 使用离线缓存 在浏览器中保存数据 23.1 离线检测 第一步:知道设备是在线还是离线:navigator.Online属性.该值为true表 ...

随机推荐

  1. Django模型层:多表查询

    一 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关 ...

  2. 在Notepad++中为Python配置编译环境

    方法1:按下F5 输入d:\Python25\python.exe "$(FULL_CURRENT_PATH)" 其中"d:\Python25\python.exe&qu ...

  3. python-全栈开发-前方高能-内置函数

    python_day_14 13. 前方高能-内置函数 ⼀. 本节主要内容: 1. 内置函数 什么是内置函数? 就是python给你提供的. 拿来直接⽤的函数, 比如print., input等等. ...

  4. SQL数据类型(SQL Server六个类型使用)

    SQL数据类型是一个属性,它指定任何对象的数据的类型.在SQL中每一列,变量和表达有相关数据类型. 当创建表时,需要使用这些数据类型. 会选择根据表列要求选择一个特定的数据类型. SQL Server ...

  5. 人脸检测及识别python实现系列(3)——为模型训练准备人脸数据

    人脸检测及识别python实现系列(3)——为模型训练准备人脸数据 机器学习最本质的地方就是基于海量数据统计的学习,说白了,机器学习其实就是在模拟人类儿童的学习行为.举一个简单的例子,成年人并没有主动 ...

  6. 【MySQL解惑笔记】Mysql5.7.x无法开启二进制日志

    一.开启二进制日志 1)未开启二进制日志之前: mysql> show variables like 'log_bin'; +---------------+-------+ | Variabl ...

  7. Java线上应用故障排查之一:高CPU占用 (转)

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. (友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hank ...

  8. lamp一键配置 --转自秋水

    https://teddysun.com/lamp LAMP一键安装脚本 最后修改于:2015年11月08日 / 秋水逸冰 / 54,300 次围观 973 本脚本适用环境: 系统支持:CentOS/ ...

  9. Scrum立会报告+燃尽图(Beta阶段第二周第六次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2414 项目地址:https://coding.net/u/wuyy694 ...

  10. 王者荣耀交流协会第一次Scrum立会

    工作照片: scrum master:高远博 时间跨度;2017/10/13 6:04-6:34 地点:一食堂二楼两张桌子旁 立会内容; 昨天的成绩;昨天商议了今天的开会的时间.地点 今天的计划;讨论 ...