2012-03-20 20 views
1

私は、Javascriptを使用して一連のマップイメージ用の単純なアニメーションビューアを作成しようとしています。私が最初にこの読み込みに失敗したイメージ配列からイメージを削除またはスキップするには?

while(datetime <= endDatetime) 
{ 
    var fname = getImgFnameFromDate(datetime); 
    var imgAdd = new Image(); 
    imgAdd.src = fname; 
    imgStore.push(imgAdd); 
    datetime.setMinutes(datetime.getMinutes() + 15); 
} 

し、各画像間の短い待ち時間でそれらをループ状グローバル配列に画像を読み込みます。

ここで、マップはほぼリアルタイムで作成され、時には一部が欠落することがあります。ファイルが読み込まれず、代わりにアニメーションの途中で壊れたリンクイメージが表示されます。私は単純に、読み飛ばされなかった画像をスキップしたいのですが、その画像をスキップしたり、配列から取り除いたりしています。

私は

function iter() 
{   
    ++imgIndex; 
    if (loopFlag) imgIndex = imgIndex % imgStore.length; 
    document.getElementById("map").src=imgStore[imgIndex].src; 
    if (imgStore[imgIndex].width == 0) iter(); 
} 

のようなものは、しかし、これは信頼性が低いと、多くの場合、イメージがあったの前にトリガするために表示される無限ループにつながるすなわち「isLoaded」のプロキシとしてイメージwidth属性を使用して試してみましたロードするチャンス。

私は画像のonError関数を指定しようとしましたが、その関数が何をすべきか分かりません。私は本当にイベントではなく、何らかのisLoaded属性が必要です。多分、私はこれについて間違った方法をとっていますか?あなたはそれをロードする際に、画像オブジェクトにフラグを設定し、後でそのフラグをテストすることができます

答えて

1

if (imgStore[imgIndex].myLoadFlag) { 
    // image has been loaded 
} 
を:

var fname = getImgFnameFromDate(datetime); 
var imgAdd = new Image(); 
imgAdd.onload = function() { 
    this.myLoadFlag = true; 
} 
imgAdd.src = fname; 
imgStore.push(imgAdd); 

を次に他の場所で、あなたがイメージがまだロードされているかどうかを確認することができます

onloadハンドラを使用するときは、.srcプロパティを設定する前に設定することを忘れないでください。画像がブラウザのキャッシュに既に存在する場合、onloadイベントを見逃す場合があります。


代替アプローチ(使用する多分簡単には)のみロードされた画像が含まれており、メインコードのみということに使用する二番目の配列を持っているだろう:そして、imgStoreを使用してコードを

// place we first put images, they go into imgStore only when actually loaded 
var imgPending = []; 

var fname = getImgFnameFromDate(datetime); 
var imgAdd = new Image(); 
imgAdd.onload = function() { 
    imgStore.push(imgAdd); // now that it's loaded, add it to the images we're using 
} 
imgAdd.src = fname; 
imgPending.push(imgAdd); 

を実際に読み込まれた画像のみが表示されます。これの欠点の1つは、画像がロード順にimgStoreに入っていることです。必ずしも要求した順序である必要はなく、この方法では古い方法とは異なる可能性があります。

+0

ありがとうございます。しかし、まだ問題があるようです。提案したonload()ビヘイビアを使用してイメージ配列を作成した後、myLoadFlag = trueでないイメージをスキップしてイメージをループします。残念ながら、すべての画像をスキップします。画像がロードされる(またはそのようなことが起こる)前に、このチェックが開始されるように見えます。 .srcの前にonload()を設定していることを確認しました。これとは対照的に、すべてのイメージを表示するだけで、このフラグの値をスクリーンに出力すると、すべてが正しいように見えます。欠落した画像は未定義であり、良好な画像は真である。 – Bogdanovist

+0

だから、少しチャンスが与えられると画像が読み込まれるように思われますが、提案されたソリューションを使用すると、画像が読み込まれなかったと誤って判断してしまう可能性があります。私は本当に、ブラウザがそのように感じるたびに起こっているのではなく、イメージが読み込めるように強制するのが本当に好きですか? – Bogdanovist

+0

@ user1282133 - 必要に応じて後でJSを介して読み込むのではなく、ページが最初に読み込まれるときにjavascriptでイメージをプリロードすることができます。これにより、必要な前に読み込む時間が長くなります。それらをより速くロードさせる方法はありません。彼らはロードに時間がかかります。参考までに、このコードは画像が読み込まれていないと誤って判断しません。彼らはまだロードされていないときにあなたに指示します。準備が整う前にロードされることを期待しているだけです。プリロードスキームを使用しない限り、コードをロードするまでWAITする必要があります。 – jfriend00

関連する問題