699 Stimmen

Vorladen von Bildern mit jQuery

Ich bin auf der Suche nach einem schnellen und einfachen Weg, um Bilder mit JavaScript vorzuladen. Ich bin mit jQuery, wenn das wichtig ist.

Ich habe dies 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ß, es gibt jQuery-Plugins, die dies tun, aber sie alle scheinen ein bisschen groß (in der Größe); Ich brauche nur eine schnelle, einfache und kurze Art und Weise der Preload-Bilder!

11 Stimmen

$.each(arguments,function(){(new Image).src=this});

979voto

James Punkte 106202

Schnell und einfach:

function preload(arrayOfImages) {
    $(arrayOfImages).each(function(){
        $('<img/>')[0].src = this;
        // Alternatively you could use:
        // (new Image()).src = this;
    });
}

// Usage:

preload([
    'img/imageName.jpg',
    'img/anotherOne.jpg',
    'img/blahblahblah.jpg'
]);

Oder, wenn Sie ein jQuery-Plugin benötigen:

$.fn.preload = function() {
    this.each(function(){
        $('<img/>')[0].src = this;
    });
}

// Usage:

$(['img1.jpg','img2.jpg','img3.jpg']).preload();

0 Stimmen

Wie kommt es, dass dieser Code bei mir nicht funktioniert? Funktioniert er auch bei anderen?

26 Stimmen

Muss das Bildelement nicht in das DOM eingefügt werden, damit der Browser es zwischenspeichert?

1 Stimmen

@JoshNaro Es lädt sie in das DOM bei $('<img />')

105voto

Dennis Rongo Punkte 4531

Hier ist eine optimierte Version der ersten Antwort, die tatsächlich lädt die Bilder in DOM und versteckt es standardmäßig.

function preload(arrayOfImages) {
    $(arrayOfImages).each(function () {
        $('<img />').attr('src',this).appendTo('body').css('display','none');
    });
}

39 Stimmen

hide() ist knapper als css('display', 'none') .

6 Stimmen

Welchen Vorteil hat es, sie in das DOM einzufügen?

0 Stimmen

Ich würde auch gerne wissen, welchen Vorteil das Einfügen in das DOM hat.

55voto

Gajus Punkte 61796

JavaScript verwenden Bild-Objekt .

Mit dieser Funktion können Sie beim Laden aller Bilder einen Rückruf auslösen. Beachten Sie jedoch, dass sie niemals einen Callback auslöst, wenn nicht mindestens eine Ressource geladen ist. Dies kann leicht behoben werden, indem man die Funktion onerror Rückruf und Inkrementierung loaded Wert oder die Behandlung des Fehlers.

var preloadPictures = function(pictureUrls, callback) {
    var i,
        j,
        loaded = 0;

    for (i = 0, j = pictureUrls.length; i < j; i++) {
        (function (img, src) {
            img.onload = function () {                               
                if (++loaded == pictureUrls.length && callback) {
                    callback();
                }
            };

            // Use the following callback methods to debug
            // in case of an unexpected behavior.
            img.onerror = function () {};
            img.onabort = function () {};

            img.src = src;
        } (new Image(), pictureUrls[i]));
    }
};

preloadPictures(['http://foo/picture.bar', 'http://foo/picture.bar', 'http://foo/picture.bar', 'http://foo/picture.bar'], function(){
    console.log('a');
});

preloadPictures(['http://foo/picture.bar', 'http://foo/picture.bar', 'http://foo/picture.bar', 'http://foo/picture.bar'], function(){
    console.log('b');
});

4 Stimmen

Tun Sie das Richtige und verwenden Sie JavaScript Image object. haben Sie beobachtet, dass die Menschen die falsch was in diesen Antworten?

0 Stimmen

Brillanter Code. Liege ich richtig in der Annahme, dass dies die onload Ereignis, auch wenn das Bild im Cache gespeichert ist (weil img.onload wird zuerst deklariert). Das haben meine Tests ergeben.

3 Stimmen

@alex Möglicherweise, ja. Wenn das Ziel ist, Pre-Load (die eine Reihenfolge der Leistung vorschlägt), dann würde ich es vorziehen, eine rohe JS-Option anstelle von jQuery abhängigen Optionen zu sehen.

35voto

Dave Punkte 3976

JP, nachdem ich Ihre Lösung überprüft hatte, hatte ich immer noch Probleme in Firefox, wo die Bilder nicht vorgeladen wurden, bevor die Seite geladen wurde. Ich entdeckte dies, indem ich einige sleep(5) in meinem serverseitigen Skript. Ich implementierte die folgende Lösung auf der Grundlage Ihrer, die scheint dies zu lösen.

Grundsätzlich habe ich einen Callback zu Ihrem jQuery Preload Plugin hinzugefügt, so dass es aufgerufen wird, nachdem alle Bilder ordnungsgemäß geladen sind.

// Helper function, used below.
// Usage: ['img1.jpg','img2.jpg'].remove('img1.jpg');
Array.prototype.remove = function(element) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] == element) { this.splice(i,1); }
  }
};

// Usage: $(['img1.jpg','img2.jpg']).preloadImages(function(){ ... });
// Callback function gets called after all images are preloaded
$.fn.preloadImages = function(callback) {
  checklist = this.toArray();
  this.each(function() {
    $('<img>').attr({ src: this }).load(function() {
      checklist.remove($(this).attr('src'));
      if (checklist.length == 0) { callback(); }
    });
  });
};

Interessehalber verwende ich dies in meinem Zusammenhang wie folgt:

$.post('/submit_stuff', { id: 123 }, function(response) {
  $([response.imgsrc1, response.imgsrc2]).preloadImages(function(){
    // Update page with response data
  });
});

Hoffentlich hilft das jemandem, der über Google auf diese Seite kommt (so wie ich) und nach einer Lösung für das Vorladen von Bildern bei Ajax-Aufrufen sucht.

2 Stimmen

Für diejenigen, die nicht daran interessiert sind, den Array.prototype durcheinander zu bringen, können Sie stattdessen tun: checklist = this.length Und in der Funktion onload: checklist-- Dann: if (checklist == 0) callback();

3 Stimmen

Alles wäre in Ordnung, aber das Hinzufügen neuer oder das Entfernen vorhandener Methoden zu einem Objekt, das Sie nicht besitzen, ist eine der schlimmsten Praktiken in JavaScript.

0 Stimmen

Schön und schnell, aber dieser Code wird nie den Callback auslösen, wenn eines der Bilder kaputt ist oder nicht geladen werden kann.

25voto

rkcell Punkte 458

Dieser einzeilige jQuery-Code erstellt (und lädt) ein DOM-Element img, ohne es anzuzeigen:

$('<img src="img/1.jpg"/>');

4 Stimmen

@huzzah - Sie sind vielleicht besser dran, wenn Sie nur Sprites verwenden. Weniger http-Anfragen :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X