访问原文地址javascript
DOM存储的机制是经过存储字符串类型的键/值对,来提供一种安全的存取方式.这个附加功能的目标是提供一个全面的,能够用来建立交互式应用程序的方法(包括那些高级功能,例如能够离线工做一段时间).html
DOM存储颇有用,由于在浏览器端没有好的方法来持久保存大量数据。浏览器cookie的能力有限,并且不支持组织持久数据,其余方法(如flash本地存储)须要外部插件支持。java
readonly attribute unsigned long length;程序员
DOMString key(in unsigned long index);web
DOMString getItem(in DOMString key);数据库
void setItem(in DOMString key, in DOMString data);浏览器
void removeItem(in DOMString key);安全
void clear();服务器
sessionStorage 是个全局对象,它维护着在页面会话(page session)期间有效的存储空间。只要浏览器开着,页面会话周期就会一直持续。当页面从新载入(reload)或者被恢复(restores)时,页面会话也是一直存在的。每在新标签或者新窗口中打开一个新页面,都会初始化一个新的会话。cookie
自动保存一个文本域中的内容,若是浏览器被意外刷新,则恢复该文本域中的内容,因此不会丢失任何输入的数据。
// 获取到咱们要循环保存的文本域 var field = document.getElementById("field"); // 查看是否有一个自动保存的值 // (只在浏览器被意外刷新时) if ( sessionStorage.getItem("autosave")) { // 恢复文本域中的内容 field.value = sessionStorage.getItem("autosave"); } // 每隔一秒检查文本域中的内容 setInterval(function(){ // 并将文本域的值保存到session storage对象中 sessionStorage.setItem("autosave", field.value); }, 1000);
localStorage 属性容许你访问一个 local Storage 对象。localStorage 与 sessionStorage 类似。不一样之处在于,存储在 localStorage 里面的数据没有过时时间(expiration time),而存储在 sessionStorage 里面的数据会在浏览器会话(browsing session)结束时被清除,即浏览器关闭时。
当浏览器进入私人模式(private browsing mode,Google Chrome 上对应的应该是叫隐身模式)的时候,会建立一个新的、临时的、空的数据库,用以存储本地数据(local storage data)。当浏览器关闭时,里面的全部数据都将被丢弃。
if(!localStorage.getItem('bgcolor')) { populateStorage(); } else { setStyles(); }
Storage.getItem() 方法用来从存储中获取一个数据项。该例中,咱们测试 bgcolor 数据项是否存在。若是不存在,执行 populateStorage() 来将存在的自定义值添加到存储中。若是有值存在,则执行 setStyles() 来使用存储的值更新页面的样式。
备注:你还可使用 Storage.length 来测试存储对象是否为空。
正如上面提到的,使用 Storage.getItem() 能够从存储中获取一个数据项。该方法接受数据项的键做为参数,并返回数据值。
function setStyles() { var currentColor = localStorage.getItem('bgcolor'); var currentFont = localStorage.getItem('font'); var currentImage = localStorage.getItem('image'); document.getElementById('bgcolor').value = currentColor; document.getElementById('font').value = currentFont; document.getElementById('image').value = currentImage; htmlElem.style.backgroundColor = '#' + currentColor; pElem.style.fontFamily = currentFont; imgElem.setAttribute('src', currentImage); }
首先,前三行代码从本地中获取值。接着,将值显示到表单元素中,这样在从新加载页面时与自定义设置保持同步。最后,更新页面的样式和图片,这样从新加载页面后,你的自定义设置从新起做用了。
Storage.setItem() 方法可被用来建立新数据项和更新已存在的值。该方法接受两个参数——要建立/修改的数据项的键,和对应的值。
function populateStorage() { localStorage.setItem('bgcolor', document.getElementById('bgcolor').value); localStorage.setItem('font', document.getElementById('font').value); localStorage.setItem('image', document.getElementById('image').value); setStyles(); }
populateStorage() 方法在本地存储中设置三项数据 — 背景颜色、字体和图片路径。而后执行 setStyles() 方法来更新页面的样式。
同时,咱们为每一个表单元素绑定了一个 onchange 监听器,这样,一个表单值改变时,存储的数据和页面样式会更新。
bgcolorForm.onchange = populateStorage; fontForm.onchange = populateStorage; imageForm.onchange = populateStorage;
不管什么时候,Storage 对象发生变化时(即建立/更新/删除数据项时,重复设置相同的键值不会触发该事件,Storage.clear() 方法至多触发一次该事件),StorageEvent 事件会触发。在同一个页面内发生的改变不会起做用——在相同域名下的其余页面(如一个新标签或 iframe)发生的改变才会起做用。在其余域名下的页面不能访问相同的 Storage 对象。
window.addEventListener('storage', function(e) { document.querySelector('.my-key').textContent = e.key; document.querySelector('.my-old').textContent = e.oldValue; document.querySelector('.my-new').textContent = e.newValue; document.querySelector('.my-url').textContent = e.url; document.querySelector('.my-storage').textContent = e.storageArea; });
这里,咱们为 window 对象添加了一个事件监听器,在当前域名相关的 Storage 对象发生改变时该事件监听器会触发。正如你在上面看到的,此事件相关的事件对象有多个属性包含了有用的信息——改变的数据项的键,改变前的旧值,改变后的新值,改变的存储对象所在的文档的 URL,以及存储对象自己。
Web Storage 提供了一对简单的方法用于移除数据。咱们没用在咱们的 demo 中使用这些方法,可是添加到你本身的项目中很简单:
//接受一个参数——你想要移除的数据项的键,而后会将对应的数据项从域名对应的存储对象中移除。 Storage.removeItem() //不接受参数,只是简单地清空域名对应的整个存储对象。 Storage.clear()
Cookie 是小甜饼的意思。顾名思义,cookie 确实很是小,它的大小限制为4KB左右,是网景公司的前雇员 Lou Montulli 在1993年3月的发明。它的主要用途有保存登陆信息,好比你登陆某个网站市场能够看到“记住密码”,这一般就是经过在 Cookie 中存入一段辨别用户身份的数据来实现的。
特性 | Cookie | localStorage | sessionStorage | |
---|---|---|---|---|
数据的生命期 | 通常由服务器生成,可设置失效时间。若是在浏览器端生成Cookie,默认是关闭浏览器后失效 | 除非被清除,不然永久保存 | 仅在当前会话下有效,关闭页面或浏览器后被清除 | |
存放数据大小 | 4K左右 | 通常为5MB | ||
与服务器端通讯 | 每次都会携带在HTTP头中,若是使用cookie保存过多数据会带来性能问题 | 仅在客户端(即浏览器)中保存,不参与和服务器的通讯 | ||
易用性 | 须要程序员本身封装,源生的Cookie接口不友好 | 源生接口能够接受,亦可再次封装来对Object和Array有更好的支持 |
由于考虑到每一个 HTTP 请求都会带着 Cookie 的信息,因此 Cookie 固然是能精简就精简啦,比较经常使用的一个应用场景就是判断用户是否登陆。针对登陆过的用户,服务器端会在他登陆时往 Cookie 中插入一段加密过的惟一辨识单一用户的辨识码,下次只要读取这个值就能够判断当前用户是否登陆啦。曾经还使用 Cookie 来保存用户在电商网站的购物车信息,现在有了 localStorage,彷佛在这个方面也能够给 Cookie 放个假了~
而另外一方面 localStorage 接替了 Cookie 管理购物车的工做,同时也能胜任其余一些工做。好比HTML5游戏一般会产生一些本地数据,localStorage 也是很是适用的。若是遇到一些内容特别多的表单,为了优化用户体验,咱们可能要把表单页面拆分红多个子页面,而后按步骤引导用户填写。这时候 sessionStorage 的做用就发挥出来了。
须要注意的是,不是什么数据都适合放在 Cookie、localStorage 和 sessionStorage 中的。使用它们的时候,须要时刻注意是否有代码存在 XSS 注入的风险。由于只要打开控制台,你就随意修改它们的值,也就是说若是你的网站中有 XSS 的风险,它们就能对你的 localStorage 肆意妄为。因此千万不要用它们存储你系统中的敏感数据。
Use Cookie
LocalStorage
经过window.open(...)方式打开的tab,能够操做Windows对象来通讯
postMessage API
//In w1 var w2 = window.open("abc.do"); window.addEventListener("message", function(event){ console.log(event.data); }); //In w2(abc.do) window.opener.postMessage("Hi! I'm w2", "*");