[JavaScript]動的ロード(遅延ロード)3 - suVeneのアレ

[JavaScript]動的ロード(遅延ロード)3

[][]
遅延ロードに関するまとめ。

外部 js をいくつかロードした後に実装したいコードを書く。
C でいう include、Java でいう import、Perl でいう use みたいなことがしたい。
んで、最速さんの wait 関数利用してこんな感じにした。

use.js

var USE;
(function() {

var LIB_PATH = './';

USE = {
/**
* synchronized import list
*/
use: function(importList, fn) {
var importInfo = importList.shift();
_import(importInfo[0], importInfo[1]);
wait(importInfo[0], function() {
if (importList.length == 0) {
// import compleated! (>_<
fn();
} else {
this.use(importList, fn);
}
});
}
}

/**
* checked import class
*/
function isDefined(className) {
try{
if (eval(className) == undefined) {
return false;
}
return true;
} catch(e) {
return false;
}
}

/**
* dynamic import
*/
function _import(className, libName) {
if (isDefined(className)) {
} else {
var fullpath = LIB_PATH + libName + '.js';
var s = document.createElement('script');
s.src = fullpath;
s.type = 'text/javascript';
s.charset = 'utf-8';
document.body.appendChild(s);
}
}

function wait(clazz, func, cnt) {
var check = 0;
var timerID;
cnt = (cnt || 100);
try {
eval("check = " + clazz);
} catch(e) {}
if (check) {
func();
} else {
cnt--;
var f = function(){ wait(clazz, func, cnt) };
if (cnt == 0) {
func();
} else {
timerID = setTimeout(f, 100);
}
}
}

})();

こんな感じの基本ライブラリ用意しといて、これだけHTML側にタグで読み込む。
使う側はこんな感じのコードを書く。

<script type="text/javascript" charset="utf-8">
// <![CDATA[
USE.use([['Builder', 'builder'],
['Effect', 'effects'],
['Droppables', 'dragdrop'],
['Autocompleter', 'controls'],
['Control.Slider', 'slider']],
function() {
alert('読み込み完了');
// do something...
})
// ]]>
</script>

bodyタグに append するから、window の onload() 処理してからじゃないとだめだから
その辺はイベントリスナしこんで適当にやればよい。

とりあえず use つかって リスト で import したい js ファイルを渡すと
上から順番に同期とって読み込み待ちしてくれる。

つーか、言語でサポートしてくれねぇかなw

* 関連記事
[JavaScript]動的ロード(遅延ロード)2

スポンサーリンク
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。