2013-08-08 23 views
20

たとえば、ゲームを作成しているとします。私は、すべてのアセットをロードし、アセットがロードされている間にプログレスバーをユーザに提示するという小さなスクリプトを持っています。<script>のダウンロードの進捗状況を取得するにはどうすればよいですか?

このような資産の1つは、ゲームロジックを含む比較的大きなスクリプトです。おそらく3MB以上です。

2番目のスクリプトの読み込みの進行状況をユーザーに表示するにはどうすればよいですか?

+0

[requirejsスクリプトの進捗状況](http://stackoverflow.com/questions/15581563/requirejs-load-script-progress)( "RequrieJsはDOMに新しいスクリプトタグを作成してモジュールをロードし、 * ") – apsillers

+0

これはブラウザーのことであり、プログラマーとしてのコントロールではありません。ブラウザがJSファイルの読み込みと "コンパイル"を完了したときにのみアクセスできます。私が見ることができる唯一の方法は、複数の小さなファイルを使用してそれらの間でロジックを分割することです。 –

答えて

27

<script>タグのみ火災loaderrorイベント;彼らはprogressイベントを起動しません。しかし、現代のブラウザでは、Ajax requests do support progress eventsです。あなたのスクリプトの内容をロードするとAjaxによる進行状況を監視して、負荷が完了したときに新しい<script>要素にスクリプトの内容を置くことができます。

var req = new XMLHttpRequest(); 

// report progress events 
req.addEventListener("progress", function(event) { 
    if (event.lengthComputable) { 
     var percentComplete = event.loaded/event.total; 
     // ... 
    } else { 
     // Unable to compute progress information since the total size is unknown 
    } 
}, false); 

// load responseText into a new script element 
req.addEventListener("load", function(event) { 
    var e = event.target; 
    var s = document.createElement("script"); 
    s.innerHTML = e.responseText; 
    // or: s[s.innerText!=undefined?"innerText":"textContent"] = e.responseText 
    document.documentElement.appendChild(s); 

    s.addEventListener("load", function() { 
     // this runs after the new script has been executed... 
    }); 
}, false); 

req.open("GET", "foo.js"); 
req.send(); 

アヤックスprogressをサポートしていない古いブラウザの場合は、あなたがあなたのを構築することができます進捗報告UIを使用して、最初のprogressイベントの後にローディングバーを表示します(そうでなければ、progressイベントが発生しない場合は一般的なスピナーを表示します)。

1

あなたはそれがAJAXのダウンロードのステータスを確認することですHow to show loading status in percentage for ajax response?

を見ているのが好きかもしれません。スクリプトをロードするので、ファイルを取得する最善の方法ではないかもしれませんが、それは動作する可能性があります。次に、ajax呼び出しで受け取ったコンテンツをどこかに置く必要があり、evalはお勧めできません。

+4

これは 'eval'のための受け入れ可能なユースケースのようです。あなたはそれを推薦しないという実際の理由がありますか、それともちょっと言っていますか? – andrewrk

+1

'eval'はこのようなことをするために作られました。 'eval'が推奨されていない唯一の時は、それが必要でないか、大きなセキュリティリスクです。これがセキュリティ上のリスクになる可能性がある唯一の方法は、man-in-the-middle攻撃か、侵入されたサーバーです。どちらも、evalよりも大きなリスクをもたらします。 – h2ooooooo

+0

あなたが本当に必要な場合を除き、私はいつもevalを使わないように言われました...そうかもしれません。 requireJSと同じように、スクリプトタグの注入もできますか?evalを使用しない理由が必要ですか? – Salketer

関連する問題