2010-04-30 95 views
74

HTML5的localStorage數據庫通常受到大小限制 - 標準大小爲每個域5或10 MB。這些限制是否可以通過子域來規避(例如,example.com,hack1.example.com和hack2.example.com都有自己的5 MB數據庫)?標準中是否有指定父域是否可以訪問其子數據庫的內容?我找不到任何東西,我可以通過任何方式看到有關這樣做的論點,但似乎必須有一些標準模型。子域的HTML5 localStorage大小限制

+1

我的工作,現在有一個程序,我們正在嘗試將所有文​​本完全存儲在localStorage中。如果您可以添加一些鏈接到您找到有關當前5MB限制的信息,那將會非常棒。這會幫助我更好地理解替代方案。謝謝 – JeroenEijkhof

+6

基於Webkit的瀏覽器使用UTF-16進行存儲,限制爲2.5MB。 – rxgx

+8

請注意,2011年6月的RFC規定:「用戶代理應防止在其他聯屬站點的原始位置存儲數據的站點,例如存儲在a1.example.com,a2.example.com,a3.example.com,繞過主要的example.com存儲限制。「所以不要指望這種黑客將來繼續工作。 (http://dev.w3.org/html5/webstorage/) –

回答

51

http://dev.w3.org/html5/webstorage/#disk-space建議

A的每產地爲5 MB大多任何限制。實施反饋是受歡迎的,並將在未來用於更新此建議。

它還提到:

用戶代理應警惕網站起源下存儲數據 其他聯屬網站,例如存儲最多 a1.example.com,a2.example.com,a3.example.com等的限制,規避主要example.com存儲限制 。

+5

這並沒有真正回答有關子域的問題。 –

+15

@JörnZaefferer,規範的* intent *是爲了防止使用子域名。 –

+4

有趣的是,儘管規範中有警告,但顯然只有FireFox實施了建議的預防措施。看到這個項目有一個有趣的方式來填補你的磁盤/崩潰你的瀏覽器:http://feross.org/fill-disk/ –

9

我錯過了這個問題,當我問「Is 5MB the de facto limit for W3C Web Storage?」,但我得到了基本相同的答案。如果你需要更多的信息,我在我的問題中確實鏈接了一些瀏覽器特定的限制。

5

更好的解決方案是使用[HTML5索引的離線存儲。]1

它看起來像更換舊的Web SQL(這似乎是名不副實的B/C它是離線存儲)是:索引數據庫,允許離線存儲並且仍支持:

IndexedDB是HTML5中的新增功能。 Web數據庫在用戶的瀏覽器內託管並持久保留 。通過允許開發人員創建具有豐富查詢能力的應用程序 ,可以預見將會出現一種新的應用程序,可以在線工作,並且可以離線工作

更多信息和test-app在: http://ido-green.appspot.com/WebSQL-IndexedDB-example/jqm_indexedDB.html

+0

目前在移動設備上沒有IndexedDB支持(可能即將在iOS 7中提供)。所以最好創建一個包裝WebSQL和IndexedDB的持久API,直到移動設備支持更好的IndexedDB http://caniuse.com/#search=indexeddb – oligofren

+0

這應該是一個評論,因爲它沒有回答這個問題。 –

+1

我實際上認爲它可能會爲提出最初問題的人提供最好的建議。另外,還有一個體面的polyfill庫,它爲舊版移動瀏覽器在WebSQL之上實現了indexedDB。 –

2

要獲得的存儲空間使用代碼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); 
}); 

https://github.com/DVLP/localStorageDB