[JavaScript] IE11でXHR時に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'
が未対応である事がわかる。
機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
responseType = 'arraybuffer' | 10 | 6.0 | 10 | 11.6 | (有) |
responseType = 'blob' | 19 | 6.0 | 10 | 12 | (有) |
responseType = 'document' | 18 | 11.0 | 10 | 未サポート | 6.1 |
responseType = 'json' | 31 | 10.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 しても良い。