Подтвердить что ты не робот

JavaScript-объект localStorage, разбитый в IE11 на Windows 7

Объект localStorage в Internet Explorer 11 (сборка Windows 7) содержит строковые представления определенных функций вместо обычных вызовов, как и следовало ожидать.

Это только ломается с ванильным JavaScript и сайты, такие как JSFiddle, не имеют проблемы с этим кодом, но я подозреваю, потому что есть localStorage полиполки, которые исправляют его.

Возьмите этот код HTML-страницы, например:

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

Это отлично работает во всех моих установленных браузерах, кроме IE11. Ошибка в первой строке SCRIPT5002: ожидаемая функция.

Взглянув на то, какой тип функции setItem на самом деле находится в консоли инструментов разработчика IE, указывает, что это строка...?

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

Распечатка строки для setItem отображает следующее:

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

Как ни странно, не все функции были заменены на строки, например, соответствующая функция getItem действительно является функцией и работает как ожидалось.

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

Изменение режима документа (эмуляции) до 10 или 9 по-прежнему не устраняет проблему, и оба они приводят к той же ошибке. Изменение режима документа на 8 приводит к следующей ошибке: " Объект не поддерживает это свойство или метод", который ожидается, поскольку IE8 не поддерживает localStorage.

Есть ли у кого-то еще одна проблема с IE11 в Windows 7, где объект localStorage кажется "сломанным/поврежденным"?

4b9b3361

Ответ 1

Оказывается, это проблема в базовой версии IE11 (11.0.9600.16428) для Windows 7 SP1.

После установки патча для обновления до 11.0.9600.16476 (версия обновления 11.0.2 - KB2898785) проблема будет решена. Ссылки на другие версии Windows (32-разрядные и т.д.) Можно найти в нижней части страницы загрузки патчей.

Ответ 2

Это не просто ошибка IE11.

Возможно, WEINRE вводится на страницу. Он перехватывает несколько системных функций, чтобы обеспечить функциональность инструментов разработчика, но IE11 интерпретирует присвоения свойствам localStorage и sessionStorage неправильно и преобразует перехватывает функции в строки, как если бы они были данными, которые будут храниться.

Там комментарий в репозитории apache/cordova-weinre, в котором говорится:

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

Похоже, что используется либо старая версия WEINRE, либо это изменение официально не выпущено (оно было там с 2013 года).