web-dev-qa-db-fra.com

Objet localStorage JavaScript cassé dans IE11 sur Windows 7

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"?

44
BrutalDev

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 .

25
BrutalDev

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 ).

4
sompylasar

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é.

2
holm50