HTML5 的 localStorage 数据库通常是有大小限制的——标准大小是每个域 5 或 10 MB。子域能否绕过这些限制(例如 example.com、hack1.example.com 和 hack2.example.com 都有自己的 5 MB 数据库)?标准中是否有任何内容指定父域是否可以访问其子域的数据库?我找不到任何东西,我可以看到任何一种方式的论据,但似乎必须有一些标准模型。
5 回答
来自http://dev.w3.org/html5/webstorage/#disk-space
建议对每个源使用 5 兆字节的任意限制。欢迎提供实施反馈,并将用于在未来更新此建议。
它还提到:
用户代理应防止站点将数据存储在其他附属站点的来源下,例如存储在 a1.example.com、a2.example.com、a3.example.com 等中的限制,绕过主要的 example.com 存储限制.
这是一个非常详细的测试结果,涵盖了大量的桌面和移动浏览器:http: //dev-test.nemikor.com/web-storage/support-test/
这证实了这个错误报告:http ://code.google.com/p/chromium/issues/detail?id=58985#c15
根据可以存储的字符串长度,您只能依赖 2.5MB,而不是 5MB。
当我问“ W3C Web Storage 的实际限制是 5MB 吗? ”时,我错过了这个问题,但我得到了基本相同的答案。如果您想了解更多信息,我确实在我的问题中链接到了一些浏览器特定的限制。
更好的解决方案是使用 [HTML5 IndexedDB 进行离线存储。] 1
看起来旧的 Web SQL 的替代品(它似乎被错误地命名为 b/c 它用于离线存储)是:Indexed DB,它允许离线存储并且仍然受支持:
IndexedDB 是 HTML5 中的新内容。Web 数据库托管并保存在用户的浏览器中。通过允许开发人员创建具有丰富查询能力的应用程序,可以预见将出现一种能够在线和 离线工作的新型 Web 应用程序。
更多信息和测试应用程序:http : //ido-green.appspot.com/WebSQL-IndexedDB-example/jqm_indexedDB.html
要获得 50MB 的存储空间,请使用以下代码
// 1. paste this line in your code
!function(){function e(t,o){return n?void(n.transaction("s").objectStore("s").get(t).onsuccess=function(e){var t=e.target.result&&e.target.result.v||null;o(t)}):void setTimeout(function(){e(t,o)},100)}var t=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;if(!t)return void console.error("indexDB not supported");var n,o={k:"",v:""},r=t.open("d2",1);r.onsuccess=function(e){n=this.result},r.onerror=function(e){console.error("indexedDB request error"),console.log(e)},r.onupgradeneeded=function(e){n=null;var t=e.target.result.createObjectStore("s",{keyPath:"k"});t.transaction.oncomplete=function(e){n=e.target.db}},window.ldb={get:e,set:function(e,t){o.k=e,o.v=t,n.transaction("s","readwrite").objectStore("s").put(o)}}}();
// 2. Setting values
ldb.set('nameGoesHere', 'value goes here');
// 3. Getting values - callback is required because the data is being retrieved asynchronously:
ldb.get('nameGoesHere', function (value) {
console.log('And the value is', value);
});