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});

24voto

yckart Punkte 29968
$.fn.preload = function (callback) {
  var length = this.length;
  var iterator = 0;

  return this.each(function () {
    var self = this;
    var tmp = new Image();

    if (callback) tmp.onload = function () {
      callback.call(self, 100 * ++iterator / length, iterator === length);
    };

    tmp.src = this.src;
  });
};

Die Verwendung ist recht einfach:

$('img').preload(function(perc, done) {
  console.log(this, perc, done);
});

http://jsfiddle.net/yckart/ACbTK/

0 Stimmen

Das ist eine wirklich gute Antwort, die imho ganz oben auf der Liste stehen sollte.

1 Stimmen

Ein paar erklärende Worte wären schön gewesen.

0 Stimmen

Gute Antwort, aber ich schlage vor, dass Sie picsum.photos anstelle von lorempixel.com

19voto

alex Punkte 457905

Ich habe ein kleines Plugin, das dies erledigt.

Es heißt waitForImages und es kann mit img Elemente oder jedes Element mit einem Verweis auf ein Bild im CSS, z. B. div { background: url(img.png) } .

Wenn Sie einfach nur laden wollten 何れも Bilder, einschließlich derer, auf die im CSS verwiesen wird, so geht man vor :)

$('body').waitForImages({
    waitForAll: true,
    finished: function() {
       // All images have loaded.
    }  
});

0 Stimmen

Führt dieses Plugin dazu, dass Bilder, die noch nicht auf der Seite erschienen sind, geladen werden, oder fügt es nur Ereignisse an Bilder an, die bereits geladen werden sollten?

0 Stimmen

@DaveCameron Es spielt keine Rolle, ob die Bilder sichtbar sind oder nicht. Sie können es leicht forken und diese Änderung vornehmen - fügen Sie einfach :visible zum benutzerdefinierten Selektor.

0 Stimmen

Dieses Plugin sieht sehr interessant aus. Allerdings ist die jquery-Dokumentation hebt hervor, dass die load Ereignis, wenn es auf Bilder angewendet wird: "funktioniert weder konsistent noch zuverlässig browserübergreifend". Wie hat das Plugin es geschafft, das zu umgehen?

13voto

itsme Punkte 47081

Sie können Bilder mit Hilfe von css irgendwo in Ihr HTML laden display:none; Regel, dann zeigen Sie sie, wenn Sie wollen mit js oder jquery

Verwenden Sie keine js oder jquery-Funktionen zum Vorladen ist nur eine css-Regel Vs viele Zeilen von js ausgeführt werden

Beispiel: Html

<img src="someimg.png" class="hide" alt=""/>

Css:

.hide{
display:none;
}

jQuery:

//if want to show img 
$('.hide').show();
//if want to hide
$('.hide').hide();

Das Vorladen von Bildern durch Jquery/Javascript ist nicht gut, weil Bilder einige Millisekunden brauchen, um in die Seite geladen zu werden + Sie haben Millisekunden für das Skript, um geparst und ausgeführt zu werden, besonders dann, wenn es große Bilder sind, so dass das Verstecken in Hml auch für die Leistung besser ist, weil das Bild wirklich vorgeladen wird, ohne überhaupt sichtbar zu sein, bis Sie das zeigen!

2 Stimmen

Weitere Informationen zu diesem Ansatz finden Sie hier: perishablepress.com/

3 Stimmen

Sie müssen sich jedoch darüber im Klaren sein, dass diese Technik einen großen Nachteil hat: Ihre Seite wird nicht vollständig geladen, bis alle Bilder geladen sind. Depending on the number of images to preload and their size, this could take some time. Even worse, if the <img> tag does not specify a height and width some browsers might wait until the image is fetched before rendering the rest of the page.

0 Stimmen

@Alex Sie müssen auf jeden Fall die img laden, Sie sind frei zu wählen, ob sie mit html zu laden und jede Art von blinkenden und halb geladenen Bilder zu vermeiden, oder wenn Sie mehr Geschwindigkeit für eine nicht stabile Lösung zu bekommen wollen

13voto

alzclarke Punkte 1677

Dieses Jquery imageLoader Plugin ist nur 1.39kb groß

Verwendung:

$({}).imageLoader({
    images: [src1,src2,src3...],
    allcomplete:function(e,ui){
        //images are ready here
        //your code - site.fadeIn() or something like that
    }
});

gibt es noch weitere Optionen, z. B. ob die Bilder synchron oder asynchron geladen werden sollen und ein komplettes Ereignis für jedes einzelne Bild.

1 Stimmen

@Ian, weil das Dokument bereits fertig ist, wenn der Callback ausgelöst wird. $(document).ready wird verwendet, um sicherzustellen, dass Ihr DOM geladen ist. Wenn es um den Callback geht, bedeutet das, dass alle Bilder geladen sind, was bedeutet, dass Ihr DOM geladen ist, so dass keine Notwendigkeit für document.ready innerhalb eines Callbacks.

1 Stimmen

@AamirAfridi Es gibt keine Garantie, dass das Dokument im Callback bereit ist... woher schließen Sie das? Es gibt nichts auf der Seite des Plugins, das sagt, dass die allcomplete Callback wird ausgeführt, nachdem das DOM fertig ist. Es gibt eine ziemlich gute Chance, dass die Bilder fertig geladen werden, nachdem das DOM bereit ist, aber es gibt keinen Grund, davon auszugehen. Ich weiß nicht, warum du denkst, dass Callbacks magisch sind und ausgeführt werden, nachdem das DOM bereit ist... kannst du erklären, woher du das hast? Nur weil die Bilder geladen sind, bedeutet das nicht, dass das DOM bereit ist.

0 Stimmen

@AamirAfridi Und in der Dokumentation für das Plugin steht sogar: NB to use this as an image preloader simply put your $(document).ready(function(){}); into your 'allcomplete' event : > simples! ... es empfiehlt direkt, was diese Antwort zeigt.

9voto

izb Punkte 47624

Eine schnelle, Plugin-freie Möglichkeit, Bilder in jQuery vorzuladen und eine Callback-Funktion zu erhalten, ist die Erstellung mehrerer img Tags auf einmal und zählen Sie die Antworten, z. B.

function preload(files, cb) {
    var len = files.length;
    $(files.map(function(f) {
        return '<img src="'+f+'" />';
    }).join('')).load(function () {
        if(--len===0) {
            cb();
        }
    });
}

preload(["one.jpg", "two.png", "three.png"], function() {
    /* Code here is called once all files are loaded. */
});

Beachten Sie, dass Sie, wenn Sie den IE7 unterstützen wollen, diese etwas weniger hübsche Version verwenden müssen (die auch in anderen Browsern funktioniert):

function preload(files, cb) {
    var len = files.length;
    $($.map(files, function(f) {
        return '<img src="'+f+'" />';
    }).join('')).load(function () {
        if(--len===0) {
            cb();
        }
    });
}

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