IE互換モード時にiFrame内のHTMLでX-UA-Compatibleを指定した場合のUserAgent


IEの互換モードにいじめられたので備忘

おまじない

IEの互換モードが有効な場合でも各バージョン最新のレンダリングをして欲しい時のおまじない

html
<meta http-equiv="X-UA-Compatible" content="IE=edge">

通常はこれで問題ないがiFrameの中に読み込まれる場合に注意が必要

iFrameの内側でX-UA-Compatibleを指定

out.html
<html>
<head>
<meta charset="UTF-8"> 
<title>互換モードの闇</title>
<script type="text/javascript">
window.onload = function(){
  document.getElementById('uavalue').innerText = navigator.userAgent;
}
</script>
</head>
<body>
  <div>UserAgent : <span id="uavalue"></span></div>
  <iframe src="in.html"></iframe>
</body>
</html>
in.html
<html>
<head>
<meta charset="UTF-8"> 
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>iFrameの内側</title>
<script type="text/javascript">
window.onload = function(){
  document.getElementById('uavalue').innerText = navigator.userAgent;
}
</script>
</head>
<body>
  <span>ieEdgePage</span>
  <div>UserAgent : <span id="uavalue"></span></div>
</body>
</html>

上記のようなhtmlをIE7〜11ぐらいの互換モードで開くと
out.htmlでは互換モードによってIE7っぽいUAが、
in.htmlでは各ブラウザのUAが表示される。
…と思いきやIE11ではIE8っぽいUAが表示される。

IE=Edgeが指定されているin.htmlもIE7っぽくレンダリングされるため、CSS3を利用した角丸ボタンは四角いボタンとなる。

つらいやつ

in.htmlでUAによってバージョン判定をして処理を振り分けたりするとつらいことになる場合がある。
例えばIE10以降はhtml5のaudio、IE10未満はWindowsMediaPlayerプラグインで再生…みたいなことをしていると、IE10で死ぬ。
IE10のUAはIE10っぽいのでjavascriptでaudioを作ろうとするが、レンダリングはIE7っぽいので落ちる。つらい。
IE11はなぜかIE8っぽいUAなのでWMP側に割り振られて救われる。ラッキー。
UAで判断せずにcreateElement('audio');したうえでcanPlayTypeで判断しましょう?

おまけ

IE11の開発者ツールで各バージョンをエミュレートしても、やっぱそれぞれのIEで見ないとだめです。
エミュレートのIE8では綺麗に表示されるしjsもちゃんと動くのに本物のIE8では崩れたりjsがエラーになることまれによくある。つらい。

結論

IE滅べ今なう💢