スキップしてメイン コンテンツに移動

Ajax対応ブラウザの下限は?外部Scriptの動的ロードを調べた

「os0x.blog / 外部JavaScriptの動的ロード」へのリンクを追記。(2024/04/05)

「os0x.blog / Opera9.2から9.5でのJavaScript周りの変更点」へのリンクを追記。(2024/04/04)

iframe からライブラリのコード文字列を親フレームに渡して、親フレームで eval 等でライブラリを有効化すれば、下で言及している「iframe のリロードでメモリをリフレッシュするテクニック」とバッティングしませんね。(2024/02/26)

iframe を使ったスクリプトの動的ロードは JSONP に留めて、ponyfill は document.write で追加するのが良いと思います。iframe でライブラリを含むコードを実行してしまうと iframe のリロードでメモリをリフレッシュするテクニックが(多分)使えない為です。参考記事に追加しました。(2022/11/13)

iframe の中で行う動的ロードの調査結果を追記。これにより Ajax 対応ブラウザに Gecko 0.6~0.9 が加わりました。タイトルに「Ajax 対応ブラウザの下限は?」を追加しました。検索向け説明を追記しました。(2022/11/05)

RegExp の ponyfill の動的ロードを最初期の DHTML ブラウザ(Opera 7.5x 以下、Gecko 0.9未満)で行ってみたところ、これより後のブラウザと異なったので、テストページを書いて、表に纏めました。この調査を元に書いたのが ExternalScriptLoader.js です。

調査結果の概要

動的 Script のテスト」ページ

文書を読み込み中の document.write でしか外部スクリプトを追加できないブラウザ(~Opera 7.1x, ~Gecko 0.9)を特定しました。

これ以外のブラウザで一般的な手段をサポートしないものには、iframe 内を contentWindow.document.write() で書き換えて外部スクリプトを追加できるもの(Gecko ~0.9)、<script> を再利用するパターンだけサポートするブラウザ(Opera 7.2x)がありました。

これらのブラウザは document.createElement('script') が動作するブラウザと同様に追加のタイミングを調整できます。

動的な外部スクリプトの追加ができる、ということは JSONP が可能です。XMLHttpRequest をサポートしていなくても Ajax が出来る、Ajax 対応ブラウザである、ということです。

モバイル Opera 8.5 を搭載するニンテンドーDSブラウザーは XHR をサポートしないが Ajax 対応と紹介されていたようです。

一部の記事で Ajax 対応と紹介されたことがあったが、狭義の Ajax で基幹技術とする XMLHttpRequest は実装されていない。

調査結果

テストページの実行結果が次です。

ブラウザ動的外部スクリプト動的インラインスクリプト
1. .createElement('script')2. .src の変更3. iframe4-1. .createTextNode4-2. .innerHTML4-3. .innerText4-4. .textContent4-5. .text4-6. &nbsp; ハック
IE5(Windows 2000)YesYes?ErrorErrorErrorNoYesError
IE5.5(Windows XP, IE Tester)YesYes?ErrorErrorErrorNoYesYes
IE6, 7(Windows XP, IE Tester)YesYes?ErrorErrorErrorNoYesNo
Safari 3.1.2(Windows 2000), 3.2.3(Windows XP)YesNo?YesNoYesYesYesNo
Opera 7.03, 7.11(Windows XP)NoNoNoNoNoNoNoNoNo
Opera 7.20, 7.23(Windows XP)NoYesYesYesNoYesNoNoNo
Opera 7.54u2(Windows XP)YesYesYesYesNoYesNoYesNo
Opera 8.02(Windows XP)YesYes?YesYesYesNoYesYes
Gecko 0.6, 0.7, 0.8, 0.9(Windows XP or 2000)NoNoYesNoNoNoNoNoNo
Gecko 0.9.1~0.9.9(Windows XP or 2000)YesNo?YesNoNoNoYesYes

動的インラインスクリプトの調査結果も含みますが、スクリプトで組み立てたコード文字列を eval(source)new Function(source), execScript() で実行できるので、いまいち使いどころが分かりません。HTMLElement を作って文書ツリーに追加する分、メモリを浪費するだけのように思います。

参照した記事

公開日記事タイトル
2004?Dynamically Loading JS Files
2006/11/07script要素のtextプロパティ textプロパティのあるDOM要素, 読取専用のinnerHTML要素を紹介。
2006/12/07innerHTMLでscriptする
2007/03/06script要素のdefer属性の実装 あとIEはscript要素にdefer属性をつけるとinnerHTMLに代入したscriptが実行されるという仕様がある。
2007/06/05Operaでも非同期リクエストが並列処理できる img-JSONP 本件、未実装!
2007/10/11JavaScriptを動的に書き出す
2008/07/28Opera9.2から9.5でのJavaScript周りの変更点 JSONPが非同期リクエストに修正
2008/08/27外部JavaScriptの動的ロード
2009/01/28JSONPのエラーを判断する 本件、未実装!
2010/05/28JavaScriptによって動的に script要素を追加する場合のブラウザごとの挙動の違い
2013/02/19Internet ExplorerでJavaScriptの動的実行
2017/01/07iframe 要素内に動的に script 要素を出力すると Internet Explorer が応答なしになる場合がある

先行する調査、2004年の Web アーカイブより

Each of the links below attempts to load a .js file dynamically via the method that is named in the link text.

If you click a link and get an alert, then that method worked. If you get no alert, that method does not work :(

Browser Platform Change Source Change InnerHTML Create Element Load It In A Layer
IE4.0 Windows Untested Untested Untested No
IE5.0 Windows Yes No Yes No
IE5.5 Windows Yes No Yes No
IE6.0 Windows Yes No Yes No
Opera 6.06 Windows No No No No
Opera 7.23 Windows Yes No No No
K-Meleon 0.8.2 Windows No No Yes No
Mozilla 1.5 Windows No No Yes No
Mozilla 1.6 Windows No No Yes No
Firebird 0.7 Windows No No Yes No
Netscape 4.72 Windows No No No No
Netscape 4.77 Windows No No No Yes
Netscape 4.80 Windows No No No Yes
Netscape 6.2.3 Windows No Yes Yes No
Netscape 7.1 rev 1.4 Windows No No Yes No
IE5 MAC Yes Reports an Error Reports an Error Untested
IE5.2 MAC No Yes No No
Safari MAC No No No No
Netscape 7.1 MAC No No Yes No
iCab 2.9.7 MAC No No No No
Mozilla 1.4 Linux No No Yes No
Galeon 1.3.8 Linux No No Yes No
Konqueror 3.1.4 Linux No No No No

Notes:

Windows:
Netscape 7.1: Hangs the loading status bar at 100%
Why is NS7.1 resizing my buttons?
Mozilla 1.5: Hangs the loading status bar at 100%
Opera 7.1: Spoof mode made no difference
MAC: