外部JSファイルのダイナミックロードクラス(1157010937)

とりあえず、
◆外部JSファイルのダイナミックロードクラス
└◆document.writeができるようにしたサブクラス
という継承構造のクラス2つで外部JSファイルのロード部分にしようかと思います。

スーパークラス側は汎用的にしておいて、サブクラスでdocument.writeに対応させることにしようかと思います。

このうち、スーパークラス側を作ってみました。
Gecko系ブラウザでは正しく動作しない可能性があります。2006/10/22で修正して(ここはそのまま)います。*1


/**
 * JavaScriptの外部ファイルをロードする。
 */
var ScriptLoader = (function() {
  
  /**
   * スクリプトファイル(1つ)のロードを実行する
   * @param fileUrl ファイル名
   * @param encoding ファイルの文字コード
   * @param type MIMEタイプ
   * @param lang スクリプト言語
   */
  function load(fileUrl, encoding, type, lang) {
    // documentがない(WSH?)→ActiveXで読み込んでeval
    if( (typeof document) == "undefined") {
      var reader = new ActiveXObject("ADODB.Stream");
      if(encoding && ( (typeof encoding) == "string") ) {
        switch(encoding.toLowerCase() ) {
          case "euc_jp":
          case "euc-jp":
          case "eucjp":
            encoding = "x-euc-jp";
            break;
          case "jis":
            encoding = "iso-2022-jp";
            break;
          default:
        }
        reader.charset = encoding;
      } else {
        reader.charset = "_autodetect";
      }
      reader.type = 2;  // このtypeはMIMEタイプではなく、バイナリ(1)かテキスト(2)かである。
      reader.Open();
      reader.LoadFromFile(fileUrl);
      var source = reader.ReadText();
      reader.Close();
      (function() {
        var load   = undefined;
        var reader = undefined;
        var source = undefined;
        var tag    = undefined;
        var tags   = undefined;
        var Class  = undefined;
        eval(arguments[0]);
      })(source);
    }
    // bodyがある(=読み込み後かも)→headに追加
    else if(document.body) {
      var tag = document.createElement("script");
      if(encoding && ( (typeof encoding) == "string") ) {
        tag.charset = encoding;
      }
      if(type && ( (typeof type) == "string") ) {
        tag.type = type;
      }
      if(lang && ( (typeof lang) == "language") ) {
        tag.language = lang;
      }
      tag.src = fileUrl;
      document.body.previousSibling.appendChild(tag);
    }
    // bodyがない(=head読み込み中)→直接書き込み
    else {
      var tags = '<script';
      if(encoding && ( (typeof encoding) == "string") ) {
        tags += ' charset="' + encoding + '"';
      }
      if(type && ( (typeof type) == "string") ) {
        tags += ' type="' + type + '"';
      }
      if(lang && ( (typeof lang) == "language") ) {
        tags += ' language="' + lang + '"';
      }
      tags += ' src="' + fileUrl + '">';
      tags += '</' + 'script>';
      document.writeln(tags);
    }
  }
  
  /**
   * スクリプトファイルのローダークラス
   * @param fileUrl ファイル名またはその配列
   * @param encoding ファイルの文字コード
   * @param type MIMEタイプ
   * @param lang スクリプト言語
   */
  function Class(fileUrl, encoding, type, lang) {
    
    if(!(this instanceof Class) ) {
      return new Class(fileUrl, encoding, type, lang);
    }
    
    this.load = function() {
      if( (typeof fileUrl) == "string") {
        load(fileUrl, encoding, type, lang);
      } else if(fileUrl instanceof Array) {
        for(var i = 0; i < fileUrl.length; i++) {
          if( (typeof fileUrl[i]) == "string") {
            load(fileUrl[i], encoding, type, lang);
          }
        }
      }
    };
    
    return this;
  }
  
  return Class;
})();

参考にしたサイト
以下の検索結果のうち一部(いろいろ)
http://www.google.co.jp/search?num=50&hl=ja&q=JavaScript+%E3%83%AD%E3%83%BC%E3%83%89&lr=
http://www.google.co.jp/search?hl=ja&q=ADODB.Stream&lr=

*1:2006/10/22追記