2007年,Google启动了Gears项目。Gears是一个开源的浏览器插件,目标是为浏览器提供额外的兼容功能(例如为IE提供geolocation的API)。Gears提供了一个API用来嵌入一个基于SQLite的SQL数据库。在得到用户的允许后,Gears可以在数据库存储没有大小限制的数据。 Gears主要有以下特点:
让网页应用跟桌面进行更自然的交互。
具有完整搜索功能数据库的本地存储。
在后台运行Javascript以提供性能。
所以,本地存储事实上只是Gears的其中一个功能。一个嵌入式数据库对本地存储的需求来说是绰绰有余了,然而跟Flash一样,Gears只不过是一个插件,还是一个跟Flash的普及率不可相提并论的插件。而且作为一个插件,它对浏览器的支持也是不足够的,我们看看它的浏览器支持情况:
当然造成这个状况也有有原因,就是因为Gears项目已经停止更新了。
2010年,Google官方宣布逐渐放弃对Gears的支持,并把工作重点转移在HTML5上……
这是一个全局对象(globalStorage),它维护着各种公共的或者私有的,可以用来长时期保存数据的存储空间(例如,在多重的页面和浏览器会话之间)。目前只有Firefox 2+支持。
globalStorage不是一个Storage实例,而是一个包含StorageObsolete实例的StorageList实例。举个栗子:
Firefox 2允许访问比当前文档域名层次高的存储的对象,例如在developer.mozilla.org上你可以访问mozilla.org或者org的存储对象。但是由于安全的因素在Firefox 3以上版本中则不再允许,你只能访问当前域名的存储对象。
Web Storage
鉴于以上本地存储的方案的各种不给力,一种更强力的本地存储技术的出现貌似是很顺应潮流的事情。Web Storage被设计出来的目的就是为了提供更大,更安全,更容易使用的存储方式。
需要注意的一点:我们说到Web Storage总是认为它是HTML5的东西,事实上,它并不是HTML5规范的一部分,它有自己独立的一份规范。
Web Storage可分为local storage和session storage。local storage提供了5MB的存储空间,而sessiong storage甚至没有限制。我们来看看local storage能为我们做什么:
local storage跟session storage除了在存储空间上不一样外,在生命周期及存储事件等特性上的表现也不一样:
STORAGE
类型大小限制生命周期对其他窗口和TAB的可用性支持的数据类型
LocalStorage 每个浏览器的每个应用限制5MB。根据,用户可以根据需要增加这个限制,但是只有少数的浏览器支持。 保存在硬盘上直到被用户或者应用删除。 共享于运行同一个web应用的浏览器的所有窗口跟标签页。 只支持键-值对的字符串。
SessionStorage 只受到系统内存的限制 只存活于使用它的窗口或标签页 只能由创建它的窗口或者标签页访问 只支持键-值对的字符串。
可以看出,session storage只是会话级的存储,只有同一个会话的窗口或者标签页能访问它,并且会话结束数据也会同时销毁。而local storage是一种持久化的存储,就算关闭浏览器数据依然存在,并且能在多个窗口和标签页间共享数据。
下面我们来看看local storage是怎样在浏览器中共享数据的:
每个浏览器上的每个web应用都有自己的一个LocalStorage,大小限制为5MB,并能在所有的这个浏览器上的窗口和标签页间共享。例如,假设你在Chrome上运行MyWebApp,如果你在多个标签页和窗口上运行MyWebApp,它们共享相同的大小限制为5MB的LocalStorage数据。如果你在其他浏览器打开相同的应用,例如Firefox,那么这个新的浏览器将会有它自己的LocalStorage供它上面的窗口和标签页进行共享。请看下面图片:
LocalStorage只能存储键值对字符串类型的数据,如果你想保存其他类型的数据,你只能在保存的时候把数据转化为字符串,然后在读取的时候再转化回去。就像cookie一样,LocalStorage和SessionStorage可以被诸如Chrome上的Developer Tools,Sarafi上的Web Inspector等工具检测得到。通过这些工具,用户可以移除保存的数据或者查看访问的网页保存了哪些数据。
LocalStorage并不是安全的存储,它保存的数据并不会进行加密,所有不宜保存一些敏感的数据。
Web Storage还有个重要特性就是Storage事件。当LocalStorage或者SessionStorage的数据被保存,修改或者删除的时候,当前窗口或者标签页的Storage事件就会触发。触发的Storage事件对象包含了事件发生时的storage对象,URL以及变化前后的键值。需要注意的时候,虽然规范里要求Storage事件在同一个浏览器里能被所有的窗口或者标签页触发,但是只有少数的浏览器实现了这个功能。另外,如果storage被清空了,那么事件不会包含任何被删键值对的信息。
StorageEvent对象包含了以下的方法:
方法描述
getKey 返回被修改的键。
getNewValue 返回被修改后的键值,如果值没有修改或者调用的是Storage.clear()的话,则返回null。
getOldValue 返回被修改前的键值,如果值没有修改或者调用的是Storage.clear()的话,则返回null。
getStorageArea 返回触发事件的SessionStorage或者LocalStorage对象。
getURL 触发当前存储事件的页面的url。