読み込み済みライブラリの判定

prototype.js でも MochiKit でも動くよ」と言いたい時には、こんな感じで。

/**
 * 読み込み済みライブラリに応じて処理を実行
 *
 * @param  object  param 適合オブジェクトと実行関数
 * @return string|boolean マッチしたオブジェクト名。どれもマッチしなければfalse
 */
function doAdapt(param)
{
    for (var node in param) {
        if (eval('typeof('+node+');') != 'undefined') {
            param[node]();
            return node;
        }
    }
    return false;
}

これをどっかで定義しておいて、

doAdapt({
    'MochiKit' : function(){ addLoadEvent(onloadAction); },
    'Prototype': function(){ Event.observe(window, 'load', onloadAction); }
});

こんな感じで呼び出す。MochiKitが読み込み済みならaddLoadEventが実行され、prototype.jsが読み込み済みならEvent.observeが実行されます。両方いける場合は上にある方が優先。

doAdaptの引数には、存在チェックするオブジェクト名と、そのオブジェクトが存在した時に実行する関数を対で指定します。サンプルではMochiKitとPrototypeを判定していますが、他のライブラリでもいいし、ぶっちゃけオブジェクトなら何でもあり。

function() { 〜 } で直接書いてもいいし、ライブラリ毎に実行する関数を用意しておいて、純粋なアダプタとして、

doAdapt({
    'MochiKit' : doMochiKit,
    'Prototype': doPrototype
});

てな感じで登録しておいても可。とりあえず、Win FirefoxとIE6で動作確認。ちょっとしたスクリプトのライブラリ依存を弱めるのに使えそう。