23.1 离线检测
23.2 应用缓存
23.3 数据存储
  23.3.1 Cookie
  23.3.2 IE 用户数据
  23.3.3 Web 存储机制
  23.3.4 IndexedDB
 
23.1 离线检测
navigator.onLine ? "Online" : "Offline"
支持离线检测的浏览器有IE 6+(只支持navigator.onLine 属性)、Firefox 3、Safari 4、Opera 10.6、
Chrome、iOS 3.2 版Safari 和Android 版WebKit。
23.2 应用缓存
applicationCache.update();
applicationCache.swapCache();  //启用新应用缓存。
EventUtil.addHandler(applicationCache, "updateready", function(){
    applicationCache.swapCache();
});
23.3 数据存储
cookie
1.限制
IE6 以及更低版本限制每个域名最多20 个cookie。
 IE7 和之后版本每个域名最多50 个。IE7 最初是支持每个域名最大20 个cookie,之后被微软的
一个补丁所更新。
 Firefox 限制每个域最多50 个cookie。
 Opera 限制每个域最多30 个cookie。
 Safari 和Chrome 对于每个域的cookie 数量限制没有硬性规定。

2. cookie 的构成
名称、值、域、路径、失效时间、安全标志

3. JavaScript 中的cookie
document.cookie = "name=Nicholas";
document.cookie = encodeURIComponent("name") + "=" +encodeURIComponent("Nicholas");

要给被创建的cookie 指定额外的信息,只要将参数追加到该字符串,和Set-Cookie 头中的格式一样
document.cookie = encodeURIComponent("name") + "=" +encodeURIComponent("Nicholas") + "; domain=.wrox.com; path=/";

基本的cookie 操作有三种:读取、写入和删除。

var CookieUtil = {
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;
}, 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);
}
};

4. 子cookie(代码详见书中)

为了绕开浏览器的单域名下的cookie 数限制,一些开发人员使用了一种称为子cookie(subcookie)的概念。
要设置子cookie,也有两种方法:set()和setAll()。以下代码展示了它们的构造。

5. 关于cookie 的思考
还有一类cookie 被称为“HTTP 专有cookie”。HTTP 专有cookie 可以从浏览器或者服务器设置,但
是只能从服务器端读取,因为JavaScript 无法获取HTTP 专有cookie 的值。
cookie 信息越大,完成对服务器请求的时间也就越长

23.3.2 IE用户数据(经测试仅在ie7下可以)

<div style="behavior:url(#default#userData)" id="dataStore">

var dataStore = document.getElementById("dataStore");
dataStore.setAttribute("name", "Nicholas");
dataStore.setAttribute("book", "Professional JavaScript");
dataStore.save("BookInfo");
dataStore.load("BookInfo");
alert(dataStore.getAttribute("name")); //"Nicholas"
alert(dataStore.getAttribute("book")); //"Professional JavaScript"

和cookie 不同的是,你无法将用户数据访问限制扩展到更多的客户。还有一点不同,用户数据默认是可以跨越会话持久存在的,同时

也不会过期;数据需要通过removeAttribute()方法专门进行删除以释放空间。

23.3.3 Web存储机制
Web Storage 的两个主要目标是:
 提供一种在cookie 之外存储会话数据的途径;
 提供一种存储大量可以跨会话存在的数据的机制。

1. Storage 类型
只能存储字符串。非字符串的数据在存储之前会被转换成字符串。
2. sessionStorage 对象
和datastore的结构差不错啊,没有迭代sessionStorage 中的值
sessionStorage 对象应该主要用于仅针对会话的小段数据的存储。如果需要跨越会话存储数据,
那么globalStorage 或者localStorage 更为合适。
3. globalStorage 对象(在ff23.0.1的页面上测试有错:globalStorage is not defined,所以就不要用了,link,20130911)
用户未清除浏览器缓存, 存储在
globalStorage 属性中的数据会一直保留在磁盘上。这让globalStorage 非常适合在客户端存储文档或者长期保存用户偏好设置。

//保存数据
globalStorage["wrox.com"].name = "Nicholas";
//获取数据
var name = globalStorage["wrox.com"].name;
//存储数据,可以让任何以.net 结尾的域名访问——不要这样做!
globalStorage["net"].name = "Nicholas";

如果你事先不能确定域名,那么使用location.host 作为属性名比较安全。

globalStorage[location.host].name = "Nicholas";
var book = globalStorage[location.host].getItem("book");

4. localStorage 对象

//使用方法存储数据
localStorage.setItem("name", "Nicholas");
//使用属性存储数据
localStorage.book = "Professional JavaScript";
//使用方法读取数据
var name = localStorage.getItem("name");
//使用属性读取数据
var book = localStorage.book;

为了兼容只支持globalStorage 的浏览器,可以使用以下函数。

function getLocalStorage(){
    if (typeof localStorage == "object"){
        return localStorage;
    } else if (typeof globalStorage == "object"){
        return globalStorage[location.host];
    } else {
        throw new Error("Local storage not available.");
    }
}

5. storage 事件(这个在ff和chrome下也没反应,也没有报错,link)

EventUtil.addHandler(document, "storage", function(event){
alert("Storage changed for " + event.domain);
});
6. 限制
localStorage :5MB 。Chrome 、Safari 是2.5MB。iOS 版Safari 和Android 版WebKit 2.5MB。

