Надеюсь, это кому-то поможет.
Поскольку пример Jas на jsfiddle у меня не работает, я придумал это решение. (спасибо Serge Seletskyy и Shourav за их биты, которые я использовал в коде ниже)
Ниже приведена функция, с помощью которой можно проверить, сколько места доступно для localStorage и (если какие-либо ключи уже находятся в lS) сколько места осталось.
Это небольшая грубая сила, но она работает почти во всех браузерах ... кроме Firefox. Что ж, в настольном FF для завершения требуется время (4-5 минут), а на Android он просто вылетает.
Под функцией находится краткий обзор тестов, которые я провел в разных браузерах на разных платформах. Наслаждайтесь!
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
}
И, как было обещано выше, несколько тестов в разных браузерах:
GalaxyTab 10.1
- Maxthon Pad 1.7 ~ 1130 мс 5 МБ
- Firefox 20.0 (Beta 20.0) вылетел как
- Chrome 25.0.1364.169 ~ 22250 мс / 5 МБ
- Собственный (идентифицируется как Safari 4.0 / Webkit534.30) ~ 995 мс / 5 МБ
iPhone 4s iOS 6.1.3
- Safari ~ 520 мс / 5 Мб
- Как HomeApp ~ 525 мс / 5 МБ
- iCab ~ 710 мс / 5 МБ
MacBook Pro OSX 1.8.3 (Core 2 Duo 2,66 8 ГБ памяти)
- Safari 6.0.3 ~ 105 мс / 5 Мб
- Chrome 26.0.1410.43 ~ 3400 мс / 5 МБ
- Firefox 20.0 300150 мс (!) / 10 МБ (после жалобы на долгую работу скрипта)
iPad 3 iOS 6.1.3
- Safari ~ 430 мс / 5 Мб
- iCab ~ 595 мс / 5 МБ
Windows 7 -64b (Core 2 Duo 2,93 6 ГБ памяти)
- Safari 5.1.7 ~ 80 мс / 5 Мб
- Chrome 26.0.1410.43 ~ 1220 мс / 5 МБ
- Firefox 20.0 228500 мс (!) / 10 МБ (после жалобы на слишком долгую работу скрипта)
- IE9 ~ 17900 мс / 9,54 Мб (если в коде есть console.logs, не работает, пока не откроются DevTools)
- Opera 12.15 ~ 4212 мс / 3,55 МБ (это когда выбрано 5 МБ, но Opera красиво спрашивает, хотим ли мы увеличить количество lS, к сожалению, он вылетает, если тест проводится несколько раз подряд)
Победа 8 (в параллелях 8)