2017-07-17 12 views
0

を停止し、私は20枚の写真をプリロードしようとしています。私はこのコードを書いていますが、それが動作するかどうかはわかりません。彼らはピクセル化しませんが、それらは点滅し、遅れて、奇妙に見えます。私が間違っていることは何ですか?画像の多くのプリロード、プリロード画面

$(window).on("load", (function() { 
    PrepareImgs(); 
    console.debug('loaded'); 
})); 
var sectionArray = ["whoAreWe", "video", "web", "community", "charity"]; 
var imgArray = []; 
function PrepareImgs() { 
// console.debug("PrepareImgs started"); 
for (var i = 0; i < 5; i++) { 
    for (var j = 1; j <= 4; j++) { 
     var zdj = "Assets/Images/CroppedAndCleaned/" + sectionArray[i] + "/pp" + j + ".jpg"; 
     imgArray.push(zdj); 
    } 
} 
LoadImages(); 
} 

function LoadImages() { 
// console.debug("LoadImages started"); 
var i = 0; 
$(imgArray).each(function() { 
    // console.debug("loop started"); 
    var img = new Image(); 
    $(img).attr('src', imgArray[i]); 
    img.src=imgArray[i]; 
    console.debug(i); 
    // function preloadImage(url) 
    // { 
    //  var img=new Image(); 
    //  img.src=url; 
    // } 
    img.onload = function() { 
     console.debug("Internal loop started"); 
     i+=1; 

     if (i == $(imgArray).length) 
      HideLoader(); 
    } 
}); 
} 
function HideLoader() { 
// console.debug("HideLoader Started"); 
setTimeout(function() { 
    $('body').addClass('loaded'); 
}, 1); 
} 
+0

私は、主な問題は、あなたの 'onload'ハンドラ内にあると思います。明らかな2つの問題は、 'onload'が非同期であることです。各画像のロードイベントは、ロードにかかる時間に応じて異なる時間に起動します。おそらく、あなたが期待する順序ではないでしょう。 'i'へのインクリメントは外側スコープの 'i'に影響しないかもしれません。また、長さを取得するために 'imgArray'を' jQuery() 'に渡す必要はありません。つまり、おそらく '20'ではなく' 0'または '1'を返すでしょう。 –

+0

はい、それは常に0を返していて、混乱しています。イベントのロードが完了するまでループを停止する必要がありますか?それも可能ですか? – alex3wielki

答えて

0

は、イメージをロードし、一度、すべてのそれらのがロードされているDOMにそれらを追加し 、この例に従うようにしてください。

それはPromisesを使用しています。

function preloadImages(...images) { 
 

 
    return Promise 
 
    .all(
 
     images.map((src, i) => new Promise((resolve, reject) => { 
 
     src = `https://lorempixel.com/400/200/${src}/Image-Number-${i}`; 
 
     const img = $('<img />'); 
 

 
     return img 
 
      .attr('src', src) 
 
      .on('load',() => resolve(img)) 
 
      .on('error', reject) 
 
     })) 
 
    ) 
 
    ; 
 
}; 
 

 

 
preloadImages('sports', 'food', 'business', 'animals', 'nightlife', 'fashion') 
 
    .then(res => { 
 
    console.log('images loaded'); 
 
    
 
    return res.forEach($img => $img.appendTo('body')) 
 
    }) 
 
;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

あなたが.then(RES =>の部分を説明することはできますか? – alex3wielki

+0

[ 'Promise.prototype.then'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/その後、)約束が解決されたときに呼び出されるコールバックを受け入れます。 – Hitmands

+0

擬似コードのようにそれはありますか?私のIDEは、それは 'ES2015'は、あなたがそれのために良いサポートを持っている必要があります=> – alex3wielki

関連する問題