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
кажется "сломанным/поврежденным"?
Ответы
Ответ 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 года).