Gunnar Bittersmann: Bilder vorladen

Hi,
Laden Browser alle Bilder vor, auch wenn sie nacheinander derselben Variablen zugewiesen werden?

function preload() {  
  for(var img, i = 0; i < arguments.length; i++) {  
    img = new Image;  
    img.src = arguments[i];  
  }  
}

(Aufruf: onload="[code lang=javascript]preload('foo.png', 'bar.png')"[/code])

Live long and prosper,
Gunnar

--
„Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
  1. Hallo Gunnar,

    Laden Browser alle Bilder vor, auch wenn sie nacheinander derselben Variablen zugewiesen werden?

    Alle? Nein, nicht alle. Ein kleines Dorf im Norden Galliens...
    Sorry, das war aus einem anderen Märchen. ;-)

    Also im Ernst: Der Internet Explorer braucht auf jeden Fall etwas Zeit zwischen den Zuweisungen, weil die Zuweisung an img.src nicht sofort das Anfordern der Ressource auslöst. Das wird anscheinend asynchron zu einem passenden Zeitpunkt ausgelöst.

    function preload() {

    for(var img, i = 0; i < arguments.length; i++) {
        img = new Image;
        img.src = arguments[i];
      }
    }

      
    Die Erfahrung zeigt, dass nach einer solchen Schleife ohne Ruhepause nur das letzte der Bilder im Cache vorzufinden ist.  
    Ich \_vermute\_, dass es bei den anderen Browsern ähnlich ist, habe es aber nie eingehend untersucht.  
      
    Gute Nacht,  
     Martin  
    
    -- 
    Der Mensch denkt, Gott lenkt.  
    Der Mensch dachte, Gott lachte.  
    
    
    1. Die Erfahrung zeigt, dass nach einer solchen Schleife ohne Ruhepause nur das letzte der Bilder im Cache vorzufinden ist.

      OK, Martin, also dann in ein Array packen?

      function preload() {  
        for(var img = new Array, i = 0; i < arguments.length; i++) {  
          img[i] = new Image;  
          img[i].src = arguments[i];  
        }  
      }
      

      Live long and prosper,
      Gunnar

      --
      „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
      1. Hallo Gunnar,

        function preload() {

        for(var img = new Array, i = 0; i < arguments.length; i++) {
            img[i] = new Image;
            img[i].src = arguments[i];
          }
        }

          
        Das dürfte eventuell funktionieren. Mich interessiert aber: Muss hinter dem new Image nicht ein Klammerpaar hin, also  
        `img[i] = new Image();`{:.language-javascript}  
        ?  
        Schließlich wird hier ein neues Objekt erzeugt, und da ist eigentlich immer ein Konstruktor mit dabei - auch, wenn er leer ist. [Diese Seite](http://de.selfhtml.org/javascript/objekte/images.htm#src) scheint mir Recht zu geben, es würde mich aber nicht wundern, wenn es auch anders ginge.  
          
          
        Grüße  
          
        Marc Reichelt || <http://www.marcreichelt.de/>  
        
        -- 
        Linux is like a wigwam - no windows, no gates and an Apache inside!  
          
        Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)  
        <http://emmanuel.dammerer.at/selfcode.html>
        
        1. Hallo,

          Muss hinter dem new Image nicht ein Klammerpaar hin, also
          img[i] = new Image();
          ?

          Siehe http://forum.de.selfhtml.org/archiv/2005/1/t99078/#m604906 ff.

          Mathias

          1. Muss hinter dem new Image nicht ein Klammerpaar hin […]?
            Siehe http://forum.de.selfhtml.org/archiv/2005/1/t99078/#m604906 ff.

            Mathias,
            Soll heißen, die Klammer sind nicht erforderlich?

            Was aber sicher nicht schlecht wäre, ist die Abfrage, ob arguments überhaupt existiert (laut [http://de.selfhtml.org/javascript/objekte/function.htm#arguments@title=SELFHTML] erst ab JavaScript 1.4):

            function preload() {  
              if (var arg = (arguments || preload.arguments))  
                for(var img = new Array, i = 0; i < arg.length; i++) {  
                  img[i] = new Image;  
                  img[i].src = arg[i];  
                }  
            }
            

            „Aber wem erzähle ich das? Dem wissend zwinkernden? Wahrscheinlich doch nur dem Archiv.“ [at]

            Live long and prosper,
            Gunnar

            --
            „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
            1. Argl, ich hätte doch erstmal testen sollen: Die Deklaration mit Zuweisung geht in der if-Abfrage in JavaScript nicht. Dann halt so:

              function preload() {  
                var arg;  
                if (arg = (arguments || preload.arguments))  
                  for(var img = new Array, i = 0; i < arg.length; i++) {  
                    img[i] = new Image;  
                    img[i].src = arg[i];  
                  }  
              }
              

              Live long and prosper,
              Gun*Ingrid*nar

              --
              „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
          2. Hallo molily,

            Muss hinter dem new Image nicht ein Klammerpaar hin, also
            img[i] = new Image();
            ?

            Siehe http://forum.de.selfhtml.org/archiv/2005/1/t99078/#m604906 ff.

            Ah ja, interessant, dass das in JavaScript auch geht.
            Allerdings werde ich weiterhin für einen leeren Konstruktor ein Klammernpaar verwenden - in anderen Programmiersprachen sind sie nämlich Pflicht (in Java auf jeden Fall).

            Grüße

            Marc Reichelt || http://www.marcreichelt.de/

            --
            Linux is like a wigwam - no windows, no gates and an Apache inside!
            Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
            http://emmanuel.dammerer.at/selfcode.html