Objet JavaScript localStorage cassé dans IE11 sur Windows 7

localStorage object in Internet Explorer 11 (Windows 7 build) contient des représentations de chaînes de caractères de certaines fonctions au lieu d'appels natifs comme vous vous y attendriez.

cela ne fonctionne qu'avec JavaScript et les sites comme JSFiddle n'ont aucun problème avec ce code mais je soupçonne 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 sauf pour IE11. Une erreur se produit sur la première ligne 'SCRIPT5002: fonction attendue'.

regardez quel type de setItem la fonction est en fait dans la console IE developer tools, elle indique qu'il s'agit d'une chaîne de caractères...?

    typeof localStorage.setItem === 'string' // true

Impression de la chaîne 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, les getItem la fonction est en effet une fonction et fonctionne comme prévu.

    typeof localStorage.getItem === 'function' // true

changer le mode document (émulation) à 10 ou 9 ne résout toujours pas le problème et les deux se traduisent par la même erreur. Changer le mode document en 8 donne l'erreur suivante'Objet ne gère pas cette propriété ou cette méthode ' ce qui est attendu puisque IE8 ne supporte pas localStorage.

est-ce que quelqu'un d'autre a le même problème avec IE11 sur Windows 7 où le localStorage l'objet semble "cassé / corrompu"?

40
demandé sur BrutalDev 2014-01-16 10:53:11

3 réponses

il S'avère que c'est un problème dans la version de base de IE11 (11.0.9600.16428) pour Windows 7 SP1.

Après installer un patch pour mettre à jour à 11.0.9600.16476 (mettre à jour la version 11.0.2 - KB2898785) le problème est résolu. Liens vers D'autres versions de Windows (32 bits, etc.)) peut être trouvé au bas de l' patch page de téléchargement.

25
répondu BrutalDev 2014-04-08 13:33:14

ce n'est pas seulement la faute D'IE11.

Probablement WEINRE est injecté dans la page. connecte plusieurs fonctions du système pour fournir la fonctionnalité des outils de développement, mais IE11 interprète les assignations à la localStorage et sessionStorage propriétés erronées, et convertit les fonctions de crochet en chaînes, comme si elles étaient les données qui vont être stockées.

Il y a un commentaire dans le apache/cordova-weinre repo 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)

on dirait que C'est soit une ancienne version de WEINRE utilisée, soit ce changement n'a pas été officiellement publié (il est là depuis 2013).

4
répondu sompylasar 2016-08-30 19:29:42

Mon localStorage retourné indéfini et je ne pouvais pas comprendre pourquoi j'ai réalisé que c'était parce que j'exécutais la page HTML (avec le script localStorage) directement depuis mon ordinateur (file:///C:/Users/...). Quand j'ai accédé à la page à partir d'un serveur/localhost à la place il localStorage a été en effet défini et travaillé.

1
répondu holm50 2018-05-23 11:28:22