2013-04-14 25 views

Odpowiedz

20
var img = new Image(), 
    url = "myimg.jpg", 
    container = document.getElementById("holder-div"); 

img.onload = function() { container.appendChild(img); }; 
img.src = url; 

Byłoby rozpocząć ładowanie obrazu, jak tylko poprosić go w skrypt, i kiedy zdjęcie zostało zrobione ładowania, to chwycić i dodać do niej obraz.

Istnieje wiele innych sposobów na zrobienie tego ...
To jest po prostu nieżywy przykład asynchronicznego ładowania pojedynczego obrazu.

Ale morał jest taki:
Dla asynchroniczne ładowanie do pracy, albo załadować go w JavaScript i użyj onload lub zawierać znacznik obrazu na stronie, bez atrybutu src (określić width i height w HTML) i wrócić w pewnym momencie, w JS, i ustawić adres URL obrazu.

+1

Następnie zrobiłem ' 'Przed głównie css/js. Ładuje tylko plik obrazu jeden raz. Następnie można ustawić obraz normalnie, jako bg przez css lub w inny sposób. Rzadko pojawia się ładowanie/częściowo, ale czasem się zdarza. – Iacchus

+0

Atrybut 'async' @iacchus nie działa dla wbudowanych znaczników' script' (bez 'src'). –

1

Możesz przeczytać więcej o atrybucie LazyLoad:

<img src="myimage.jpg" alt="some description" lazyload/> - with default values 

można też priorytety:

<img src="myimage.jpg" alt="some description" lazyload="1"/> 
<img src="myimage.jpg" alt="some description" lazyload="2"/> 
+0

"Ta specyfikacja nie jest już utrzymywana i została porzucona." http://www.w3.org/TR/resource-priorities/ –

+0

Nieobsługiwane z wyjątkiem IE11 +. Zobacz tutaj: http://caniuse.com/#search=lazyload – oriadam

2

Podczas @ przykładem Norguard jest dość proste i łatwe wystarczających dla obrazu lub dwa, znalazłem echo.js całkiem poręczny dla leniwego ładowania, https://github.com/toddmotto/echo.

Wykonuje leniwne ładowanie obrazów z atrybutami danych * i zawiera także inne przydatne elementy.

<img data-echo="img/photo.jpg"> 
<script src="dist/echo.js"></script> 
<script> 
    echo.init(); 
</script> 
3

Jeśli używasz jQuery, zrobiłem coś proste, ale skuteczne, na przykład:

HTML

<div data-lazy-load-image="/Images/image-name.png" data-image-classname="pop-in"></div> 

JavaScript

$(function() { 
    $("[data-lazy-load-image]").each(function (index, element) { 
     var img = new Image(); 
     img.src = $(element).data("lazy-load-image"); 
     if (typeof $(element).data("image-classname" !== "undefined")) 
      img.className = $(element).data("image-classname"); 
     $(element).append(img); 
    }); 
}); 

CSS

@-webkit-keyframes pop-in { 
    0% { opacity: 0; -webkit-transform: scale(0.5); } 
    100% { opacity: 1; -webkit-transform: scale(1); } 
} 
@-moz-keyframes pop-in { 
    0% { opacity: 0; -moz-transform: scale(0.5); } 
    100% { opacity: 1; -moz-transform: scale(1); } 
} 
@keyframes pop-in { 
    0% { opacity: 0; transform: scale(0.5); } 
    100% { opacity: 1; transform: scale(1); } 
} 

Można by rozszerzyć tak, aby zawierały dodatkowe opcjonalne atrybuty dla każdego obrazu, ale masz pomysł.

To będzie czekać, aż DOM będzie gotowy, a następnie dynamicznie (asynchronicznie) załaduj obrazy do elementu, który zaznaczysz za pomocą atrybutu data-lazy-load-image. Dołączyłem CSS, aby obrazy były "wczytywane" po ich załadowaniu.

14

Sposób na asynchroniczne ładowanie (leniwe obciążenie) polega na tym, że nie ustawia się atrybutu "src", a następnie wykonuje skrypt, który ładuje obrazy po uruchomieniu DOM-ready.

<img data-src='http://www.amazingjokes.com/images/20140902-amazingjokes-title.png' class='lazyload'> 

oraz w skryptach:

$(window).load(function(){ 
     $('.lazyload').each(function(){ 
      //* set the img src from data-src 
      $(this).attr('src', $(this).attr('data-src')); 
     }); 
    }); 

ten wykorzystuje jQuery, nie trzeba jednak, można to zrobić w JavaScript, a także poprzez umieszczenie „onload” w swoim ciele i leniwy załaduj tam zawartość.

+2

dlaczego to się dzieje bez komentarza? Kod działa jak urok i daje OP rozwiązanie, w jaki sposób może leniwym załadować jego zawartość ... – patrick