JavaScript权威指南笔记9_客户端存储
来源:互联网 发布:淘宝无线端链接转化器 编辑:程序博客网 时间:2024/05/16 12:39
localStorage 和 sessionStorage
localStorage
仅支持存储字符串
localStorage
存储是永久的;除非web引用刻意删除,或者用户通过浏览器配置删除
localStorage
作用域限定在文档源级别(协议;主机名;端口)
sessionStorage
存储数据的脚本所在的 最顶层的窗口/浏览器标签页 的有效期
sessionStorage
作用域限定在文档源级别(协议;主机名;端口)
如果一个浏览器标签页包含2个<iframe>
元素, 它们可以共享sessionStorage
存储API
setItem()getItem()removeItem()clear()
存储事件
在
localStorage
或sessionStorage
的数据发生改变,浏览器都会在其他对该数据可见的窗口对象上出发存储事件(不会在对数据进行改变的窗口对象上触发)
如果2个标签页打开了来自同源的页面,其中一个页面在localStorage
上存储了数据,那么另外一个标签页会接受到一个存储事件
对sessionStorage
限制在顶层窗口,所以对sessionStorage
的改变只有当有牵连的窗口触发是才会触发存储事件
对已经存在的存储项设置一个一模一样的值,抑或是删除一个本来就不存在的存储项是不会触发事件的
cookie
cookie
的作用域是通过 文档源和文档路径 来确定的
cookie
的值不可以包含分号,逗号,空白符, 因此需要encodeURIComponent
进行编码
// 基于cookie的存储APIfunction CookieStorage(maxage, path) { // 获取一个存储全部cookie的对象 var cookies = (function() { var cookies = {}; var all = document.cookie; if (all === "") { return cookies; } // 分离出名/值对 var list = all.split("; "); // 遍历每个cookie for (var i = 0; i < list.length; i++) { var cookie = list[i]; var p = cookie.indexOf("="); // 获取cookie的名字 var name = cookie.substring(0, p); // 获取cookie对应的值 var value = cookie.substring(p + 1); // 解码 value = decodeURIComponent(value); cookies[name] = value; } return cookies; }()); // 将所有的cookie存储到一个数组中 var keys = []; for (var key in cookies) { keys.push(key); } // 定义存储API的公共方法和属性 // 存储cookie 的个数 this.length = keys.length; // 返回第N个cookie的名字, N越界返回null this.key = function(n) { if (n < 0 || n >= keys.length) { return null; } return keys[n]; }; // 返回指定cookie的名字,如果不存在返回NULL this.getItem = function(name) { return cookies[name] || null; }; // 存储cookie this.setItem = function(key, value) { // 如果要存储的cookie还不存在 if (!(key in cookies)) { // 加入数组 keys.push(key); // 长度加一 this.length++; } // 将名/值存储到cookies对象中 cookies[key] = value; // 设置cookie var cookie = key + "=" + encodeURIComponent(value); // 添加 maxage if (maxage) { cookie += "; max-age=" + maxage; } // 添加path if (path) { cookie += "; path=" + path; } // 设置document.cookie document.cookie = cookie; }; // 删除指定的cookie this.removeItem = function(key) { if (!(key in cookies)) { return; } // 删除内部cookies的指定cookie delete cookies[key]; // 从数组中删除 for (var i = 0; i < keys.length; i++) { if (keys[i] === key) { keys.splice(i, 1); break; } } this.length--; // 通过设置有效期为0来删除cookie document.cookie = key + "=; max-age=0"; }; // 删除所有cookie this.clear = function() { for (var i = 0; i < keys.length; i++) { document.cookie = keys[i] + "=; max-age=0"; } cookies = {}; keys = []; this.length = 0; };}
应用程序缓存清单
注释 以
#
开头,后面跟一个空字符
应用程序缓存清单文件约定一.appcahe作为文件扩展名.但是web服务器怔怔识别清单文件的方式是通过text/cache-mainfest
这个MIME
类型
浏览器在更新缓存过程中会触发一系列事件
- 没有可用的更新,触发
noupdate
- 有可用的更新触发
downloading
, 下载过程触发progress
和 下载完成触发updateready
- 首次载入新的应用程序
downloading
, 下载过程触发progress
, 下载完成后触发cached
- 浏览器处于离线状态触发
error
- 清单文件不存在:
- 未缓存的应用程序触发
error
- 应用程序已经缓存并且浏览器处于在线状态触发
obsolete
, 并且将该应用从缓存中移除
// 处理应用缓存的相关事件function status(msg) { document.getElementById("statusline").innerHTML = msg; console.log(msg);}window.applicationCache.onchecking = function() { status("Checking for a new version."); return false;};window.applicationCache.onnoupdate = function() { status("This version is up-to-date."); return false;};window.applicationCache.ondownloading = function() { status("Downloading new version"); window.progresscount = 0; return false;};window.applicationCache.onprogress = function(e) { var progress = ""; if (e && e.lengthComputable) { progress = " " + Math.round(100 * e.loaded / e.total) + "%" } else { progress = " (" + ++progresscount + ")" } status("Downloading new version" + progress); return false;};window.applicationCache.oncached = function() { status("This application is now cached locally"); return false;};window.applicationCache.onupdateready = function() { status("A new version has been downloaded. Reload to run it"); return false;};window.applicationCache.onerror = function() { status("Couldn't load manifest or cache application"); return false;};window.applicationCache.onobsolete = function() { status("This application is no longer cached. " + "Reload to get the latest version from the network."); return false;};
离线web应用
通过
navigator.onLine
来检测浏览器是否在线
// permanote.jsvar editor, statusline, savebutton, idletimer;window.onload = function() { if (localStorage.note == null) { localStorage.note = ""; } if (localStorage.lastModified == null) { localStorage.lastModified = 0; } if (localStorage.lastSaved == null) { localStorage.lastSaved = 0; } editor = document.getElementById("editor"); statusline = document.getElementById("statusline"); savebutton = document.getElementById("savebutton"); editor.value = localStorage.note; editor.disabled = true; editor.addEventListener("input", function(e) { localStorage.note = editor.value; localStorage.lastModified = Date.now(); if (idletimer) { clearTimeout(idletimer); } idletimer = setTimeout(save, 5000); savebutton.disabled = false; }, false); sync();};window.onbeforeunload = function() { if (localStorage.lastModified > localStorage.lastSaved) { save(); }};window.onoffline = function() { status("Offline");}window.ononline = function() { sync();};window.applicationCache.onupdateready = function() { status("A new version of this application is available. Reload to run it");};window.applicationCache.onnoupdate = function() { status("You are running the latest version of the application.");};function status(msg) { statusline.innerHTML = msg;}function save() { if (idletimer) { clearTimeout(idletimer); } idletimer = null; if (navigator.onLine) { var xhr = new XMLHttpRequest(); xhr.open("PUT", "/note"); xhr.send(editor.value); xhr.onload = function() { localStorage.lastSaved = Date.now(); savebutton.disabled = true; }; }}function sync() { if (navigator.onLine) { var xhr = new XMLHttpRequest(); xhr.open("GET", "/note"); xhr.send(); xhr.onload = function() { var remoteModTime = 0; if (xhr.status == 200) { var remoteModTime = xhr.getResponseHeader("Last-Modified"); remoteModTime = new Date(remoteModTime).getTime(); } if (remoteModTime > localStorage.lastModified) { status("Newer note found on server."); var useit = confirm("There is a newer version of the note\n" + "on the server. Click Ok to use that version\n" + "or click Cancel to continue editing this\n" + "version and overwrite the server"); var now = Date.now(); if (useit) { editor.value = localStorage.note = xhr.responseText; localStorage.lastSaved = now; status("Newest version downloaded."); } else { status("Ignoring newer version of the note."); } localStorage.lastModified = now; } else { status("You are editing the current version of the note."); } if (localStorage.lastModified > localStorage.lastSaved) { save(); } editor.disabled = false; editor.focus(); } } else { status("Can't sync while offline"); editor.disabled = false; editor.focus(); }}
文章若有纰漏请大家补充指正,谢谢~~
http://blog.xinshangshangxin.com SHANG殇
- JavaScript权威指南笔记9_客户端存储
- JavaScript权威指南笔记4_数组
- JavaScript权威指南第20章 客户端存储
- JavaScript权威指南读书笔记——第二十章客户端存储
- javascript权威指南学习笔记-客户端javascript(1)
- javascript权威指南第六版学习笔记-客户端javascript(2)
- javascript 权威指南笔记
- 《Javascript 权威指南》笔记
- javascript权威指南-笔记
- JavaScript权威指南笔记
- 《JavaScript权威指南》笔记
- javascript权威指南笔记
- JavaScript权威指南笔记5_类和模块
- JavaScript权威指南笔记6_正则表达式
- JavaScript权威指南笔记7_脚本化文档
- JavaScript权威指南笔记8_脚本化HTTP
- 《Javascript权威指南》学习笔记之十七:BOM新成就(1)--客户端存储数据(Storage实现)
- 《Javascript权威指南》学习笔记之十八:BOM新成就(1)--客户端存储数据(Web SQL DataBase实现)
- 慕课第二次作业学习总结
- Android优秀开源项目
- CORBA_百度百科
- centos 6.5 网络配置
- LOL 登录问题总结
- JavaScript权威指南笔记9_客户端存储
- 写给刚工作的网站技术人员
- svm相关学习大全
- 深入理解堆与栈
- poj 1020 Anniversary Cake (DFS)
- 数据库范式(1NF 2NF 3NF BCNF)
- 交叉验证(CrossValidation)方法思想简介
- android 之 json数据解析
- 达梦PRO*C