このページは、元は“はてな”での質問(1157010937)から始まり、結果を複数対応化させたものを公開するものです。

経緯

  1. はてなの質問1157010937
  2. 最初の回答(複数script未対応)
  3. 複数対応化1
  4. 複数対応化2
  5. 複数対応化3
  6. 複数対応化4
  7. 複数対応化5(最終→このページ)
※このページには以前までの分(私の載せたコードについては)も含まれています。

完成品

2006/10/22(Version1.0)
ScriptLoaderクラス
外部スクリプトファイルをロードするクラス。HTMLだけでなく、HTA,WSHでも動作する。ページの読み込み完了前でも後でもロード可能。
WritingLoaderクラス
ScriptLoaderのサブクラス。HTML(HTA)のdocument.writeをロード中にラップして、外部JSのロード時に実行されたときの文字列をまとめて処理できる。(ロードはシーケンシャルに実行される)
ScriptNodeWriterクラス
指定されたノードのinnerHTMLに任意の文字列を書き込むクラス。そのとき書き込む文字列のscriptタグ(外部JSファイルのもの)を抽出し、外部JSファイルをロードして、そこでのdocument.writeの内容も追記する。

使用方法

  1. 事前に(headタグなどで)、ScriptLoader,WritingLoader,ScriptNodeWriterをこの順で読み込む。
  2. innerHTMLに文字列を代入されるノードを引数として、ScriptNodeWriterのインスタンスを作成する。
  3. 2のインスタンスのwriteメソッドを、タグ付きの文字列を引数として渡して実行する。
※3を何度も同じノードに対して行う場合、2を事前に行って同じインスタンスを使いまわすことができます。

使用例

(使用前)

function setTagString(str) {
  var node = document.getElementById("target");
  node.innerHTML = str;
}
(使用後)

<script type="text/javascript" src="ScriptLoader.js" charset="Shift_JIS"></script>
<script type="text/javascript" src="WritingLoader.js" charset="Shift_JIS"></script>
<script type="text/javascript" src="ScriptNodeWriter.js" charset="Shift_JIS"></script>

(中略)

function setTagString(str) {
  var node = document.getElementById("target");
  var obj = new ScriptNodeWriter(node);
  obj.write(str);
}
ちなみに、存在しない外部JSファイルをロードしようとしたときなどのタイムアウト秒数を任意の時間にすることができます。(デフォルトは3秒)

WritingLoader.timeout = 1;  // タイムアウトは1秒

サンプル

sample.htmlの中で、sample.jsをsrc属性に指定したscriptタグを含む文字列を書き込みます。
以上。
新しいJavaScriptの使い方