2010-12-27 3 views
13

初めに私はjQueryのスクリプトのロードのために提供し、標準機能を使用して、私は多くの場合、AJAXを介して他のJavaScriptファイルをロードする必要があります。ajax呼び出しを使用して、別のディレクトリからスクリプトを同期的にロードするにはどうすればよいですか?

$.getScript('script_name.js',callback_function()); 

をしかし$ .getScriptが非同期であるので、これは(、うまくいきませんでした$ .ajaxのjQuery APIでは、デフォルトで 'async'がtrueに設定されています;トピックについては、$ .getScript:http://api.jquery.com/jQuery.getScript/のAPIのコメントで説明しています)。上記のリンクAPIのページのコメントで誰かによって提供されるようにだから私は、この関数を書いた:

load:function(script,callback){ 

    jQuery.ajax({ 

     async:false, 

     type:'GET', 

     url:script, 

     data:null, 

     success:callback, 

     dataType:'script' 

    }); 

}, 

これがうまく動作するように見えたので、私は続けましたが、私は最近、気づいたスクリプトについては、この唯一の作品で同じディレクトリ、例えば。 myObj.load( 'test.js')の呼び出しはうまく動作しますが、myObj.load( 'test/test.js')を呼び出すことはまったく機能しません。

私は明らかに何かが欠けているように感じますが、問題を見つけることはできませんでした。何か案が?

答えて

12

更新:以下のコメントストリームを参照してください.jQueryとは関係ありません。サーバー上のファイルアクセス権の問題です。


オリジナルの答え

ブラウザからすべてのエラーを取得していますか?たとえば、ChromeやSafariでは、Devツールを開いてConsoleタブを見ると、エラーが表示されますか?またはFirefoxでFirebugをインストールし、Firebugのコンソールにチェックインしてください。またはIEでは、VS.Netの無料版を使用してください...何かについて何か不平を言っているはずです。

またerror機能を提供ではなく、成功を仮定することによって、コード自体からより多くの情報を得ることができます。

jQuery.ajax({ 
    async:false, 
    type:'GET', 
    url:script, 
    data:null, 
    success:callback, 
    dataType:'script', 
    error: function(xhr, textStatus, errorThrown) { 
     // Look at the `textStatus` and/or `errorThrown` properties. 
    } 
}); 

更新:あなたはtextStatus =「エラー」とerrorThrown =未定義を参照してください言いました。非常に奇妙な。 同じスクリプトを移動してサブパスにない場合は動作しますか?サブパスが赤いニシンなのか疑問に思っています。実際の問題はスクリプトの構文エラーです。


オフトピック:それは本当には同期する必要がありますか?表示されるシンボルを投票することはできませんか?同期のAjaxリクエストが実際にゴミ箱になっているだけです。多くのブラウザでは、自分のページだけでなく、すべてページがリクエスト中にロックされます。ここで

は私がポーリングによって何を意味するかです:私は、JavaScriptから非同期的にjQueryをロードしたいとします

function loadScript(url, symbol, callback) { 
    var script, expire; 

    // Already there? 
    if (window[symbol]) { 
     setTimeout(function() { 
      callback('already loaded'); 
     }, 0); 
    } 

    // Determine when to give up 
    expire = new Date().getTime() + 20000; // 20 seconds 

    // Load the script 
    script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = url; 
    document.body.appendChild(script); 

    // Start looking for the symbol to appear, yielding as 
    // briefly as the browser will let us. 
    setTimeout(lookForSymbol, 0); 

    // Our symbol-checking function 
    function lookForSymbol() { 
     if (window[symbol]) { 
      // There's the symbol, we're done 
      callback('success'); 
     } 
     else if (new Date().getTime() > expire) { 
      // Timed out, tell the callback 
      callback('timeout'); 
     } 
     else { 
      // Schedule the next check 
      setTimeout(lookForSymbol, 100); 
     } 
    } 
} 

使用法:

// Load jQuery: 
loadScript("path/to/jquery.min.js", "jQuery", function(result) { 
    // Look at 'result' 
}); 
+0

誤差関数 - textStatusが「エラー」に設定し、errorThrownがあるさ:あなたは再び非同期呼び出しが必要な場合は、ただでそれを有効に

$.ajaxSetup({async:false}); $.getScript('script_name.js', callback_function); 

未定義。 – Alex

+1

@Alex:確かに非常に奇妙です。ところで、私は巨大なオフトピックのコメントを追加しました。 :-)あなたの実際の問題を再現しますか?同じスクリプト**は、サブパスにないように移動すると動作しますか?サブパスが赤いニシンなのか疑問に思っています。実際の問題はスクリプトの構文エラーです。 –

+0

Firebugが助けてくれました。403エラーのためリクエストが失敗しました!私は私のUbuntuにインストールされているローカルサーバー上にいる、私はこれを解決する方法を知らない? 私は、読み込まれたスクリプトと、$ .getScript(script_url、function_from_the_loaded_script())で関数を実行したいと思います。それはうまくいかなかった。 – Alex

16

あなたはAjaxがajaxSetupを使用して、デフォルトで同期する呼び出しを設定することができます。これは、それがどのように見えるかです:助けにはならなかった

$.ajaxSetup({async:true}); 
+0

これはうまくいきません... – Raghav

+6

私はAJAXモードを同期に設定しますが、重要です。コールバック関数 'callback_function()'を渡す場合は、大括弧を省略してください。それ以外の場合は、関数の戻り値が渡され、 'callback_function'が* getScript()の前に実行されます – DerVO

+2

' $ .ajaxSetup'を使用することはお勧めできません - https://api.jquery.com/jquery.ajaxsetup/を参照してください。 ajax呼び出しの 'async'属性のデフォルトを変更することは良い考えではありません。 '$ .ajax({url:url、dataType:" script "、async:true})' - 私のために働きます。 –