JavaScript の動的ロードで(結果的に)Classic Mac を除外する

※ JSAN 使えというのはとりあえず忘れてください。7日の記事で触れます。

半年近く前の話題にやっと決着ついた。

JavaScript で外部ライブラリの load

  1. script 要素書き出し方式
  2. XMLHttpRequest

の二つの方法があると書いたけれども、結論から言うと MacIE はどっちも動きませんでした。

まず、XMLHttpRequest が動かないのはいいですね。これは当然。そんなオブジェクトは組み込まれていないし、ActiveX で使うこともできません。はい、一つ片付いた。では 1. の script 要素書き出し方式。

script 要素書き出し方式も厳密には

  • document.write()
  • DOM

の二つの方法があります1。しかし document.write() はいつでも使えるわけではありません。(やってみりゃすぐ分かります。)

そこで実際に使うのは DOM を操作するって方法になるわけです。まぁこれは誰が書いても大差ない、こういうコードになるはずです。(ならなかったらオレすっげー勘違いしてることに。)

function require( url ) {
  var script  = document.createElement( 'script' );
  script.type = 'text/javascript';
  script.src  = url;
  var head    = document.getElementsByTagName( 'head' )[0];
  head.appendChild( script );
}

これが MacIE では動きません。

しばらく悩みましたが、

script.src

に代入する処理が動きません。setAttribute だろうがなんだろうが動きません。値の取得はできるんですが、セットできない。

はい終了。src 指定できないんじゃ何もできない。ちなみに、よく調べてないけど iCab も動きませんでした。なんでかは知らない。まぁいずれにせよ分かったことは、

DOM による script 要素の書き出しを使ったスクリプトのロードは MacIE でも iCab でも動かない。XMLHttpRequest を使っても使わなくてもこれらのブラウザはこの段階で除外できる。

ということです。あとは require() 内の処理を丸ごと try - catch で囲んでやれば MacIE, iCab は華麗にスルーされてくれます。

  1. 例によって iframe は意図的に無視しています。 

More