順番の必要なタイプのファイルについては注意が必要ですが、以下のようにすれば、
遅延ロードのように、.jsファイルから.jsファイルを読み込むことができます。
まずは、<script></script> を作る必要がありますので、
var script = document.createElement('script');
とします。
次に、scriptの種類を決めます。
といっても、最近のブラウザは自動で判定してくれるほど高性能なので必要はありませんが、
一応書いておくと良いでしょう。
script.type = 'text/javascript';
その次は、scriptのurlの指定です。
<script src="../../../main.js"></script>
のように、scriptにはurlを指定する必要があります。
ですから、
script.src = 読みこみたいファイルのurl;
とします。ここでは、仮に ../js/main.js としましょう。
まとめると以下のようになります。
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = '../js/main.js';
これで読み込めます。
しかしこれでは一般性に欠けるので、関数化します。
function loadScript(url) {
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
};
これでokです。
ただしこれでは順番には読み込まれません。
というのも、
loadScript('../js/main.js');
loadScript('../js/sub1.js');
loadScript('../js/sub2.js');
というように複数のファイルを読みこむ際、
何らかの影響で読み込み順番がずれてしまうことがあります。
そこで、callbackを使って読みこめるようにします。
script.onload = function() {
//... callback
};
ただしこれはIEには対応していません。
そこで、IEにも対応するように処理を切り替えてやります。
if ( script.readyState ) {
//... IEの処理
} else {
//... IE以外の処理
};
IEについて、読み込み後に他ファイルの読み込みをしたいので、
IEの読み込み後のイベントを見ますが、やはりIEです。
イベントがめちゃくちゃな発生をしています(発生したりしなかったり…)。
そこでIEのある2つのイベントをいじってこれに対応させます。
script.readyState === 'loaded'
script.readyState === 'complete'
この2つのうちいずれか一つ、または両方のイベントが発生していれば、
callbackを実装できます。
if ( script.readyState === 'loaded'
|| script.readyState === 'complete' ) {
callback();
};
しかしこれでは前ファイルの読み込み後に行われる確信がありません。
というのも、いくつもreadystatechangeが発生すると、
その順番に読みこまれるとは限らないからです。
そこで、1ファイル読み込み時はreadystatechangeを消すという策を取ります。
if ( script.readyState === 'loaded'
|| script.readyState === 'complete' ) {
script.onreadystatechange = null;
callback();
};
これでおkです。
あとは以上をまとめて、
function loadScript(url, callback) {
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
if ( script.readyState ) {
script.onreadystatechange = function() {
if ( script.readyState === 'loaded' || script.readyState === 'complete' ) {
script.onreadystatechange = null;
callback();
};
};
} else {
script.onload = function() {
callback();
};
};
document.getElementsByTagName('head')[0].appendChild(script);
};
としましょう。
ああ、document.getElementsByTagName('head')[0].appendChild(script);
これを忘れないようにしましょう。
これは、<head></head>に<script></script>要素を付け加えるためのもので、
これがないと読みこめません。
なお使い方ですが、このように拡張することで、
loadScript('main.js', function() {
loadScript('sub1.js', function() {
//... 他処理
})
});
というように遅延ロード+他処理ができます。
#追記
申し訳ありません。いくつか訂正をさせて頂きました。
最後のcallbackを使った読み込みに関して、
loadScript('main.js', function() {
//...callback
});
loadScript('sub1.js', function() {
//...callback
});
とするのは、遅延ロードを実装した意味がなくなりますのでご注意ください。
もちろんファイルを読みこむごとに…というのは可能ですが、
ファイルごとに読みこみ順番がある場合、例えばライブラリ使用時などは、
注意が必要です、ということです。
というのも、順番が反転することがあるからです。
#追記2
質問者様の追記を読みました。
上記説明に加えて、ロードしたファイルの変数の使用ですが、
callback内で使用することができます。
例えば sub.js の variable という変数を main.js 内で複数使う際には、
loadScript('sub.js', function() {
console.log(variable);
//...variableに関する処理
});
とすればよいです。