2012-01-18 7 views
2

CSSファイルまたはJSファイルを動的にインクルードするための小さな関数を記述しました。 jquery関数$.getScript()を使用してJSファイルを読み込みます。AJAX呼び出しが終了していない間にJS関数の実行を停止します。

私のAJAXコールが終了する前に私の関数が返ることを防ぎたいと思います。

私はこのような何かを試してみましたが、それは動作しません:

CAPTIVEA.resources._includeResource = function(resource) { 
    var ret = false; 

    if (CAPTIVEA.resources.isIncluded(resource)) 
    { // Resource already included => do nothing 
     console.log('CAPTIVEA.resources : "' + resource + '" is already included.'); 
     ret = true; 
    } 
    else 
    { // Resource not included => try to include it 
     var resType = CAPTIVEA.resources.getType(resource); 
     switch (resType) 
     { // Check resource type to know how to include it 
      case 'js': 
       $.when(
        $.getScript(resource, function(data, textStatus){ 
         console.info('CAPTIVEA.resources : "' + resource + '" dynamically loaded.'); //success 
        }) 
       ).done(function(){ 
        ret = true; 
       }); 
       break; 
      case 'css': 
       // Load CSS file ... 
       break; 
      default: 
       console.error('CAPTIVEA.resources : "' + resource + '" is not an includable resource.'); 
       break; 
     } 
    } 

    return ret; 
} 

答えて

5

それは続行する前に応答を待つように、あなたは$アヤックスを使用し、falseに非同期(async)を設定できます。

$.ajax({ 
    url: resource, 
    success: function(data, textStatus) { 
         console.info('CAPTIVEA.resources : "' + resource + '" dynamically loaded.'); //success 
    }, 
    dataType: 'script', 
    async: false 
}); 
+0

おかげで、私はこのオプションを知りませんでしたあなたは代わりにコールバックを使用する必要があります。 – Elorfin

+0

しかしこれは決して決して行うべきではありません。 Ifは、ユーザー入力のためにページ(および場合によってはブラウザー)をブロックするため、ユーザーエクスペリエンスが低下します。 – RoToRa

+0

@RoToRa私は同意します –

-1

これを試してみてください:

CAPTIVEA.resources._includeResource = function(resource) { 
    var ret = false; 

    if (CAPTIVEA.resources.isIncluded(resource)) 
    { // Resource already included => do nothing 
     console.log('CAPTIVEA.resources : "' + resource + '" is already included.'); 
     ret = true; 
    } 
    else 
    { // Resource not included => try to include it 
     var resType = CAPTIVEA.resources.getType(resource); 
     successFlag = false; 
     switch (resType) 
     { // Check resource type to know how to include it 
      case 'js': 
       jQuery.ajax({ 
        async:false, 
        type:'POST', 
        url: resource, 
        data: null, 
        success: function(){successFlag =true;} 
       }); 
       break; 
      case 'css': 
       // Load CSS file ... 
       break; 
      default: 
       console.error('CAPTIVEA.resources : "' + resource + '" is not an includable resource.'); 
       break; 
     } 
     ret = successFlag; 
    } 

    return ret; 
} 

は、私たちは(suコマンドをグローバル変数を追加するために持っているにもかかわらず、唯一の解決策として、それを参照してくださいccessFlag)。もう1つの解決策は、あなたの成功のコールバックに対して何をしなければならないかということですが、あなたの機能は期待通りに機能しません。

1

通常、同期呼び出しの必要はありません。 AJAXの全体のポイントは、それが非同期であることです。最初のは、の非同期を表します。

なぜあなたの機能が復帰しないようにする必要がありますか?通常は、ロード時にリソース(この場合はスクリプト)を使用したいからです。

WRONG:

$.getScript(resource); 
doSomethingWithResource(); 

RIGHT:

$.getScript(resource, function() { 
    doSomethingWithResource(); 
}); 
関連する問題