JS中离线应用与客户端存储

1.离线检测:H5定义了navigator.online属性,为true 表示设备能上网
还定义了两个相关事件:online和offline

2 数据存储

  1. cookie——HTTP coolie,客户端存储会话信息的。该标准要求服务器对任意的HTTP请求发送Set-Cookie HTTP头作为响应的一部分‘
/*
HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value;expire=expiration_time;path=domain_path;secure
Other-header: other-header-value
这个HTTP响应设置以name为名称,以value为值的一个cookie,名称和值在传送时都必须时URL编码
*/

  2. cookie组成:
    1. 名称
    2. 值
    3. 域
    4. 路径
    5. 失效时间
    6. 安全标志:cookie只有在使用SSL连接时才发送到服务器

   所有的值和名字都经过URL编码,必须使用decodeURIComponent()解析

   基本的cookie操作:读取,写入和删除

  子cookie:为了绕开浏览器的单域名下cookie的限制,使用了子cookie(subcookie)
  格式:
    name=name1=value1&name2=value2&name3=value3

/* 设置子cookie */
var subcookieUtil = {
get: function (name, subName) {
var subcookies = this.getAll(name);
if (subcookies) {
return subcookies[subName];
} else {
return null;
}
},
getAll: function (name) {
var cookieName = encodeURIComponent(name) + "=",
cookieStart = document.cookie.indexOf(cookieName),
cookieValue,
cookieEnd,
subcookies,
i, len,
parts,
result = {};
if (cookieStart) {
cookieEnd = document.cookie.indexOf(";", cookieStart);
if (cookieEnd == -1) {
cookieEnd = document.cookie.length;
}
cookieValue = docuemnt.cookie.substring(cookieStart + cookieName.length, cookieEnd);
if (cookieValue.length > 0) {
subcookies = cookieValue.split("&");
for (i = 0, len = subcookies.length; i < len; i++) {
parts = subcookies[i].split("=");
result[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
}
return result;
}
}
return null;
},
set: function (name, subName, value, expires, path, domain, secure) {
var subcookies = this.getAll(name) || {};
suvcookies[subName] = value;
this.setAll(name, subcookies, exprires, path, domain, secure);
},
setAll: function (name, subcookies, exprires, path, domain, secure) {
var cookieText = encodeURIComponent(name) + "=",
subcookieParts = new Array(),
subName;
for (subName in subcookies) {
if (subcookies.hasOwnProperty(subName) && subName.length > 0) {
subcookieParts.push(encodeURIComponent(subName) + "=" + encodeURIComponent(subcookies[subName]));
}
}
if (subcookieParts.length > 0) {
cookieText += subcookieParts.join("&");
if (expires instanceof Date) {
cookieText += ";expires=" + expires.toGMTString();
}
if (path) {
cookieText += ";path=" + path;
}
if (doamin) {
cookieText += ";domain=" + domain;
}
if (secure) {
cookieText += ‘;secure‘;
}
}
document.cookie = cookieText;
},
//删除一个子cookie 而不影响其他
unset: function (name, subName, path, domain, secure) {
var subcookies = this.getAll(name);
if (subcookies) {
delete subcookies(subName);
this.setAll(name, subcookies, null, path, domain, secure);
}
},
// 删除整个cookie
unsetAll: function (name, path, domian, secure) {
this.setAll(name, null, new Date(), path, domain, secure);
}
}

由于所有的cookie都会由浏览器作为请求头发送,不能存储大量信息,不能存储重要 敏感的数据(他人可以访问到)

3. Web存储机制
  web storage——两个目标:
    1. 提供一种cookie以外的存储途径
    2. 提供一种存储大量可以跨会话存在的数据的机制
  Storage对象有方法: getItem(name) setItem(name,value)
  web storage规范了两个window的属性:
    1. sessionStorage:该数据至保持到浏览器关闭,它可以跨越页面刷新而存在——适用于仅针对会话的小段数据的存储()
    2. globalStorage:跨越会话存储数据,但要指定哪些域可以访问

// 保存只能www.wrox.com域下才能访问的name 类似于Ajax的同源策咯
globalStorage["www.wrox.com"].name="Nichoas";

    3. localStorage 取代了globalStorage:不能给localStorage 指定任何访问规则。要访问同一个localStorage ,页面必须来自同一个域名(子域名无效),使用同一种协议,在同一个端口上,相当于 globalStorage[location.host] -事先不能确定域名时用
    4. storage事件:任何对storage对象进行修改,都会触发storage事件,这个事件的event有以下属性

document.addEventListener("storage",function(event){
alert(event.domain);
},false);

          a. domain:域名改变
          b. key 删除、设置键名
          c. newValue 设置值
          d. oldValue
    5. 限制:localStorage而言,大多数浏览器是5MB限制,Chrome对每个来源的限制是2.5MB;对于sessionStorage 因浏览器而异 一般是2.5MB
    6. IndexedDB——indexed database API 是浏览器中保存结构化数据的一种数据库(使用对象保存数据)http://www.zhangxinxu.com/wordpress/2017/07/html5-indexeddb-js-example/

var request,database,db;
request=indexedDB.open(‘admin‘);
request.onerror=function(event){
alert(‘something bad happened while trying to open‘+event.target.errorCode);
};
request.onsuccess=function(event){
database=event.target.result; db=database;
}; 

        a. 设计操作是异步的,大多数操作以请求的方式进行有onerror和onsuccess事件处理程序
        b. 一开始为indexedDB指定版本号——setVersion()方法
        c. 对象存储空间:(需要把对象里面的一个唯一属性作为键) //创建一个键为username的名字是users的存储空间 add()/ push()添加 /更新数据

var store=db.createObjectStore("users",{keyPath:"username"}); 

        d. 查询数据:var transaction=db.transaction();
        e. 游标查询:游标是指向结果集的指针。在存储空间上调用openCursor()
          1. 键的范围4中方法:only() lowerBound() upBound() bound()
          2. 设定游标的方向(可选的第二个参数)
        f. 索引:一个对象存储空间指定多个键,将ID作为主键。创建主键:

var store=db.transaction("users").objectStore("users");
var index=store.createIndex("username","username",{unique:false});//设置索引值
var index=store.index("username");//获取索引值

        g. 并发问题:indexedDB虽然是异步的 但还是有并发操作问题,(浏览器两个不同的标签页打开了同一个页面)就要指定版本号setVersion(),指定onversionchange事件处理程序,立即关闭

// 并发处理
var indexedDB = window.indexedDB || window.msIndexedDB || window.mozIndexedDB || window.webkitIndexedDB;
var request=indexedDB.open("admin");
request.onsuccess=function(event){
var database=event.target.result;
database.onversionchange=function(){
database.close();
};
};

        h,限制:indexedDB只能由同源(相同的协议,域和端口)占用磁盘空间有限制,chrome限制5M

时间: 2024-11-05 22:37:23

JS中离线应用与客户端存储的相关文章

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

一.离线应用 所谓离线web应用,就是在设备不能上网的情况下仍然可以运行的应用. 开发离线web应用需要几个步骤:首先,确保应用知道设备是否能上网,以便下一步执行正确的操作:然后,应用还必须能访问一定的资源(图像.JavaScript.css等),只有这样才能正常工作:最后,必须有一块本地空间用于保存数据,无论能否上网都不妨碍读写. 1.离线检测 HTML5定义一个navigator.onLine属性,这个属性值为true表示设备能上网,值为false表示设备离线. 除了navigator.on

Javascript高级程序设计-23:HTML5离线应用和客户端存储

一.离线检测 开发离线应用的第一个步骤是确定设备是在线还是离线,为此HTML5设置了一个navigator.onLine属性来表明浏览器是否可以上网.这个属性为true表示设备可以上网,值为false表示设备离线. if(navigator.online){ //online } else{ //offline } 除了navigator.online属性外,HTML5还专门设置了两个事件:online和offline,分别在设备上线和离线的时候触发. window.addEventListen

离线应用和客户端存储

//region离线检测    //判断设备是否能上网 navigator.onLine  window事件online offline    //alert( navigator.onLine ); //监测网络变化    W.addHandler( window, "online", function () {        alert( "online" );    } );    W.addHandler( window, "offline&quo

node.js中使用net模块创建服务器和客户端

1.node.js中net模块创建服务器(net.createServer) // 将net模块 引入进来 var net = require("net"); // 创建一个net.Server用来监听,当连接进来的时候,就会调用我们的函数 // client_sock,就是我们的与客户端通讯建立连接配对的socket // client_sock 就是与客户端通讯的net.Socket var server = net.createServer(function(client_soc

JS基础--函数与BOM、DOM操作、JS中的事件以及内置对象

   前   言 絮叨絮叨 这里是JS基础知识集中讲解的第三篇,也是最后一篇,三篇JS的基础,大多是知识的罗列,并没有涉及更难得东西,干货满满!看完这一篇后,相信许多正在像我一样正处于初级阶段的同学,经过初步的学习,会对这一门语言有了一定深入的了解,也会感受到这一门语言的强大之处.希望各位同学通过一定的学习,会得到等大的收获. 因为是最后一篇所以内容可能有点多,希望各位同学能够慢慢看,细细看,让我们一起学习,一起进步,一起感受JS的魅力. 一函数 函数的声明及调用 1.函数的声明格式: func

JavaScript入门之JS中的内置对象

一.数组 1.数组的基本概念 数组是在内存空间中连续存储的一组有序数据的集合.元素在数组中的顺序,称为下标.可以使用下标访问数组的每个元素. 2.如何声明一个数组 ①使用字面量声明:var arr = [];在JS中,同一数组可以存储各种数据类型: eg: var arr = [1,"wuhao",true,{},null,func] ②使用new关键字声明:var arr = new Array(参数): >>>参数可以是: a.参数省略,表示创建一个空数组 b.参

怎么在js中,访问viewbag,viewdata等等的值

在js中要访问viewbag,viewdata存储的值, var ss='@ViewBag.name'; 一定要加引号,单双随便,还有, ViewBag一定要写规范,不然会编译错误! 成功者的秘诀就是:我们应该学习水的精神,当时机不到的时候,把自己的能量储蓄起来,当时机来临的时候就能冲破障碍,奔腾入海,成就自己的梦想.

JS学习21(离线应用与客户端储存)

Web应用与传统客户端最大的区别就是需要连接网络,没有网络整个应用就无法运行,这个一直是Web应用最大的痛点之一. HTML5为了解决这个问题添加了对离线应用的支持.开发离线Web应用有几个关键点.确保应用知道设备是否能上网以便下一步执行正确的操作,然后应用还必须能访问一定的资源.最后必须有一块本地空间用于保存数据,无论是否能上网都能读写数据. 离线检测 为检测设备是离线还是在线,HTML5定义了navigator.onLine这个属性值为true表示设备可以上网. 还有两个事件:online和

Html5 Web的5中离线存储方式之localStorage

Html5 Web的5中离线存储方式之localStorage 在HTML5越来越流行的今天,如果你还不知道离线存储,那就说明你落后了很多. HTML5的离线存储方式有多种:Web SQL Database.LocalStorage.Cookie.WebStorage.IndexedDB.FileSystem. Web SQL Database目前虽然还有浏览器支持,是唯一的关系数据库结构的存储,但W3C以及停止对其的维护和发展.我就不多说了. 今天我们主要看LocalStorage这种最简单的