2015-05-29 6 views
3

У меня есть около сотни простых изображений SVG, которые хранятся в пяти разных папках изображений. В настоящее время, когда они необходимы для отображения, они извлекаются прямо сейчас. Это, по большей части, работает, но иногда это вызывает мерцание, которое я бы хотел устранить. Есть ли способ предварительно загрузить эти изображения до того, когда они понадобятся, чтобы они были кэшированы? Я видел некоторые решения здесь, но в основном они занимаются небольшим количеством изображений. Есть ли предпочтительный способ предварительной загрузки?Предварительная загрузка изображений SVG

Спасибо!

+0

возможно дубликат [Предзагрузка изображений с JQuery] (http://stackoverflow.com/questions/476679/preloading-images-with-jquery) – bvdb

ответ

4

Если у вас есть все URL-адреса изображений, вы можете начать их кешировать как можно скорее в объекте JS с использованием URL-адреса, а позже просто вытащите их оттуда, когда они вам понадобятся.

На вашей странице у вас может быть список SVG-изображений, хранящихся где-то, но в конце вам нужен только массив строк JS.

Вот краткий пример:

// assuming you've gotten the urls from somewhere and put them in a JS array 
var urls = ['url_image_1.svg', 'url_image_2.svg', ... ]; 

var svgCache = {}; 

function loaded(){ 
    // just increment the counter if there are still images pending... 
    if(counter++ >= total){ 
    // this function will be called when everything is loaded 
    // e.g. you can set a flag to say "I've got all the images now" 
    alldone(); 
    } 
} 

var counter = 0; 
var total = urls.length; 

// This will load the images in parallel: 
// In most browsers you can have between 4 to 6 parallel requests 
// IE7/8 can only do 2 requests in parallel per time 
for(var i=0; i < total; i++){ 
    var img = new Image(); 
    // When done call the function "loaded" 
    img.onload = loaded; 
    // cache it 
    svgCache[urls[i]] = img; 
    img.src = urls[i]; 
} 

function alldone(){ 
    // from this point on you can use the cache to serve the images 
    ... 
    // say you want to load only the first image 
    showImage('url_image_1.svg', 'imageDivId'); 
} 

// basically every time you want to load a different image just use this function 
function showImage(url, id){ 
    // get the image referenced by the given url 
    var cached = svgCache[url]; 
    // and append it to the element with the given id 
    document.getElementById(id).appendChild(cached); 
} 

Примечание:

  • Рассмотрим также случай ошибки при загрузке изображения, так что положить обратного вызова также img.onerror и служить в случае какой-то " отсутствующее "изображение в качестве замены
  • Здесь есть еще несколько соображений, например, некоторые особенности браузера с SVG, но основное решение должно работать.
+0

Спасибо за очень подробный ответ! Как только они будут кэшированы, могу ли я сделать вызов для них, как раньше, и он просто вытащит его из кеша или мне нужно использовать массив svgCache? Извините за мое невежество! – jldavis76

+0

Я добавил функцию добавления изображения в DOM и как вызвать его в функции «alldone». – MarcoL

+0

Еще раз спасибо! Один последний вопрос ... где бы ты помирился, я положил этот сценарий? В заголовках тегов? – jldavis76

Смежные вопросы