LoginSignup
5
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-10-29

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滅べ今なう💢

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4