[JavaScript] IE11XHR時にInvalidStateError発生する問題対処

2 min read

IE11 でXMLHttpRequest()を使った JSON 取得ができなかった。

問題点

responseType を指定する順番

xhr.open("GET", "https://example.jp/rest-api/posts.json", true);
xhr.responseType = "json";
xhr.send();

responseType の設定は、open()の後に記述する。
モダンブラウザでは問題ないが、IE11 などではエラーとなる。

IE11 では responseType に JSON が指定できない

XMLHttpRequest - Web API インターフェイス | MDNを確認すると、IE11 ではresponseType = 'json'が未対応である事がわかる。

機能ChromeFirefox (Gecko)Internet ExplorerOperaSafari (WebKit)
responseType = 'arraybuffer'106.01011.6(有)
responseType = 'blob'196.01012(有)
responseType = 'document'1811.010未サポート6.1
responseType = 'json'3110.0未サポート12
未サポート 16
17
(有)

responseType = 'json'を指定しても、IE11 では response は、string型になっている。
解決方法としては、JSON 形式にパースしてやれば良いので、以下のように型をチェックして、パースすればモダンブラウザと同じ振る舞いが可能となる。

xhr.onreadystatechange = function () {
  if (this.readyState === 4 && this.status === 200) {
    var response = this.response;
    if (typeof response === "string") {
      resoinse = JSON.parse(response);
    }
    // ...
  }
};

条件は、IE11 を判定(navigator.userAgent.indexOf('Trident') !== -1)しても良いし、responseType を始めから text にしておいて response を問答無用で parse しても良い。

このページをシェアする

Related Articles

[ESLint] 特定のimportにおいてパスの末尾スラッシュを禁止する方法

背景 / やりたいこと / @typescript-eslint/no-restricted-imports を利用した / 余談(末尾のスラッシュ自体を禁止にする)

`<input type="range">`のstepを可変にする方法

仕様 / 完成デモ / 実装 / 参考

[Vite] CSSだけをビルドする方法

背景 / Vite をインストール / 仕様

CSS in JSとは何か

想定読者 / そもそも JS フレームワーク(React、Vue.js)を採用する理由とは何か / 「命令的 UI」 と 「宣言的 UI」 / 「命令的 UI」 VS 「宣言的 UI」 / CSS in JS とは / CSS in JS ライブラリ / Emotion の使い方 / 利用するメリット / 利用するデメリット / 関連 / Footnotes

[CSS in JS] 外部のリセットCSSを使う方法

目的 / 課題 / おまけ