1

私の質問はこれに似ています。しかし、私はそこにある答えが不完全であり、質問は不確実ではないもので終わったと感じています...

ユーザーが自分のサイトに配置する Javascript アプリケーションを開発しています。私のアプリケーションを使用するために、Web ページの上部に 1 つの JavaScript インクルードを配置するだけで済みます。

私の JavaScript を実行するには jQuery が必要です。

ということで、目標は…

  1. jQuery が既にロードされているかどうかを確認します。
  2. jQuery がロードされていない場合はロードします。
  3. jQuery の実行が必要な JavaScript を実行します。

上記の 3 つをすべて同じスクリプト内で実行したいと考えています。

これが私が最初に試したものです...

function loa_j(){
 if (typeof jQuery === "undefined") {
 var newscript = document.createElement('script');
 newscript.type = 'text/javascript';
 newscript.async = true;
 newscript.src = 'http://code.jquery.com/jquery-latest.min.js';
 (document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(newscript);
 }
}

loa_j();
$(document).ready(function(){
//...Code That Never Fired
}

JavaScript が jQuery のロードを待たないため、これは機能しません。jQueryをロードしますが、十分に高速ではありません。

これが私の他の解決策です。これはうまくいきましたが、これが本当にこれを行うための最良の方法であるかどうか疑問に思っています...

function loa_j(){
if (typeof jQuery === "undefined") {
(function(a,b){function G(a){var b=F[a]={.... //Entire jQuery copy and pasted in :D
}
}

そのため、jQuery 全体をコピーしてその関数に貼り付けることで、コードは実際に機能します。

これは本当にこれを行うための最良の方法ですか?

4

4 に答える 4

1

次のように、動的にロードされるスクリプトに onload イベントを追加できます。

function loa_j(){
 if (typeof jQuery === "undefined") {
     var newscript = document.createElement('script');
     newscript.type = 'text/javascript';
     newscript.async = true;
     newscript.src = 'http://code.jquery.com/jquery-latest.min.js';
     newscript.onload = jqReady;  //<-- executed only after jquery is loaded
     (document.getElementsByTagName('head')[0]||document.getElementsByTagName('body'[0]).appendChild(newscript);
  }
}

function jqReady(){
    // your jquery code here 
}

loa_j();
于 2012-09-25T07:52:11.237 に答える
0

このように編集する

$(document).ready(function(){
loa_j();
//...Code That Never Fired
}
于 2012-09-25T06:13:16.627 に答える
0

この場合、タイマーを使用してライブラリの存在を確認してから、コードを実行する必要があります。このフィドルを参照してください:

http://jsfiddle.net/pFaJc/

var callback = function(){
    $(document).ready(function(){
         console.log('jquery');
    });        
}

if( typeof jQuery === 'undefined' ){
    var scr = document.createElement('script');
    scr.src = 'http://code.jquery.com/jquery-latest.min.js';
    document.getElementsByTagName('head')[0].appendChild(scr);

    var timer = setInterval(function(){
        if( typeof jQuery !== 'undefined' ){
            clearInterval(timer);
            callback();
        }        
    },100);
}​
于 2012-09-25T06:18:57.660 に答える
0

これを試すことができます。基本的にはjqueryがロードされるのを待ってから、関数を実行します。$(document).ready 関数に依存しているように見えるため、可能であれば、おそらく Jquery を静的にロードすることもお勧めします。しかし、それが不可能な場合は、これを試すか、yepnope.js や私のお気に入りの requirejs などの他のローダーを試すことができます。

http://jsfiddle.net/ytZRw/

于 2012-09-25T06:56:01.590 に答える