IE11 で使える機能と使えない機能
◆ IE11 はいろいろ使えるようで使えなかったり微妙なところ
今年のはじめくらいに IE は 11 以外がサポート切れたらしいです
Vista に限り IE9 がありますが 今時 Vista でかつ IE 使うような人はほぼいないでしょうし いないものとして扱います
一応あと 1 年です
IE11 は Windows7 から Windows10 まででサポートされて 2020年から2025年までサポート期間があるようです
OS のサポート切れということで 幅があります
IE11 に機能が増えていくならいいのですが 増えるわけもなく CSS などのバグが直るわけもないので IE 向けに作る人はまだまだ苦痛が続くわけです
私は ただで Chrome や Firefox などの新しい機能が使えるのに好みで IE を使い続ける人のサポートをする気はないので 基本的にどうでもいいです
ですが アプリやツール部分はともかく ブログなどのページの基本部分は一応動くようにしておこうかなと思います
ボタン押しても反応しない とかならともかく グチャグチャな表示で全く見れない状態はさすがに避けとこうかなくらいです
そんなわけで IE で動くのと動かないのを簡単にまとめます
気づけば増えていくと思います
CSS の calc は使えます
意外!
ES6 とは違う仕様
ほとんど一緒だけど entries などがなく constructor に配列入れて初期値を設定することもできません
WeakSet はないです
再定義できないとかブロックスコープとかかんたんに使ってみたところ ES6 と同じみたいです
ただし for-in で const が使えなかったり微妙に違いもあります
空白のページが必要なら about:blank が使えます
iframe の src なし状態は about:blank になっています
$0, $1, $2, $3, $4
$, $$
$_
dir
が使えます
$x, dirXml, clear, copy, debug, inspect, keys, values, getEventListeners, monitor, profile, table などはないです
chrome にないもので console.cd で URL がわかる
command line api で cd もある
動作が完全に一緒かは未確認です
最新の display: flex; の記法で ms プレフィックスも不要です
ただし 変な挙動も多いです
その要素が子孫のどこかにあるかチェックします
Promise がない みたいなエラーならそこだけ動かない程度なのでいいのですが 構文エラーになると 全く動かないので 「IEは非対応です」のメッセージ出そうにも表示する処理を実行できなくなります
URL のデータを json で持ってくるなどが凄く楽になるのですが使えません
ES ではなく HTML5 API とも違うみたい?
whatwg の HTML spec には載ってるけど立ち位置がよくわからない
URL オブジェクトが Math のように本当にただのオブジェクトで関数ではないです
そのせいで
また同じ IE でも location とは動きが違ってます
search や hash の動きだけが a タグのほう それ以外は location に合わせると chrome になります
href に http://a:b@sample.com などを入れると
セキュリティの問題が発生しました。
とエラーがでて href や pathname などどれも読み取れなくなります
username と password は存在しないプロパティなのでエラーなしで undefined を取得できます
また location に defineProperty でプロパティを定義しようとすると
このオブジェクトではサポートされていない操作です。
とエラーです
なので search や hash の動きを Chrome に合わせることはできないです
IE 10 で origin 追加する場合だと historyAPI でオリジンは変わらないはずなので location.origin に直接代入すればよかったですが 既存のものだと代入するとページの URL が変わってしまうので getter が作れないとできないです
ですが代わりに removeNode メソッドがあります
remove は Element.prototype.remove ですが
removeNode は HTMLElement.prototype.removeNode です
HTMLElement は Element を継承しているので実装箇所がひとつずれてます
Element で HTMLElement でないものなんてないかなと思いましたが XML パースしてみたらただの Element が取得できました
elem は Element のインスタンスです
あと document は Element を通しません
HTMLDocument → Document → Node
checkValidity などはあるのに reportValidity がありません
tbody の内側などの配置できる要素が限定されているところに設置すると勝手にタグの場所を変更されてしまう
URL 入力するところに data uri スキームを打ってもエラーページになります
window.EventTarget は存在せず addEventListener などは Node がもつメソッドになっています
まずこのプロパティが存在すると IE とわかります
プロパティの値が 11 だと IE11 です
9 だと IE9 で 8 だと IE8 という感じで IE のバージョンになっています
この値を使って IE バージョンによって分岐することができます
IE11 はサポートするけどそれ以外は知らないって場合はこんなコードを最初に実行しておくと良いかもです
Windows10 の MSEdge は IE 独自のプロパティはほとんど消えていて documentMode もありません
Vista に限り IE9 がありますが 今時 Vista でかつ IE 使うような人はほぼいないでしょうし いないものとして扱います
一応あと 1 年です
IE11 は Windows7 から Windows10 まででサポートされて 2020年から2025年までサポート期間があるようです
OS のサポート切れということで 幅があります
IE11 に機能が増えていくならいいのですが 増えるわけもなく CSS などのバグが直るわけもないので IE 向けに作る人はまだまだ苦痛が続くわけです
私は ただで Chrome や Firefox などの新しい機能が使えるのに好みで IE を使い続ける人のサポートをする気はないので 基本的にどうでもいいです
ですが アプリやツール部分はともかく ブログなどのページの基本部分は一応動くようにしておこうかなと思います
ボタン押しても反応しない とかならともかく グチャグチャな表示で全く見れない状態はさすがに避けとこうかなくらいです
そんなわけで IE で動くのと動かないのを簡単にまとめます
気づけば増えていくと思います
動く
calc
CSS の calc は使えます
意外!
Map, WeakMap, Set
ES6 とは違う仕様
ほとんど一緒だけど entries などがなく constructor に配列入れて初期値を設定することもできません
WeakSet はないです
const, let
再定義できないとかブロックスコープとかかんたんに使ってみたところ ES6 と同じみたいです
ただし for-in で const が使えなかったり微妙に違いもあります
about:blank
空白のページが必要なら about:blank が使えます
iframe の src なし状態は about:blank になっています
Command Line API
$0, $1, $2, $3, $4
$, $$
$_
dir
が使えます
$x, dirXml, clear, copy, debug, inspect, keys, values, getEventListeners, monitor, profile, table などはないです
debugger
Console API
基本的なものはひととおりchrome にないもので console.cd で URL がわかる
command line api で cd もある
location.origin
IE10 までは使えなかったですが 11 では使えますDOMParser
あるとたまに役立つやつですIndexedDB
意外にもありました動作が完全に一緒かは未確認です
Worker
Dedicated worker だけで SharedWorker や ServiceWorker はありませんhistory API
history.pushState や window.onpopstate や history.statewebStorage
localStorage や sessionStorageDocumentFragment
Canvas
ArrayBuffer
Uint8Array, Uint16Array, Uint32Array, Uint8ClampedArrayBlob
base64
atob, btoaflexbox
意外にも使えます最新の display: flex; の記法で ms プレフィックスも不要です
ただし 変な挙動も多いです
dataset
data-* 属性が使えますclassList
クラスの add/remove/toggle/containscontains
親方向の closest はないですが子方向の contains はありますその要素が子孫のどこかにあるかチェックします
hidden
hidden 属性をつけると display: none にできます動かない
ES6
コレが一番辛い部分ですが 仕方ないので IE でも動かしたいところでは 構文エラーになるアロー関数などは控える必要がありますPromise がない みたいなエラーならそこだけ動かない程度なのでいいのですが 構文エラーになると 全く動かないので 「IEは非対応です」のメッセージ出そうにも表示する処理を実行できなくなります
fetch
xhr に代わる物URL のデータを json で持ってくるなどが凄く楽になるのですが使えません
ES ではなく HTML5 API とも違うみたい?
whatwg の HTML spec には載ってるけど立ち位置がよくわからない
URL constructor
URL 関数に new が使えませんURL オブジェクトが Math のように本当にただのオブジェクトで関数ではないです
そのせいで
new URL("../index.html", "http://test.net/a/b/c.html")
のような URL の相対パス解決ができないですa タグのプロパティと location のプロパティの違い
存在しないものや動きが違うものがありますvar a = document.createElement("a")
a.href = "https://sample.com/a?b=c#"
を IE11 と Chrome で実行するとこうなりますa.href = "https://sample.com/a?b=c#"
| IE11 | Chrome | |
| href | "https://sample.com/a?b=c#" | "https://sample.com/a?b=c#d" |
| protocol | "https:" | "https:" |
| host | "sample.com:443" | "sample.com" |
| hostname | "sample.com" | "sample.com" |
| port | "443" | "" |
| origin | "undefined" | "https://sample.com" |
| pathname | "a" | "/a" |
| search | "?b=c" | "?b=c" |
| hash | "" | "" |
また同じ IE でも location とは動きが違ってます
- location では port は省略すると空文字です
- location では origin が使えます
- location では pathname は / から始まります
- location では search や hash は ? や # だけでも ? や # が表示されます
search や hash の動きだけが a タグのほう それ以外は location に合わせると chrome になります
a タグの username と password
また a.username, a.password は空文字でなく undefined ですhref に http://a:b@sample.com などを入れると
セキュリティの問題が発生しました。
とエラーがでて href や pathname などどれも読み取れなくなります
username と password は存在しないプロパティなのでエラーなしで undefined を取得できます
location
a タグのところに書いたように search と hash で ? や # だけのときに空文字にならず ? や # だけの文字列が取得されてしまいますまた location に defineProperty でプロパティを定義しようとすると
このオブジェクトではサポートされていない操作です。
とエラーです
なので search や hash の動きを Chrome に合わせることはできないです
IE 10 で origin 追加する場合だと historyAPI でオリジンは変わらないはずなので location.origin に直接代入すればよかったですが 既存のものだと代入するとページの URL が変わってしまうので getter が作れないとできないです
remove
要素の remove メソッドがありませんですが代わりに removeNode メソッドがあります
remove は Element.prototype.remove ですが
removeNode は HTMLElement.prototype.removeNode です
HTMLElement は Element を継承しているので実装箇所がひとつずれてます
Element で HTMLElement でないものなんてないかなと思いましたが XML パースしてみたらただの Element が取得できました
var elem = new DOMParser().parseFromString("<a></a>", "text/xml").firstChild
elem.remove // chrome でメソッドが存在する
elem.removeNode // IE11 でメソッドが存在しない
elem.remove // chrome でメソッドが存在する
elem.removeNode // IE11 でメソッドが存在しない
elem は Element のインスタンスです
あと document は Element を通しません
HTMLDocument → Document → Node
その他 DOM メソッド
closest, matches, append, prepend, after, before, replaceWithreportValidity
validity 関連ですcheckValidity などはあるのに reportValidity がありません
SVG animation
アニメーションありの SVG 画像は動かないですが表示はされますmain tag
template tag
template の特殊な動きをしないので js でどうにかするのも大変tbody の内側などの配置できる要素が限定されているところに設置すると勝手にタグの場所を変更されてしまう
Shadow DOM
Data URI Scheme
img タグへの埋め込みはできますがページとして表示できませんURL 入力するところに data uri スキームを打ってもエラーページになります
EventTarget
コンストラクタがありませんwindow.EventTarget は存在せず addEventListener などは Node がもつメソッドになっています
IE バージョンの見分け方
IE にのみあるプロパティdocument.documentMode
でバージョンがわかりますまずこのプロパティが存在すると IE とわかります
プロパティの値が 11 だと IE11 です
9 だと IE9 で 8 だと IE8 という感じで IE のバージョンになっています
この値を使って IE バージョンによって分岐することができます
IE11 はサポートするけどそれ以外は知らないって場合はこんなコードを最初に実行しておくと良いかもです
document.documentMode && document.documentMode < 11 && alert("お使いのブラウザは対象範囲外です")
Windows10 の MSEdge は IE 独自のプロパティはほとんど消えていて documentMode もありません