外部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追記