2011-05-18 6 views
1

this guyと同様の問題が発生しています。ただし、問題はスクリプトや画像ではありません。

私は$.getScript()$(window).load()の組み合わせを使用してJavaScriptを動的に読み込み、スクリプトの読み込みが完了すると読み込まれる関数を使用しています。

Chromeでうまくいきますが、Safariは常にonloadイベントを早くも起動させるようです。 Safariがすべてのスクリプトがdocument.body.offsetWidthブロックと同様に読み込まれるまで待つように強制する方法があるかどうか疑問に思っていました。私が理解したところから(そしてテストしたときに見た結果から)、スタイルとイメージがロードされるまではブロックdocument.body.offsetWidthがブロックされますが、明らかにスクリプトではありません。

編集:それはだと言わざるを得ないかもしれないが、はSafariで動作することがありますが、パターンが表示されません。スクリプトが完全にロードされ実行される前にイベントが発生し、関数がないために$(window).load()が渡されたハンドラーが失敗することがあります。

+0

なぜ '$ .getScript()'に 'success'ハンドラを使用できないのですか?これは、スクリプトの読み込みが終了すると実行されます。 –

+0

私は本当の質問はなぜあなたが動的に必要なスクリプトを読み込んでいるのかと思います。 –

+0

@Kevin Peno:スクリプトをロードするだけでなく、残りのスクリプトも必要です。読み込まれているスクリプトがいくつかあります。彼らは機能に応じて、それぞれ独自のスクリプトに分かれています。 – alexcoco

答えて

1

、特にそれらの周囲の依存関係、私はRequireJSのようなライブラリを使用します。これは、スクリプトとその依存関係をインポートするために必要なものを提供し、依存関係が満たされたときに関数とコードを呼び出すためのフックも提供します。

+0

ありがとう、私はNamespace.jsをある時点でも見ていました。私もこのことを見て、同僚と評価します。私ができるときに私はあなたに戻ってきます。 – alexcoco

+0

これはおそらく動作しますが、私は仕事でこれを承認することができるとは思いません。これまでのところ私が今までに遭遇した最高の解決策であるため、私はそれを正しいものとしてマークします。私は[LABjs](http://labjs.com/)も別のまともな解決策のように見えるので言及すべきである。ご協力いただきありがとうございます。 – alexcoco

0

準備が整いましたか?

$(document).ready(function() { 
    //code here 
}) 

私はそれを使用する際に一度も問題はありませんでした。最悪のシナリオでは、必要なコードを含む他のすべてのスクリプトタグの後にスクリプトタグをドロップできます。

+0

それは、 "準備ができている"メカニズムが動的に読み込まれたスクリプトを待つことを知らないという問題があるので、助けにならない、私は思いません。 – Pointy

+0

'$(document).ready()'はハンドラをDOMContentLoadedイベントにバインドするため、DOMは準備が整った後で、scripts/images/cssの準備が整う前に起動します。私の言ったように、私のコードは毎回失敗することなくChromeで動作します。 – alexcoco

0

この例では、ロードされたスクリプトに、関数にロードされたレポートを作成する必要があることを伝えます。必要なものがロードされると、必要なコードを実行します。あなたが作ったコメントに基づいて

// Simplified callback to check for all scrips loaded. 
var numDynScriptsReady = 0, 
    numDynScriptsNeeded = 4; 

function dynScriptsReady() 
{ 
    numDynScriptsReady++; 

    if(numDynScriptsLoaded == numDynScriptsNeeded) 
    { 
     // Run functions you need after loaded.... 
    } 
} 

// Example script get 
$.getScript("http://example.com/script.js", dynScriptsReady); 
// etc.... 
+0

これは面白いですが、これは、ハンドラを書く/別のインポートを追加するたびにスクリプトの数を数えなければならないことを意味します。主な問題は、非常に具体的なことを行うスクリプトを1つ作成し、そのスクリプトが自身の依存関係をインポートすることです。インポートされたスクリプト内にインポートがあり、それを数える必要があるときには複雑になります。 – alexcoco

+0

@alexcocoだから、それを展開してください。 '$ .data'を使って、特定の' script'の依存関係数をグローバル 'var'と同様に保存することができます。新しく追加されたスクリプト要素に対して '$ .bind'として関数を使用し、その' $ .getScript'の 'success'コールバックに対して' $ .trigger'を使用することができます。インターンとして、私はあなたがそれを理解することが楽しいと思うでしょう! –

+0

値を格納することはそれほど問題ではありません。問題は、インポートする必要があるスクリプトの数を知ることです。毎回それらを数えなければならない場合は、すべてを1つの大きなファイルに保存することもできます。 – alexcoco

関連する問題