L'objet localStorage
dans Internet Explorer 11 (version Windows 7) contient des représentations sous forme de chaîne de certaines fonctions au lieu d'appels natifs comme vous vous en doutez.
Cela ne rompt qu'avec Vanilla JavaScript et des sites comme JSFiddle n'ont aucun problème avec ce code mais je pense que c'est parce qu'il y a localStorage
polyfills en place qui le corrigent.
Prenez ce code de page HTML par exemple:
<!DOCTYPE html>
<script>
localStorage.setItem('test', '12345');
alert(localStorage.getItem('test'));
localStorage.clear();
</script>
Cela fonctionne parfaitement bien dans tous mes navigateurs installés, à l'exception d'IE11. Une erreur se produit sur la première ligne ' SCRIPT5002: Fonction attendue '.
En examinant le type de la fonction setItem
dans la console des outils de développement IE, indique que c'est une chaîne ...?
typeof localStorage.setItem === 'string' // true
L'impression de la chaîne pour setItem
affiche ce qui suit:
"function() {
var result;
callBeforeHooks(hookSite, this, arguments);
try {
result = func.apply(this, arguments);
} catch (e) {
callExceptHooks(hookSite, this, arguments, e);
throw e;
} finally {
callAfterHooks(hookSite, this, arguments, result);
}
return result;
}"
Curieusement, toutes les fonctions n'ont pas été remplacées par des chaînes, par exemple, la fonction getItem
correspondante est en effet une fonction et fonctionne comme prévu.
typeof localStorage.getItem === 'function' // true
Changer le mode de document (émulation) à 10 ou 9 ne résout toujours pas le problème et les deux entraînent la même erreur. Changer le mode de document à 8 donne l'erreur suivante ' L'objet ne prend pas en charge cette propriété ou méthode ' qui est attendu depuis IE8 ne prend pas en charge localStorage
.
Quelqu'un d'autre a-t-il le même problème avec IE11 sur Windows 7 où l'objet localStorage
semble "cassé/corrompu"?
Il s'avère que c'est un problème dans la version de base d'IE11 (11.0.9600.16428) pour Windows 7 SP1.
Après installation d'un correctif pour mettre à jour vers 11.0.9600.16476 (mise à jour version 11.0.2 - KB2898785), le problème est résolu. Des liens vers d'autres versions de Windows (32 bits, etc.) se trouvent au bas de la page de téléchargement des correctifs .
Ce n'est pas seulement la faute d'IE11.
Probablement WEINRE est injecté dans la page. Il se connecte à plusieurs fonctions système pour fournir la fonctionnalité des outils de développement , mais IE11 interprète les affectations aux propriétés localStorage
et sessionStorage
de manière incorrecte, et convertit les fonctions de hook en chaînes, comme s'ils étaient les données qui vont être stockées.
Il y a n commentaire dans le repo Apache/cordova-weinre qui dit:
#In IE we should not override standard storage functions because IE does it incorrectly - all values that set as
# storage properties (e.g. localStorage.setItem = function()[...]) are cast to String.
# That leads to "Function expected" exception when any of overridden function is called.
object[property] = hookedFunction unless navigator.userAgent.match(/MSIE/i) and (object is localStorage or object is sessionStorage)
Il semble que ce soit une ancienne version de WEINRE utilisée, ou ce changement n'a pas été officiellement publié ( il existe depuis 201 ).
Mon localStorage est revenu indéfini et je n'ai pas pu comprendre pourquoi - jusqu'à ce que je réalise que c'était parce que j'exécutais la page HTML (avec le script localStorage) directement depuis mon ordinateur (fichier: /// C:/Utilisateurs/...). Lorsque j'ai accédé à la page à partir d'un serveur/localhost, localStorage a en effet été défini et a fonctionné.