「IE」タグアーカイブ

fetchやxhrを使った時にIEが勝手にキャッシュする問題を解決する

fetchやxhrを使って非同期通信をしているとIEでは勝手にキャッシュからデータを取得してサーバーにリクエストしないことがある。

そういう時はIf-Modified-Sinceヘッダーを追加してリクエストするとよい。

fetch('url', {
	defaultHeaders: {
		'If-Modified-Since': 'Thu, 01 Jun 1970 00:00:00 GMT'
	}
});
xhr.setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT');

If-Modified-Sinceは指定した日時より新しいファイルがサーバーに存在する場合のみ取得するという条件つきリクエストで、この例では、キャッシュを実質的に無効にしている。

以下はIf-Modified-Sinceヘッダーの書式だ


If-Modified-Since: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT

IEはよくわからないタイミングでキャッシュを利用するのでこのヘッダーは必須なように思われる。IEの寿命が尽きるまで・・・

【JavaScript】IEのためにa要素のdownload属性を代替する

a要素のdownload属性を使えばchromeなどのモダンブラウザではコンテンツをダウンロードできるわけだが、IEはそうはいかない。例えば、下の画像をダウンロードする時、IE以外のモダンブラウザではこのように書けばダウンロードされる。

var a = document.createElement('a');
a.href = '/img/1.jpg';
a.download = 'neko';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);

IEではダウンロードが実行されずにそのままページ遷移してしまうのがわかる。そこで今日は、代替方法を書く。

その方法とは、xhrでrequestを送り、blobで返してもらいそれをダウンロードするという方法だ。下がそのコードである。

var xhr = new XMLHttpRequest();
xhr.open('GET', '/img/1.png');
xhr.responseType = 'blob';

xhr.onloadend = function() {
	if(xhr.status !== 200) return;
	window.navigator.msSaveBlob(xhr.response, 'neko');
}
xhr.send();

IEにはnavigatorオブジェクトにmsSaveBlob(blob, fileName)というメソッドが用意されているようで、blobのダウンロードにはこれを使う。

もうすでにお気づきの方もいるかもしれないが、これは完全な代替方法にはなり得ない。なぜならxhrはクロスドメイン制限があるからだ。つまり、同一ドメインか、CORS(Cross-Origin Resource Sharing)に対応していないとダウンロードきない。そして、blobのやりとりはIE9以下は対応していない。しかし、使える機会はあると思うので、もしよかったら使ってほしい。

他にいい方法を知っているという方はぜひ教えてください><