web-dev-qa-db-ja.com

Windows 7上のIE11で壊れたJavaScript localStorageオブジェクト

Internet Explorer 11(Windows 7ビルド)のlocalStorageオブジェクトには、期待どおりのネイティブ呼び出しではなく、特定の関数の文字列表現が含まれています。

これはVanilla JavaScriptでのみ壊れ、JSFiddleのようなサイトではこのコードに問題はありませんが、それを修正するlocalStorageポリフィルがあるためだと思います。

たとえば、次のHTMLページコードをご覧ください。

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

これは、IE11を除く、インストールされているすべてのブラウザーで完全に機能します。最初の行でエラーが発生しました 'SCRIPT5002:Function expected'。

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をサポートしていません。

localStorageオブジェクトが「壊れている/壊れている」と思われるWindows 7上のIE11で同じ問題を抱えている人はいますか?

44
BrutalDev

これは、Windows 7 SP1のIE11の基本バージョン(11.0.9600.16428)の問題であることがわかりました。

パッチのインストール で11.0.9600.16476(バージョン11.0.2の更新-KB2898785)に更新すると、問題は解決します。 Windowsの他のバージョン(32ビットなど)へのリンクは、 パッチダウンロードページ の下部にあります。

25
BrutalDev

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年から存在しています )。

4
sompylasar

LocalStorageが未定義で返されたので、理由がわからなかった-それがわかったまで(localStorageスクリプトで)HTMLページをコンピューターから直接実行していたため(file:/// C:/ Users/...)。代わりにserver/localhostからページにアクセスすると、localStorageが実際に定義され動作しました。

2
holm50