2016-03-01 2 views
0

Это не дублирующий вопрос. Я работаю над загрузкой изображений после полной загрузки страницы. Я хочу передать переменную i значение функции onload img, но как-то это не работает.Передать функцию в Javascript

var imgs = document.getElementsByTagName('img'); 
var totalImages = imgs.length; 
for(var i=0; i<totalImages; i++) 
{ 
    if(imgs[i].hasAttribute('data-src')) 
    { 
     var img = new Image(); 
     img.onload = function() 
     { 
      imgs[x].src = imgs[x].getAttribute('data-src'); 
      imgs[x].setAttribute('srcLoaded','true'); 
      //where x is i value from for loop 
     }; 
     img.src = imgs[i].getAttribute('data-src'); 
    } 
} 

Я попытался следующим OnLoad функции

img.onload = (function(x) 
{ 
    imgs[x].src = imgs[x].getAttribute('data-src'); 
    imgs[x].setAttribute('srcLoaded','true'); 
    //where x is i value from for loop 
})(i); 

, но таким образом, я увидел, что функция выполняется немедленно, даже изображение не полностью загружено, может быть потому, что это как-то работает, как анонимные функции.

Я также попытался установив атрибут моего img объекта и получить его значение внутри функции, как этот

img.setAttribute('idi',i); 
img.onload = function() 
{ 
    var x = img.getAttribute('idi'); 
    imgs[x].src = imgs[x].getAttribute('data-src'); 
    imgs[x].setAttribute('srcLoaded','true'); 
    //where x is i value from for loop 
}; 

но это не работает, как хорошо. Как передать значение переменной i моей функции onload?

+0

IIFE должен возвращать функцию, подобную 'img.onload = (function (x) { return function() { imgs [x] .src = imgs [x] .getAttribute ('data-src'); imgs [ x] .setAttribute ('srcLoaded', 'true'); // где x is i значение from for loop } }) (i); ' –

+0

Но он все еще является onl y одна функция, так как она перезаписывается на каждой итерации. –

+0

@ArunPJohny Я уже упоминал, что ваш предложенный способ не работает. –

ответ

1

Вы можете bind переменные на функции обратного вызова:

var imgs = document.getElementsByTagName('img'); 
var totalImages = imgs.length; 
for (var i = 0; i < totalImages; i++) { 
    if (imgs[i].hasAttribute('data-src')) { 
     var img = new Image(); 
     img.onload = (function (x) { 
      imgs[x].src = imgs[x].getAttribute('data-src'); 
      imgs[x].setAttribute('srcLoaded', 'true'); 
      //where x is i value from for loop 
     }).bind(img, i); 
     img.src = imgs[i].getAttribute('data-src'); 
    } 
} 
+0

У меня есть около 250 изображений на моей странице, и когда я запускаю ваш предложенный способ, он останавливается и висит какое-то время, которое вызывает нехорошее впечатление. –

+0

Можете ли вы показать пример jsfiddle? Я уверен, задержка, вызванная этим кодом. – Adam

+0

@AbdulJabbarWebBestow Я прокомментировал строку. Плз попробуй вот так. – Adam

0

Вызвать функцию, когда страница инициализируется один раз, и пусть это будет сделано.

Вместо того, чтобы вызывать нагрузку на свои изображения в 250 раз (замедление вашей страницы, в соответствии с вашим ответом на ответ Адама, что противоположно тому, что вы хотите), возможно, посмотрите, что у вас есть в учебнике.

Re изобретать колесо, но после этого учебника дает вам простой и прямым способ сделать это https://varvy.com/pagespeed/defer-images.html (и, похоже, что ваш код может быть получен из него)

Надеется, что это помогает

+0

Я уже прочитал эту статью. Что делать, если я хочу показать изображение по умолчанию, пока не загрузится фактическое изображение? –

+0

В статье показано следующее: img src = "data: image/png; base64, R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs =" data-src = "your-image-here" Данные: image/png - это изображение по умолчанию в src = (который является заполнителем), пока код не обработает data-src, вы можете изменить его на все, что хотите. – zerohero

+0

данные: image/png можно установить с помощью CSS, так что вы можете по умолчанию все изображения на странице использовать CSS один раз (меньший размер) и запустить JS, как только страница будет загружена полностью. – zerohero

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