Objeto JavaScript localStorage roto en IE11 en Windows 7


Answers

No es solo culpa de IE11.

Probablemente WEINRE se inyecte en la página. Se conecta a varias funciones del sistema para proporcionar funcionalidad de herramientas de desarrollo , pero IE11 interpreta localStorage las asignaciones a las propiedades localStorage y sessionStorage , y convierte las funciones de localStorage en cadenas, como si fueran los datos que se van a almacenar.

Hay un comentario en el repo de apache / cordova-weinre que dice:

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

Parece que se está utilizando una versión anterior de WEINRE, o este cambio no se ha lanzado oficialmente ( ha estado allí desde 2013 ).

Question

El objeto localStorage en Internet Explorer 11 (compilación de Windows 7) contiene representaciones de cadena de ciertas funciones en lugar de llamadas nativas como era de esperar.

Esto solo se rompe con el JavaScript vainilla y los sitios como JSFiddle no tienen ningún problema con este código, pero sospecho que es porque hay localStorage que lo corrigen.

Tome este código de página HTML, por ejemplo:

<!DOCTYPE html>
<script>
  localStorage.setItem('test', '12345');
  alert(localStorage.getItem('test'));
  localStorage.clear();
</script>

Esto funciona perfectamente bien en todos mis navegadores instalados excepto IE11. Se produce un error en la primera línea ' SCRIPT5002: Función esperada '.

Echando un vistazo a qué tipo de la función setItem es realmente en la consola de herramientas de desarrollador de IE, afirma que es una cadena ...?

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

Imprimir la cadena para setItem muestra lo siguiente:

"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;
}"

Por extraño que parezca, no todas las funciones han sido reemplazadas por cadenas, por ejemplo, la función getItem correspondiente es de hecho una función y funciona como se esperaba.

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

Cambiar el modo de documento (emulación) a 10 o 9 aún no resuelve el problema y ambos producen el mismo error. Al cambiar el modo de documento a 8, aparece el siguiente error "El objeto no admite esta propiedad o método ", que se espera porque IE8 no admite localStorage .

¿Hay alguien más que tenga el mismo problema con IE11 en Windows 7 donde el objeto localStorage parece 'roto / dañado'?