Szukam szybkiego i łatwego sposobu na wstępne załadowanie obrazów za pomocą JavaScript. Używam jQuery, jeśli to ważne.
Widziałem to tutaj ( http: //nettuts.com ... ):
function complexLoad(config, fileNames) {
for (var x = 0; x < fileNames.length; x++) {
$("<img>").attr({
id: fileNames[x],
src: config.imgDir + fileNames[x] + config.imgFormat,
title: "The " + fileNames[x] + " nebula"
}).appendTo("#" + config.imgContainer).css({ display: "none" });
}
};
Ale wygląda trochę przesadnie jak na to, czego chcę!
Wiem, że istnieją wtyczki jQuery, które to robią, ale wszystkie wydają się nieco duże (pod względem wielkości); Potrzebuję tylko szybkiego, łatwego i krótkiego sposobu wstępnego ładowania zdjęć!
$.each(arguments,function(){(new Image).src=this});
Odpowiedzi:
Szybko i łatwo:
Lub, jeśli chcesz mieć wtyczkę jQuery:
źródło
$('<img />')
po prostu tworzy element obrazu w pamięci (patrz link ). Wygląda na to,'$('<img src="' + this + '" />')
że faktycznie stworzyłby element w ukrytym DIV, ponieważ jest bardziej „skomplikowany”. Jednak nie sądzę, że jest to potrzebne w większości przeglądarek.$.preload(['img1.jpg', 'img2.jpg'])
?$(window).load(function(){/*preload here*/});
ponieważ w ten sposób wszystkie obrazy w dokumencie są ładowane jako pierwsze, prawdopodobnie są one najpierw potrzebne.load
zdarzenie przed ustawieniem zdarzenia na wypadek,src
gdyby obraz zakończył ładowanie przed ustawieniem zdarzenia ładowania?$('<img/>').load(function() { /* it's loaded! */ }).attr('src', this);
Oto poprawiona wersja pierwszej odpowiedzi, która faktycznie ładuje obrazy do DOM i domyślnie je ukrywa.
źródło
hide()
jest bardziej zwięzły niżcss('display', 'none')
.Użyj obiektu JavaScript Image .
Ta funkcja umożliwia wywołanie zwrotne po załadowaniu wszystkich zdjęć. Należy jednak pamiętać, że nigdy nie wyzwoli oddzwonienia, jeśli przynajmniej jeden zasób nie zostanie załadowany. Można to łatwo naprawić, implementując
onerror
wywołanie zwrotne i zwiększającloaded
wartość lub obsługując błąd.źródło
onload
zdarzenie, nawet jeśli obraz zostanie buforowany? (Ponieważimg.onload
jest zadeklarowany jako pierwszy). Tak pokazały moje testy.JP, po sprawdzeniu twojego rozwiązania nadal miałem problemy z Firefoksem, w którym nie ładowałoby zdjęć przed przejściem wraz z ładowaniem strony. Odkryłem to, umieszczając trochę
sleep(5)
w skrypcie po stronie serwera. Wdrożyłem następujące rozwiązanie oparte na twoim, które wydaje się rozwiązać ten problem.Zasadniczo dodałem wywołanie zwrotne do wtyczki wstępnego ładowania jQuery, aby była wywoływana po prawidłowym załadowaniu wszystkich obrazów.
Z mojego zainteresowania korzystam w następujący sposób:
Mam nadzieję, że pomoże to komuś, kto wejdzie na tę stronę z Google (tak jak ja), szukając rozwiązania w zakresie wstępnego ładowania zdjęć w połączeniach Ajax.
źródło
checklist = this.length
I w funkcji onload:checklist--
Następnie:if (checklist == 0) callback();
.attr({ src: this }).load(function() {...})
w.load(function() {...}).attr({ src: this })
przeciwnym razie będziesz mieć problemy z buforowaniem.Ten jednowierszowy kod jQuery tworzy (i ładuje) element DOM img, nie pokazując go:
źródło
Użycie jest dość proste:
http://jsfiddle.net/yckart/ACbTK/
źródło
Mam małą wtyczkę, która to obsługuje.
Nazywa się waitForImages i może obsługiwać
img
elementy lub dowolny element z odniesieniem do obrazu w CSS, npdiv { background: url(img.png) }
.Jeśli chcesz po prostu załadować wszystkie obrazy, w tym te, do których odwołuje się CSS, oto jak to zrobić :)
źródło
:visible
do niestandardowego selektora.load
zdarzenie zastosowane do obrazów: „nie działa konsekwentnie ani niezawodnie w różnych przeglądarkach”. Jak wtyczka poradziła sobie z tym?możesz załadować obrazy do swojego html gdzieś za pomocą
display:none;
reguły css , a następnie pokazać je w dowolnym momencie za pomocą js lub jquerynie używaj funkcji js lub jquery do wstępnego ładowania to tylko reguła css W porównaniu z wieloma wierszami js do wykonania
przykład: HTML
Css:
jQuery:
Wstępne ładowanie obrazów za pomocą jquery / javascript nie jest dobre, ponieważ obrazy ładują się na stronie w kilka milisekund + masz milisekundy na przeanalizowanie i wykonanie skryptu, zwłaszcza jeśli są to duże obrazy, więc ukrywanie ich w hml jest lepsze również ze względu na wydajność, ponieważ obraz jest naprawdę wstępnie załadowany bez widoczności, dopóki tego nie pokażesz!
źródło
Ten jQuery imageLoader plugin jest tylko 1.39kb
stosowanie:
istnieją również inne opcje, takie jak to, czy chcesz ładować obrazy synchronicznie, czy asychronicznie oraz kompletne zdarzenie dla każdego pojedynczego obrazu.
źródło
allcomplete
oddzwanianie jest wykonywane, gdy DOM jest gotowy. Jest całkiem spora szansa, że obrazy zakończą się ładować po tym, jak DOM jest gotowy, ale nie ma powodu, aby zakładać. Nie wiem, dlaczego uważasz, że wywołania zwrotne są magiczne i są wykonywane, gdy DOM jest gotowy ... czy możesz wyjaśnić, skąd to się bierze? To, że obrazy są załadowane, nie oznacza, że DOM jest gotowyNB to use this as an image preloader simply put your $(document).ready(function(){}); into your 'allcomplete' event : > simples!
... bezpośrednio zaleca to, co pokazuje ta odpowiedź.Szybkim, pozbawionym wtyczek sposobem na wstępne ładowanie obrazów w jQuery i uzyskanie funkcji wywołania zwrotnego jest utworzenie wielu
img
znaczników jednocześnie i policzenie odpowiedzi, np.Pamiętaj, że jeśli chcesz obsługiwać IE7, musisz użyć tej nieco mniej ładnej wersji (która działa również w innych przeglądarkach):
źródło
Dzięki za to! Chciałbym dodać trochę riffu do odpowiedzi JP - nie wiem, czy to komukolwiek pomoże, ale w ten sposób nie musisz tworzyć szeregu obrazów i możesz załadować wszystkie duże obrazy, jeśli nazwij swoje kciuki poprawnie. Jest to przydatne, ponieważ mam kogoś, kto pisze wszystkie strony w HTML, i zapewnia im o jeden krok mniej do zrobienia - eliminując potrzebę tworzenia tablicy obrazów i kolejny krok, w którym wszystko może się popsuć.
Zasadniczo dla każdego obrazu na stronie pobiera plik src każdego obrazu, jeśli spełnia określone kryteria (jest to kciuk lub obraz strony głównej), zmienia nazwę (ciąg podstawowy zamienia w obrazie src), a następnie ładuje obrazy .
W moim przypadku strona była pełna obrazów kciuka, wszystkie o nazwach podobnych do image_th.jpg, a wszystkie odpowiadające im duże obrazy są nazwane image_lg.jpg. Kciuk do dużego po prostu zamienia _th.jpg na _lg.jpg, a następnie wstępnie ładuje wszystkie duże obrazy.
Mam nadzieję, że to komuś pomoże.
źródło
źródło
Używam następującego kodu:
źródło
Korzystam z pliku manifestu, aby powiedzieć (nowoczesnym) przeglądarkom internetowym, aby ładowały również wszystkie odpowiednie obrazy i buforowały je. Użyj Grunt i mruk-manifest, aby zrobić to automatycznie i nigdy więcej nie martw się o skrypty ładowania wstępnego, unieważniające pamięć podręczną, CDN itp.
https://github.com/gunta/grunt-manifest
źródło
Działa to dla mnie nawet w IE9:
źródło
Chciałem to zrobić z niestandardową nakładką interfejsu API Map Google. Ich przykładowy kod po prostu używa JS do wstawiania elementów IMG, a pole symbolu zastępczego obrazu jest wyświetlane do momentu załadowania obrazu. Znalazłem tutaj odpowiedź, która zadziałała dla mnie: https://stackoverflow.com/a/10863680/2095698 .
Spowoduje to wstępne załadowanie obrazu, jak sugerowano wcześniej, a następnie użycie modułu obsługi do dołączenia obiektu img po załadowaniu adresu URL img. Dokumentacja jQuery ostrzega, że buforowane obrazy nie działają dobrze z tym kodem zdarzenia / obsługi, ale działa dla mnie w FireFox i Chrome i nie muszę się martwić o IE.
źródło
.attr('src',value)
nie.attr('src',this)
żeby to podkreślić :)
źródło
this
wewnątrz przekazywanego wywołania zwrotnego$.each
jest przypisywany do iterowanej wartości.$("div").each(function(i, el){ console.log(el == this);});
generuje wszystkietrue
s; Iteracja nad tablicą wydaje się zachowywać inaczej.5 linii w coffeescript
źródło
Dla tych, którzy znają trochę skryptów akcji, możesz przy minimalnym wysiłku sprawdzić Flash Playera i zrobić Flash Preloader, który możesz również wyeksportować do HTML5 / Javascript / Jquery. Aby użyć, jeśli Flash Player nie zostanie wykryty, sprawdź przykłady, jak to zrobić z rolą YouTube z powrotem do html5 player :) I stwórz własną. Nie mam szczegółów, ponieważ jeszcze nie zacząłem, jeśli nie zapomnę, opublikuję to później i wypróbuję jakiś własny kod Jquery do mojego.
źródło