1

$.getScript を使用して JavaScript ファイルのモジュール ローダーを作成したいのですが、モジュールの関数呼び出しをドキュメント内に配置すると、スクリプトの読み込みが非同期になるため、モジュールが読み込まれる前に呼び出される可能性があります。モジュールが正常にロードされるまで関数呼び出しを保留にすることで、この状況を回避する方法はありますか?

フレームワーク.core.js:

var Framework = $.extend(Framework, Framework.Core = { 
    modules: [ 
        'Module1', 
        'Module2'
    ], 
    init: function () { 
        $.each(modules, function (index, value) {  
            $.getScript('framework.' + value.toLowerCase() + '.js', function () { 
            }); 
        }); 
    }   

}); 
Framework.Core.init();

サイト.html:

<html>
    <head>
        <script src="framework.core.js"></script>
        <script>Framework.Module1.functionCall();</script>  // Call a function independent of the completion of the framework.core.js loader
    </head>
... 
4

1 に答える 1

0

依存する関数をフックするには、成功のコールバックを開く必要があります。次の関数の実行を延期してモジュールを待機することはできないため ( を介してスクリプトを挿入しない限りdocument.write)、コールバックが必要です。最良の方法は、Deferredオブジェクト (ajax 関数によって返される) を公開することです。また、jQuery.getScript/キャッシュが妨げられるため、そのタスクには使用しないでください。

var Framework = $.extend(Framework, Framework.Core = {
// The "Core" property seems pretty useless, by the way ^^
    modules: [ 
        'Module1', 
        'Module2'
    ],
    loads: {},
    init: function () { 
        $.each(this.modules, function(index, value) {  
            this.loads[value] = $.ajax({
                url: 'framework.' + value.toLowerCase() + '.js',
                cache:true,
                dataType:"script"
            }); 
        }); 
    }   

}); 
Framework.init();

<html>
    <head>
        <script src="framework.core.js"></script>
        <script>Framework.loads.Module1.then(function() {
            functionCall();
        }); // Call a function as soon as the module is loaded
        </script>
    </head>
... 
于 2012-08-06T21:42:41.607 に答える