Tom: "complete"-Eigenschaft - Fehler in Netscape 4 ?

Hallo!

Ich möchte eine Abfrage nach dem Lade(Übertragungs-)status einiger Grafiken durchführen. Eigentlich sollte doch die Javascript-Eigenschaft "complete" des "image"-Objektes (unterhalb des "document"-Objektes) auf einem NETSCAPE-Browser der 4. Generation funktionieren (zumindest steht Netscape 4 bei SELFHTML explizit dabei). Naja - logisch - bei mir klappts' nicht!

Beim IE 4/5 funktioniert alles korrekt und es wird "true" ausgegeben (beim Netscape 4 kommt "false")

Hier mein Testcode:

<html><head>
<script language="javascript" type="text/javascript">
var stat="";
function testbild()
{
  stat=document.images[0].complete;
  alert(stat);
}
</script>

</head><body>
  <img src="../webgrfx/pyramide.jpg" width=420 height=315 border=0 alt="">
  <a href="javascript:test()">check</a>
</body></html>

Also - irgendwie ist das doch seltsam - der IE 4/5 zeigt (wie erwartet) den Status "true" an und der Netscape 4.x zeigt "false" an. Nebenbei bemerkt: selbstverständlich ist die Grafik korrekt geladen worden und auf dem Bildschirm zu sehen!
Bei SELFHTML steht dabei, daß es sich um Javascript 1.1 handelt - aber der ist doch meines Wissens nach vollständig in Netscape 4 integriert, oder?! Ich benutze z.Zt. Netscape 4.6 (vor 1h habe ich noch Netscape 4.5.1 genommen, dachte aber man könnte ja mal hoffen... und Netscape 4.6 installieren... irgendwie vergebens... wie immer... toll... naiver Gedanke...

Ach ja: das Beispiel aus SELFHTML funktioniert auch NICHT bei mir!

Wer weiß hier Rat???
Vielen Dank!

Tom

  1. <html><head>
    <script language="javascript" type="text/javascript">

    »»  var stat="";
    »»  function testbild()
    »»  {

    stat=document.images[0].complete;
      alert(stat);

    »»  }

    </script>

    </head><body>
      <img src="../webgrfx/pyramide.jpg" width=420 height=315 border=0 alt="">
      <a href="javascript:test()">check</a>
    </body></html>

    Eigentlich dürfte dies auch nicht im IE laufen, denn du rufst die Funktion test() auf. Sie heißt bei dir jedoch:
    testbild()

    Viele Grüße

    Antje

    1. Eigentlich dürfte dies auch nicht im IE laufen, denn du rufst die Funktion test() auf. Sie heißt bei dir jedoch:
      testbild()

      Hallo Anke !

      Ja, ja ich weiß... allerdings gilt das nur für diesen Thread - nicht für die Realität, denn dort stimmen logischerweise alle Aufrufe (ich habe wirklich Stunden damit verbracht irgendeine Lösung zu finden). Ich habe das Problem nur mal "kürzer" formuliert und dabei die Aufrufe verwechselt... (ich habe das später auch entdeckt - nur dachte ich eigentlich, daß es offensichtlich ist, daß das ein Schreibfehler ist und wollte dieses Forum nicht noch mit einer "Geraderückung" belasten... trotzdem Danke! )

      Hallo Peter !

      Vielen, vielen Dank für die Mühe ! Ob es sich gelohnt hat schreibe ich dann morgen an dieser Stelle, da ich heute keine Zeit mehr habe irgendetwas auszuprobieren (ich befinde mich in unmittelbarer Biergartenstimmung (ist nach fast 12h pausenlos vor der Kiste auch sehr(!) angebracht... ;)))

      'Habe aber alles mal überflogen und bin durchweg von den Ansätzen begeistert !
      Melde mich morgen an dieser Stelle nochmal mit dem Ergebnis (nachdem ich Deine wirklich gelungene Darstellung "verarbeitet" und umgesetzt habe :)

      nochmal vielen Dank!

      nochmals vielen Dank,
      Tom

      1. Hi Peter!

        Habe alles ausprobiert (Weg A) und habe mir gleich, nachdem ich festgestellt hatte, daß das ja einfach aber genial ist mit dem "onLoad" einige eigene Routinen dazu gebastelt. Klappt hervorragend. Nur leider habe ich jetzt ein völlig neues Problem, an dem ich jetzt schon seit ewigen Zeiten sitze: siehe weiter oben.

        Gruß,
        Tom

        P.S. Anke: Du heißt ab sofort wieder Antje.

  2. hallo Tom,

    auf die unzuverlaessigkeit der complete-methode bin
    ich auch schon gestossen - aber die braucht man auch
    gar nicht, denn mit scripten generierte abfragen nach
    [complete] waeren zu umstaendlich ... Du musst pausenlos abfragen !!!

    vorschlag: lass Dir doch die vollstaendigkeitsbescheinigung
      einfach von Deinem bild schicken ...
      merke: immer andere fuer sich arbeiten lassen - so wie ich gerade fuer Dich / Euch !!!

    idee:  jedes <image>-objekt kennt den onload-event -

    irgendwo zwischen </TITLE> und </HEAD> kannst
      Du also variablen und funktionen plazieren,
      die den status deines bildes nur halten - aber
      nicht ueberwachen ... das <imgage>-object
      kuemmert sich bei <img src="..." onload="...">
      selbst um das schreiben des wertes, den Du
      abfragen moechtest.

    loesungEN: koennten so aussehen ...

    a) bild meldet selber, dass es geladen ist, wie es heisst und welche groesse es hat  
    
    -  ACHTUNG - praktisch nicht sinnvoll - dient nur zur veranschaulichung !!!!!  
    

    <!doctype html public "-//W3C//DTD HTML 3.2//EN">
      <HTML>

    <HEAD>
      <TITLE> ... dein_title ... </TITLE>
      <script language="JavaScript">
      <!--
      function LADEZUSTAND_BILD_ZEIGEN(mein_name,meine_groesse_inKB)
       {
       alert("\n\n   ein bild wurde geladen !!!   \n\n   name : "+mein_name+"   \n   groesse : "+meine_groesse_inKB+" kByte   \n\n")
       }
      //-->
      </script>
      </HEAD>

    <BODY>
      was
      Du
      willst
      <img src="... deine_quelle.xxx ..." width="xx" height="xx" border="0" alt="... dein_alternativer_text ..." onload="self.LADEZUSTAND_BILD_ZEIGEN('bin ein bild',XX)">
      was
      Du
      willst
      </BODY>
      </HTML>

    - interessant ist die tatsache, das Du bilder auf diese weise in einem versteckten 0-[frame]  
    

    im <BODY></BODY> einer normalen HTML-seite vorladen und den fortschritt des bilderladens
       ueberwachen kannst
    - die function LADEZUSTAND_BILDER_ZEIGEN(...) sollte dann ebenfalls in einer in einem 0-[frame]
       versteckten HTML-seite zusammen mit deinen gesamten anderen scripten stehen
    - wenn diese SCRIPT-seite geladen ist, ruft sie Deine IMAGE-seite auf
    - nun werden <img... onload="LADEZUSTAND_BILDER_ZEIGEN(...)"> ereignisse zuhauf generiert
    - Du kannst jetzt die function LADEZUSTAND_BILDER_ZEIGEN(...) so modifizieren, dass diese
       die bandbreite der netzanbindung eines clients ausrechnet und entsprechend darauf reagiert
    - in b) kann ich ja mal einen grossen einblick gewaehren

    b) bild meldet, dass es geladen wurde und welche groesse es hat  
    
    - ACHTUNG - nur sinnvoll, wenn man den client wirklich  
    

    ueber den ladezustand der bilder informieren moechte !!!

    //  
    //diese datei heisst "scripte.htm" und kommt in einen 0 breiten [frame] namens SCRIPTE !!!  
    //wenn diese seite geladen wurde, plaziert sie die seite "bilder.htm" in einem 0 breiten [frame] namens BILDER !!!  
    //  
    

    <!doctype html public "-//W3C//DTD HTML 3.2//EN">
      <HTML>

    <HEAD>
      <TITLE> alle meine SCRIPTE </TITLE>
      <script language="JavaScript">
      <!--
      var alle_bilder = XX;   // hier bitte die  gesamtbildanzahl  des  projektes eintragen !!
      var n_geladene_bilder = 0;
      var startzeit_bilder = 0;
      var startzeit_letztes = 0;
      var bildgroesse_verstrichen = 0;
      var bildgroesse_gesamt_KB = XXX.XX // hier den  gesamtspeicherbedarf  aller bilder in KB angeben !!
      var letzte_bildgroesse = 0;

    function LADEZUSTAND_BILDER_ZEIGEN(dieses_groesseKB)
       {
       n_geladene_bilder = n_geladene_bilder + 1;

    if (n_geladene_bilder == 1) {startzeit_bilder = new Date();startzeit_bilder = startzeit_bilder.getTime()-1;startzeit_letztes = startzeit_bilder;bildgroesse_verstrichen = bildgroesse_verstrichen - dieses_groesseKB;}
       bildgroesse_verstrichen = ((Math.floor(((bildgroesse_verstrichen + dieses_groesseKB)*100)+0.5))/100);
       var startzeit_dieses = new Date();startzeit_dieses = startzeit_dieses.getTime();
       var zeit_verstrichen = (startzeit_dieses - startzeit_bilder)/1000;
       var letztes_verstrichen = (startzeit_dieses - startzeit_letztes)/1000;
       var verstrichen_caKBproSEC = ((Math.floor(((bildgroesse_verstrichen/zeit_verstrichen)*100)+0.5))/100);
       var letztes_exaktKBproSEC = ((Math.floor(((letzte_bildgroesse/letztes_verstrichen)*100)+0.5))/100);
       var verbleibende_zeit_ca = ((Math.floor((((bildgroesse_gesamt_KB - bildgroesse_verstrichen)/verstrichen_caKBproSEC)*10)+0.5))/10);
       startzeit_letztes = startzeit_dieses;
       letzte_bildgroesse = dieses_groesseKB;

    //alert("\n\nstartzeit_bilder = "+startzeit_bilder+"\nstartzeit_dieses = "+startzeit_dieses+"\n\nzeit_verstrichen = "+zeit_verstrichen+"\nletztes_verstrichen = "+letztes_verstrichen+"\n\nbildgroesse_verstrichen = "+bildgroesse_verstrichen+"\n\n")

    var text_ladestatus = "["+bildgroesse_verstrichen+"k/"+bildgroesse_gesamt_KB+"k]bei[~"+verstrichen_caKBproSEC+"k/s]z.Zt.["+letztes_exaktKBproSEC+"k/s]noch[~"+verbleibende_zeit_ca+"s]";
       top.status = text_ladestatus;

    if (n_geladene_bilder >= alle_bilder)
        {
        dann
        tue,
        was
        immer
        Du
        willst;

    top.status = "alle BILDER geladen !";
        }
       }
      //-->
      </script>
      </HEAD>

    <BODY onload="top.BILDER.location.href="bilder.htm">
      </BODY>

    </HTML>

    //  
    //die naechste datei heisst "bilder.htm" und laedt bilder in normalen <img ...>-tags vor  
    //alle <image>-objekte rufen beim onload-event die function LADEZUSTAND\_BILDER\_ZEIGEN(dieses\_groesseKB)  
    //im [frame] top.SCRIPTE auf  
    //natuerlich muessen fuer ein richtiges preload die bildquellen noch variablen zugewiesen werden  
    //auf die kann man dann spaeter ueber top.BILDER.variablenname zugreifen - schoen nicht ?!?!?!!!  
    //  
    

    <!doctype html public "-//W3C//DTD HTML 3.2//EN">
      <HTML>

    <HEAD>
      <TITLE> alle meine BILDER </TITLE>
      </HEAD>

    <BODY>
      <img src="deine_quelle_01.xxx" width="0" height="0" name="DEINE_QUELLE_01" border="0" alt="... dein_alternativer_text ..." onload="top.SCRIPTE.LADEZUSTAND_BILDER_ZEIGEN(XX.XX)">
      <script language = "JavaScript">
      if (document.images)
       {
       var deine_quelle_01 = new Image();deine_quelle_01.src = top.BILDER.document.images["DEINE_QUELLE_01"].src;
       }
      </script>
      <img src="deine_quelle_02.xxx" width="0" height="0" name="DEINE_QUELLE_02" border="0" alt="... dein_alternativer_text ..." onload="top.SCRIPTE.LADEZUSTAND_BILDER_ZEIGEN(XX)">
      <script language = "JavaScript">
      if (document.images)
       {
       var deine_quelle_02 = new Image();deine_quelle_02.src = top.BILDER.document.images["DEINE_QUELLE_02"].src;
       }
      </script>
      .
      .

    <img src="deine_quelle_XX.xxx" width="0" height="0" name="DEINE_QUELLE_XX" border="0" alt="... dein_alternativer_text ..." onload="top.SCRIPTE.LADEZUSTAND_BILDER_ZEIGEN(XX.XX)">
      if (document.images)
       {
       var deine_quelle_XX = new Image();deine_quelle_XX.src = top.BILDER.document.images["DEINE_QUELLE_XX"].src;
       }
      </script>
      </BODY>

    </HTML>

    //  
    //  
    alle angaben ohne garantie, da ich das alles hier in kuerze  
    aus irgendwelchen projekten von mir zusammengestoppelt habe  
    
    wenns nicht auf anhieb funktioniert, liegt das an meinem  
    eben praktizierten fehlerbehafteten copy+paste !!!!!!!!!  
    
    ---------------------------------------------------------------------------------------------------------------------  
    
    viel spass und by(t)e by(t)e - pseliger@gmx.net