2012-01-10 40 views
3

私は、別々に、またはペアとして、特別な順序で含まれることを意味するカップルウィジェットを作っています。私は、このスクリプトを使用して確認してくださいjQueryのがロードされて作ってるんだ:jQueryが含まれているか確認してください

if (typeof jQuery == 'undefined') { 
    //alert("about to load jquery"); 

    var esm_script_tag = document.createElement('script'); 
    esm_script_tag.setAttribute("type","text/javascript"); 
    esm_script_tag.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js") 
    esm_script_tag.onload = main; // Run main() once jQuery has loaded 

    esm_script_tag.onreadystatechange = function() { // Same thing but for IE 
     if (this.readyState == 'complete' || this.readyState == 'loaded') main(); 
    } 

    document.getElementsByTagName("head")[0].appendChild(es_script_tag); 

} 
else{ 

    main(); 
} 

1つのスクリプトではそれが機能main()を発射し、他のmain2()に。問題は、最初のスクリプトが実行されると、jQueryのインクルードが開始されることです。秒が実行されるとき、jQueryはまだロードされていませんが、関数main2()を起動するために再度ロードされません。

jQueryを組み込むより良い方法はありますか?私のウィジェットがjQueryが読み込まれている途中にあるかどうかを確認し、準備が整うまで保留する方法はありますか?

ありがとうございました。

+0

ドキュメントでこのテストを実行できたらどうなりますか? – DOK

+0

@DOKそれは重複しませんか? – Blazemonger

+0

しかし$(document).readyはjQueryがロードされるまで利用できません。 – emachine

答えて

1

もちろん、まず第三者ライブラリを使用して依存関係管理を行うことを検討する必要があります。しかし、生のコードを各ウィジェットに追加したいので、追加の事前参照がなくても生き残ることができます。これは確かにする必要があります

setTimeout(function() { 
     document.getElementsByTagName("head")[0].appendChild(esm_script_tag); 
    }, Math.floor(Math.random(500))); 

製品版では:http://jsfiddle.net/ayezutov/dvvKE/16/

次のコードは、スクリプトの読み込み遅延をエミュレートするためのタイムアウトを使用している:私はあなたが尋ねるしようと何のエミュレーションを作成しjsfiddleで

あなたのコードのように書かれています。

少しのリファクタリングの後、ローディングコードは1つの関数:http://jsfiddle.net/ayezutov/dvvKE/20/に移動されました。
スクリプト2からのjQueryをロード::
がメインスクリプト1の実行:1.5.2:メインスクリプト2の実行1.5.1
をあなたが気づくことができるよう、問題はまだ、残っている:スクリプト1から

ロードjQueryの

if (!window.__jQueryLoadedQueue) 
     window.__jQueryLoadedQueue = [loadCompleted]; 
    else 
    { 
     window.__jQueryLoadedQueue.push(loadCompleted); 
    } 

    var completeFunction = function(){ 
     for(var i = 0; i < window.__jQueryLoadedQueue.length; i++){ 
      window.__jQueryLoadedQueue[i](); 
     } 
     delete window.__jQueryLoadedQueue; 
    } 

次のステップは、jQueryの読み込みが始まった後に来たすべてのロード要求をキューに入れるだろうカスタムキューを作成することでした0

http://jsfiddle.net/ayezutov/dvvKE/23/)のように、スクリプトは一度だけ読み込みを開始し、completeの関数が呼び出されます。

+0

より文明化した年齢のための優雅な答えです。 - これを行う時間を割いてくれてありがとう。 – emachine

関連する問題