Hy vọng điều này sẽ giúp ai đó.
Vì Jas- example trên jsfiddle không hoạt động với tôi nên tôi đã đưa ra giải pháp này. (cảm ơn Serge Seletskyy và Shourav vì những bit của họ mà tôi đã sử dụng trong đoạn mã bên dưới)
Dưới đây là hàm có thể được sử dụng để kiểm tra xem còn bao nhiêu dung lượng cho localStorage và (nếu bất kỳ khóa nào đã có trong lS) còn bao nhiêu dung lượng.
Nó hơi thô bạo nhưng nó hoạt động trên hầu hết mọi trình duyệt, ngoại trừ Firefox. Trong FF dành cho máy tính để bàn, phải mất nhiều thời gian (4-5 phút) để hoàn thành, và trên Android thì nó chỉ bị treo.
Bên dưới chức năng là một bản tóm tắt ngắn về các thử nghiệm mà tôi đã thực hiện trong các trình duyệt khác nhau trên các nền tảng khác nhau. Thưởng thức!
function testLocalStorage() {
var timeStart = Date.now();
var timeEnd, countKey, countValue, amountLeft, itemLength;
var occupied = leftCount = 3; //Shurav's comment on initial overhead
//create localStorage entries until localStorage is totally filled and browser issues a warning.
var i = 0;
while (!error) {
try {
//length of the 'value' was picked to be a compromise between speed and accuracy,
// the longer the 'value' the quicker script and result less accurate. This one is around 2Kb
localStorage.setItem('testKey' + i, '11111111112222222222333333333344444444445555555555666661111111111222222222233333333334444444444555555555566666');
} catch (e) {
var error = e;
}
i++;
}
//if the warning was issued - localStorage is full.
if (error) {
//iterate through all keys and values to count their length
for (var i = 0; i < localStorage.length; i++) {
countKey = localStorage.key(i);
countValue = localStorage.getItem(localStorage.key(i));
itemLength = countKey.length + countValue.length;
//if the key is one of our 'test' keys count it separately
if (countKey.indexOf("testKey") !== -1) {
leftCount = leftCount + itemLength;
}
//count all keys and their values
occupied = occupied + itemLength;
}
;
//all keys + values lenght recalculated to Mb
occupied = (((occupied * 16) / (8 * 1024)) / 1024).toFixed(2);
//if there are any other keys then our 'testKeys' it will show how much localStorage is left
amountLeft = occupied - (((leftCount * 16) / (8 * 1024)) / 1024).toFixed(2);
//iterate through all localStorage keys and remove 'testKeys'
Object.keys(localStorage).forEach(function(key) {
if (key.indexOf("testKey") !== -1) {
localStorage.removeItem(key);
}
});
}
//calculate execution time
var timeEnd = Date.now();
var time = timeEnd - timeStart;
//create message
var message = 'Finished in: ' + time + 'ms \n total localStorage: ' + occupied + 'Mb \n localStorage left: ' + amountLeft + "Mb";
//put the message on the screen
document.getElementById('scene').innerText = message; //this works with Chrome,Safari, Opera, IE
//document.getElementById('scene').textContent = message; //Required for Firefox to show messages
}
Và như đã hứa ở trên, một số thử nghiệm trên các trình duyệt khác nhau:
GalaxyTab 10.1
- Maxthon Pad 1.7 ~ 1130ms 5Mb
- Firefox 20.0 (Beta 20.0) bị lỗi cả hai
- Chrome 25.0.1364.169 ~ 22250ms / 5Mb
- Gốc (xác định là Safari 4.0 / Webkit534.30) ~ 995ms / 5Mb
iPhone 4s iOS 6.1.3
- Safari ~ 520ms / 5Mb
- Như HomeApp ~ 525ms / 5Mb
- iCab ~ 710ms / 5mb
MacBook Pro OSX 1.8.3 (Core 2 Duo 2.66 bộ nhớ 8Gb)
- Safari 6.0.3 ~ 105ms / 5Mb
- Chrome 26.0.1410.43 ~ 3400ms / 5Mb
- Firefox 20.0 300150ms (!) / 10Mb (sau khi phàn nàn về việc tập lệnh chạy quá lâu)
iPad 3 iOS 6.1.3
- Safari ~ 430ms / 5Mb
- iCab ~ 595ms / 5mb
Windows 7 -64b (Core 2 Duo 2.93 bộ nhớ 6Gb)
- Safari 5.1.7 ~ 80ms / 5Mb
- Chrome 26.0.1410.43 ~ 1220ms / 5Mb
- Firefox 20.0 228500ms (!) / 10Mb (sau khi phàn nàn về việc tập lệnh chạy quá lâu)
- IE9 ~ 17900ms /9,54Mb (nếu có bất kỳ bảng điều khiển nào trong mã không hoạt động cho đến khi DevTools được mở)
- Opera 12.15 ~ 4212ms / 3.55Mb (đây là khi 5Mb được chọn, nhưng Opera hỏi rất hay nếu chúng ta muốn tăng lượng lS, rất tiếc là nó bị treo nếu tiến hành thử nghiệm một vài lần liên tiếp)
Thắng 8 (Dưới các điểm 8)