J'espère que cela aidera quelqu'un.
Parce que Jas- exemple sur jsfiddle ne fonctionne pas pour moi, j'ai trouvé cette solution. (merci à Serge Seletskyy et Shourav pour leurs bits que j'ai utilisés dans le code ci-dessous)
Vous trouverez ci-dessous la fonction qui peut être utilisée pour tester la quantité d'espace disponible pour localStorage et (si des clés sont déjà dans lS) la quantité d'espace restant.
C'est un peu de force brute mais cela fonctionne dans presque tous les navigateurs ... à part Firefox. Eh bien, dans le bureau FF, cela prend du temps (4 à 5 minutes) pour terminer, et sur Android, il se bloque juste.
Sous la fonction se trouve un bref résumé des tests que j'ai effectués dans différents navigateurs sur différentes plates-formes. Prendre plaisir!
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
}
Et comme promis ci-dessus, quelques tests dans différents navigateurs:
GalaxyTab 10.1
- Maxthon Pad 1,7 ~ 1130 ms 5 Mo
- Firefox 20.0 (Beta 20.0) a planté les deux
- Chrome 25.0.1364.169 ~ 22250ms / 5 Mo
- Natif (identifie comme Safari 4.0 / Webkit534.30) ~ 995 ms / 5 Mo
iPhone 4s iOS 6.1.3
- Safari ~ 520 ms / 5 Mo
- Comme HomeApp ~ 525 ms / 5 Mo
- iCab ~ 710 ms / 5 Mo
MacBook Pro OSX 1.8.3 (mémoire Core 2 Duo 2,66 8 Go)
- Safari 6.0.3 ~ 105 ms / 5 Mo
- Chrome 26.0.1410.43 ~ 3400ms / 5 Mo
- Firefox 20.0 300150ms (!) / 10Mb (après s'être plaint du script trop long)
iPad 3 iOS 6.1.3
- Safari ~ 430 ms / 5 Mo
- iCab ~ 595 ms / 5 Mo
Windows 7 -64b (mémoire Core 2 Duo 2,93 6 Go)
- Safari 5.1.7 ~ 80 ms / 5 Mo
- Chrome 26.0.1410.43 ~ 1220 ms / 5 Mo
- Firefox 20.0 228500ms (!) / 10Mb (après s'être plaint du script trop long)
- IE9 ~ 17900ms /9.54Mb (si des consoles.logs sont dans le code ne fonctionne pas jusqu'à ce que DevTools soit ouvert)
- Opera 12.15 ~ 4212ms /3.55Mb (c'est lorsque 5Mb est sélectionné, mais Opera demande gentiment si nous voulons augmenter la quantité de lS, malheureusement il plante si le test est effectué plusieurs fois de suite)
Win 8 (sous Parallels 8)