Ich suche nach einer schnellen und einfachen Möglichkeit, Bilder mit JavaScript vorzuladen. Ich benutze jQuery, wenn das wichtig ist.
Ich habe das hier gesehen ( 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" });
}
};
Aber es sieht ein bisschen übertrieben aus für das, was ich will!
Ich weiß, dass es jQuery-Plugins gibt, die dies tun, aber sie scheinen alle etwas groß (in der Größe) zu sein. Ich brauche nur eine schnelle, einfache und kurze Möglichkeit, Bilder vorzuladen!
$.each(arguments,function(){(new Image).src=this});
Antworten:
Schnell und einfach:
Oder wenn Sie ein jQuery-Plugin möchten:
quelle
$('<img />')
nur ein Bildelement im Speicher erstellt (siehe Link ). Es sieht so aus, als'$('<img src="' + this + '" />')
würde das Element tatsächlich in einem versteckten DIV erstellt, da es "komplizierter" ist. Ich glaube jedoch nicht, dass dies für die meisten Browser erforderlich ist.$.preload(['img1.jpg', 'img2.jpg'])
?$(window).load(function(){/*preload here*/});
da auf diese Weise alle Bilder im Dokument zuerst geladen werden und sie wahrscheinlich zuerst benötigt werden.load
Ereignis vor dem Festlegen des Ereignisses festzulegen,src
nur für den Fall, dass das Laden des Bildes abgeschlossen ist, bevor das Ladeereignis festgelegt wird.$('<img/>').load(function() { /* it's loaded! */ }).attr('src', this);
Hier ist eine optimierte Version der ersten Antwort, die die Bilder tatsächlich in DOM lädt und standardmäßig ausblendet.
quelle
hide()
ist knapper alscss('display', 'none')
.Verwenden Sie ein JavaScript- Bildobjekt .
Mit dieser Funktion können Sie beim Laden aller Bilder einen Rückruf auslösen. Beachten Sie jedoch, dass niemals ein Rückruf ausgelöst wird, wenn mindestens eine Ressource nicht geladen ist. Dies kann leicht behoben werden, indem ein
onerror
Rückruf implementiert und derloaded
Wert erhöht oder der Fehler behandelt wird.quelle
onload
wenn ich denke, dass dies das Ereignis auslöst, selbst wenn das Bild zwischengespeichert wird? (Weilimg.onload
zuerst deklariert wird). Das haben meine Tests gezeigt.JP: Nachdem ich Ihre Lösung überprüft hatte, hatte ich immer noch Probleme in Firefox, bei denen die Bilder nicht vor dem Laden der Seite vorgeladen wurden. Ich habe dies entdeckt, indem ich einige
sleep(5)
in mein serverseitiges Skript eingefügt habe. Ich habe die folgende Lösung basierend auf Ihrer implementiert, die dies zu lösen scheint.Grundsätzlich habe ich Ihrem jQuery-Preload-Plugin einen Rückruf hinzugefügt, damit es aufgerufen wird, nachdem alle Bilder ordnungsgemäß geladen wurden.
Aus Interesse verwende ich dies in meinem Kontext wie folgt:
Hoffentlich hilft dies jemandem, der (wie ich) von Google auf diese Seite kommt, nach einer Lösung für das Vorladen von Bildern bei Ajax-Anrufen zu suchen.
quelle
checklist = this.length
Und in der Onload-Funktion:checklist--
Dann:if (checklist == 0) callback();
.attr({ src: this }).load(function() {...})
sollte.load(function() {...}).attr({ src: this })
sonst sein, werden Sie Caching-Probleme haben.Dieser einzeilige jQuery-Code erstellt (und lädt) ein DOM-Element img, ohne es anzuzeigen:
quelle
Die Verwendung ist recht einfach:
http://jsfiddle.net/yckart/ACbTK/
quelle
Ich habe ein kleines Plugin, das das erledigt.
Es heißt waitForImages und kann
img
Elemente oder jedes Element mit einem Verweis auf ein Bild im CSS verarbeiten, zdiv { background: url(img.png) }
.Wenn Sie einfach alle Bilder laden möchten, einschließlich derjenigen, auf die im CSS verwiesen wird, gehen Sie wie folgt vor :)
quelle
:visible
der benutzerdefinierten Auswahl hinzu.load
Ereignis, wenn es auf Bilder angewendet wird, "nicht konsistent oder zuverlässig browserübergreifend funktioniert". Wie hat das Plugin das geschafft?Sie können Bilder mithilfe der CSS-
display:none;
Regel irgendwo in Ihr HTML laden und sie dann mit js oder jquery anzeigen, wenn Sie möchtenVerwenden Sie keine js- oder jquery-Funktionen zum Vorladen. Dies ist nur eine CSS-Regel. Es müssen viele Zeilen von js ausgeführt werden
Beispiel: HTML
CSS:
jQuery:
Das Vorladen von Bildern mit jquery / javascript ist nicht gut, da das Laden von Bildern auf Seite + einige Millisekunden dauert. Sie haben Millisekunden Zeit, um das Skript zu analysieren und auszuführen. Dies gilt insbesondere dann, wenn es sich um große Bilder handelt. Denn das Bild ist wirklich vorinstalliert, ohne überhaupt sichtbar zu sein, bis Sie das zeigen!
quelle
Dieses jquery imageLoader- Plugin ist nur 1,39 KB groß
Verwendungszweck:
Es gibt auch andere Optionen, z. B. ob Sie die Bilder synchron oder asychron laden möchten, und ein vollständiges Ereignis für jedes einzelne Bild.
quelle
allcomplete
Rückruf ausgeführt wird, nachdem das DOM bereit ist. Es besteht eine ziemlich gute Chance, dass die Bilder nach dem Fertigstellen des DOM vollständig geladen werden, aber es gibt keinen Grund anzunehmen. Ich weiß nicht, warum Sie Rückrufe für magisch halten und ausgeführt werden, nachdem das DOM fertig ist. Können Sie erklären, woher Sie das haben? Nur weil die Bilder geladen sind, heißt das nicht, dass das DOM bereit istNB to use this as an image preloader simply put your $(document).ready(function(){}); into your 'allcomplete' event : > simples!
... es wird direkt empfohlen, was diese Antwort zeigt.Eine schnelle, Plugin-freie Möglichkeit, Bilder in jQuery vorzuladen und eine Rückruffunktion zu erhalten, besteht darin, mehrere
img
Tags gleichzeitig zu erstellen und die Antworten zu zählen, zBeachten Sie, dass Sie, wenn Sie IE7 unterstützen möchten, diese etwas weniger hübsche Version verwenden müssen (die auch in anderen Browsern funktioniert):
quelle
Danke dafür! Ich würde gerne ein kleines Riff zur Antwort des JP hinzufügen - ich weiß nicht, ob dies jemandem helfen wird, aber auf diese Weise müssen Sie keine Reihe von Bildern erstellen, und Sie können alle Ihre großen Bilder vorab laden, wenn Sie dies tun Benennen Sie Ihre Daumen richtig. Dies ist praktisch, weil ich jemanden habe, der alle Seiten in HTML schreibt, und es stellt sicher, dass sie einen Schritt weniger tun müssen - das Erstellen des Bildarrays entfällt und ein weiterer Schritt, bei dem Dinge durcheinander geraten könnten.
Grundsätzlich erfasst es für jedes Bild auf der Seite den Quellcode jedes Bildes. Wenn es bestimmten Kriterien entspricht (ist ein Daumen oder ein Bild auf der Startseite), ändert es den Namen (eine grundlegende Zeichenfolge, die im Bild-Quellcode ersetzt wird) und lädt dann die Bilder .
In meinem Fall war die Seite voller Daumenbilder mit dem Namen image_th.jpg, und alle entsprechenden großen Bilder haben den Namen image_lg.jpg. Der zu große Daumen ersetzt nur das _th.jpg durch _lg.jpg und lädt dann alle großen Bilder vor.
Hoffe das hilft jemandem.
quelle
quelle
Ich benutze den folgenden Code:
quelle
Ich würde eine Manifest-Datei verwenden, um (modernen) Webbrowsern mitzuteilen, dass sie auch alle relevanten Bilder laden und zwischenspeichern sollen. Verwenden Sie Grunt und Grunt-Manifest, um dies automatisch zu tun, und sorgen Sie sich nie wieder um Preload-Skripte, Cache-Invalidatoren, CDN usw.
https://github.com/gunta/grunt-manifest
quelle
Das funktioniert bei mir sogar in IE9:
quelle
Ich wollte dies mit einem benutzerdefinierten Overlay der Google Maps-API tun. Ihr Beispielcode verwendet einfach JS, um IMG-Elemente einzufügen, und das Bildplatzhalterfeld wird angezeigt, bis das Bild geladen wird. Ich habe hier eine Antwort gefunden, die für mich funktioniert hat: https://stackoverflow.com/a/10863680/2095698 .
Dadurch wird ein Bild wie zuvor vorgeschlagen vorgeladen und anschließend mit dem Handler das img-Objekt angehängt, nachdem die img-URL geladen wurde. Die Dokumentation von jQuery warnt davor, dass zwischengespeicherte Bilder mit diesem Eventing- / Handler-Code nicht gut funktionieren, aber es funktioniert für mich in FireFox und Chrome, und ich muss mir keine Sorgen um den Internet Explorer machen.
quelle
.attr('src',value)
nicht.attr('src',this)
nur um darauf hinzuweisen :)
quelle
this
innerhalb des Rückrufs, an den übergeben wird,$.each
wird dem Wert zugewiesen, der iteriert wird.$("div").each(function(i, el){ console.log(el == this);});
Erzeugt zum Beispiel alletrue
s; Die Iteration über das Array scheint sich anders zu verhalten.5 Zeilen in Coffeescript
quelle
Für diejenigen, die ein wenig ActionScript kennen, können Sie mit minimalem Aufwand nach Flash Player suchen und einen Flash Preloader erstellen, den Sie auch nach HTML5 / Javascript / Jquery exportieren können. Um zu verwenden, ob der Flash-Player nicht erkannt wird, überprüfen Sie Beispiele, wie dies mit der YouTube-Rolle zurück zum HTML5-Player gemacht wird :) Und erstellen Sie Ihren eigenen. Ich habe keine Details, da ich noch nicht angefangen habe. Wenn ich es nicht vergessen habe, werde ich es später veröffentlichen und werde einen Standard-JQuery-Code für meinen ausprobieren.
quelle