sessionStorage:有的浏览器没有限制,
但Chrome、Safari、iOS 版Safari 和Android 版WebKit ,2.5MB。
IE8+和Opera  5MB。

Web Storage 限制,请参考http://dev-test.nemikor.com/web-storage/support-test/。

23.3.4 IndexedDB
Indexed Database API,浏览器中保存结构化数据的一种数据库。
var indexedDB = window.indexedDB || window.msIndexedDB || window.mozIndexedDB ||
window.webkitIndexedDB;

IndexedDB Example 02 就遇到bug啦,不知道怎么解决,没有信心再看下去啦,详见论坛

request = database.setVersion("1.0");
alert(database.version);  应该是setVersion的问题,网上有一个例子就可以实现的

《javascript高级程序设计》 第23章 离线应用与客户端存储的更多相关文章

  1. 《JavaScript高级程序设计》——第二章在HTML使用JavaScript

    这章讲的是JavaScript在HTML中的使用,也就是<script>元素的属性.书中详细讲了async.defer.src和type四个<script>的属性. 下面是对第 ...

  2. 《JavaScript高级程序设计》——第一章JavaScript简介

    第一章主要讲了JavaScript的诞生和发展.刚刚接触JavaScript的我,似乎对这些内容并不感兴趣,快速看了一遍就开始去看第二章了. 看完第一章,收获也就是了解到JavaScript由ECMA ...

  3. JavaScript 高级程序设计 第5章引用类型 笔记

    第五章 引用类型 一.object类型 1.创建方法: 1.使用new 操作符创建 var person=new object() Person.name=”Nicholasa” Porson.age ...

  4. JavaScript高级程序设计第20章JSON 笔记 (学习笔记)

    第二十章 JSON 1.Json 可以表示三种类型的值: 1.简单值: 表示数值:5  表示字符串:“hello wrold”注表示字符串时必须使用双引号 2.对象: {“name”:“mi”,”ag ...

  5. JavaScript高级程序设计第14章表单脚本 (学习笔记)

    第十四章 表单脚本 1.阻止默认表单提交 1.提交表单数据 1.使用type=submit提交按钮 2.使用submit():方法 注意:当用户点击提交按钮时,会触发submit事件,从而在这里我们有 ...

  6. 《JAVASCRIPT高级程序设计》第一章

    在使用调制解调器的时代,频繁的表单验证对客户端来说是一个很大的负担,javascript,作为一种专门进行表单验证的客户端脚本语言诞生了.到今天,javascript早已超越了当初设定的角色.Java ...

  7. JavaScript高级程序设计 第六章 面向对象程序设计

    面向对象程序设计 ECMA-262将对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”严格来讲,这就相当于说对象是一组没有特定顺序的值.对象的每个属性和方法都有一个名字,而每个名字都 ...

  8. 《JavaScript 高级程序设计》第一章:简介

    JavaScript 历史 JavaScript的诞生的主要是当时的 netspace 公司谋求为自己的浏览器 Navigator 添加一种脚本语言,以便在本地客户端进行一些行为操作,而这一功能的需求 ...

  9. javascript高级程序设计第5章,引用类型

    object类型: 创建object实列的方式有两种,一种是new()方法,一种是对象字面量表示法: 第一种法方:  var obj = new object(); obj.name = 'name' ...

随机推荐

  1. 【leetcode❤python】119. Pascal's Triangle II

    #-*- coding: UTF-8 -*-#杨辉三角返回给定行#方法:自上而下考虑问题,从给定的一行计算出下一行,则给定行数之后,计算的最后一行就是求解的最后一行class Solution(obj ...

  2. CANopen笔记1

    CAN现场总线只定义了OSI网络模型的第一层(物理层) 和第二层(数据链路层) ,而这两层一般已被CAN硬件完全实现了.由于没有规定应用层,本身并不完整,需要一个高层协议来定义CAN报文中的11/29 ...

  3. 如何在iOS 7.0中隐藏状态栏

    使用Cordova做了一个小项目,在原来iOS6的时候显示挺好,升级为iOS7后,每次App启动后都会显示状态栏,而且状态栏和App的标题栏重叠在一起,非常难看,因此需要将状态栏隐藏起来.   首先, ...

  4. 常用CMD命令

    查看电脑最大支持多大的内存:    wmic memphysical get maxcapacity   查询DNS:    nslookup a.root-servers.net   路由线路:  ...

  5. Open SQL详解

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. LINQ之路 5:LINQ查询表达式

    书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询表达式(Query Expression). LINQ方法语法的本质是通过扩展方法和Lambda表达式来创建查询.C# ...

  7. updatePanel导致JS失效的解决办法(转)

    吐槽下,维护别人之前做的项目好蛋疼,整个页面都是用微软的ajax框架. 今天给repeater用JS写一个hover事件 <script type="text/javascript&q ...

  8. [转]-Gradle使用手册(一):为什么要用Gradle?

    原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Using-sourceCompatibility-1. ...

  9. 疯狂java讲义之流程控制与数组

    while package ch4; /** * Created by Jiqing on 2016/11/6. */ public class While { public static void ...

  10. Android开发面试经——5.常见面试官提问Android题①

    版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客: http://blog.csdn.net/f ...