Espero que esto ayude a alguien.
Debido a que Jas- example en jsfiddle no me funciona, se me ocurrió esta solución. (gracias a Serge Seletskyy y Shourav por sus bits que usé en el código a continuación)
A continuación se muestra la función que se puede usar para probar cuánto espacio hay disponible para localStorage y (si ya hay claves en lS) cuánto espacio queda.
Es un poco de fuerza bruta pero funciona en casi todos los navegadores ... excepto en Firefox. Bueno, en el escritorio FF se necesitan siglos (4-5 minutos) en completarse, y en Android simplemente falla.
Debajo de la función hay un breve resumen de las pruebas que he realizado en diferentes navegadores en diferentes plataformas. ¡Disfrutar!
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
}
Y como se prometió anteriormente, algunas pruebas en diferentes navegadores:
GalaxyTab 10.1
- Almohadilla Maxthon 1.7 ~ 1130ms 5Mb
- Firefox 20.0 (Beta 20.0) se bloqueó tanto
- Cromo 25.0.1364.169 ~ 22250ms / 5Mb
- Nativo (se identifica como Safari 4.0 / Webkit534.30) ~ 995ms / 5Mb
iPhone 4s iOS 6.1.3
- Safari ~ 520 ms / 5 Mb
- Como HomeApp ~ 525ms / 5Mb
- iCab ~ 710 ms / 5 MB
MacBook Pro OSX 1.8.3 (Core 2 Duo 2.66 de memoria de 8 Gb)
- Safari 6.0.3 ~ 105ms / 5Mb
- Cromo 26.0.1410.43 ~ 3400ms / 5Mb
- Firefox 20.0 300150ms (!) / 10Mb (después de quejarse de que el script se ejecuta demasiado)
iPad 3 iOS 6.1.3
- Safari ~ 430 ms / 5 Mb
- iCab ~ 595 ms / 5 MB
Windows 7 -64b (Core 2 Duo 2,93 de memoria de 6 Gb)
- Safari 5.1.7 ~ 80 ms / 5 Mb
- Cromo 26.0.1410.43 ~ 1220ms / 5Mb
- Firefox 20.0 228500ms (!) / 10Mb (después de quejarse de que el script se ejecuta demasiado)
- IE9 ~ 17900ms /9.54Mb (si hay algún console.logs en el código, no funciona hasta que se abre DevTools)
- Opera 12.15 ~ 4212ms /3.55Mb (aquí es cuando se selecciona 5Mb, pero Opera pregunta amablemente si queremos aumentar la cantidad de lS, desafortunadamente falla si la prueba se realiza varias veces seguidas)
Gana 8 (bajo Parallels 8)