lois: bug? beim laden via img = new Image();

hallo,

folgendes problem:

function laden(ref) {
  var img = new Image(); img.src = ref;
  var iw = img.width;
  var ih = img.height;
  alert (iw+' ' +ih);
  // liefert beim ersten klick "50 50" bei jedem      weiteren "600 600" obwohl sich das file ref nicht ändert
  msgWin=window.open(ref, 'imgwin1', 'resizable=yes,                                                          scrollbars=yes, width='+iw+', height='+ih+');
}

die funktion wird aufgerufen, wenn man auf ein kleines bild klickt. so, beim ersten mal ancklicken wird ein (50x50) fenster geöffnet und das bild hineingeladen das aber (600x600) gross ist. beim zweiten klick auf das kleine bild wird das fenster richtig geöffnet, also (600x600). das ganze passiert nur beim ersten klick. also schliess ich das fenster, öffne es neu und klick auf das kleine bild, passt grosses fenster. fahr ich den computer runter und starte neu, wieder das gleiche. beim ersten klick (50x50) bei allen folgenden (600x600).
ist übrigens egal, ob ich ie6.0 oder mozilla1.1 verwende.

irgendwie eigenartig das ganze?

lg lois.

  1. hallo lg lois

    -habe dein problem kurz unter die lupe genommen ;).
    -folgender code funktioniert:

    var img;

    function laden_2(ref)
    {
     if (img.width <= 0 || img.height <= 0)
      setTimeout("laden_2('" + ref + "');", 500);
     else
      msgWin = open(ref, "imgwin1", "resizable=yes,scrollbars=yes,width=" + img.width + ",height=" + img.height);
    }

    function laden(ref)
    {
     img = new Image();
     img.src = ref;

    laden_2(ref);
    }

    -bei mir war übrigens bei deiner version die alert ausgabe immer auf 0 0.
    -das problem ist, wenn du ein bild lädtst, so sind die eigenschaften erst nach beenden des ladevorganges verfügbar.
    -ob du das bild in einer html-seite definierst oder du zuerst ein image-objekt kreierst ist egal.
    -die lösung ist. die erste funktion laden() ist klar.
    -wir definieren ein image-objekt und weisen die bild-adresse zu.
    -damit lösen wir ja den ladenvorgang aus.
    -jetzt rufe ich die funktion laden_2() auf.
    -diese funktion ruft sich so lange (mit einer versögerung von 500ms) immer wieder selber auf, bis die breite und höhe des bildes verfügbar ist.
    -erst dann öffnen wir das fenster und laden das bild.
    -du könntest auch versuchen dies mit einem onload-handler zu lösen.
    -funktioniert leider nicht auf allen browsern.

    -noch was. achte darauf, dass du den parameter

    "resizable=yes,scrollbars=yes,width=" + img.width + ",height=" + img.height

    der open-funktion ohne leerzeichen definierst. netscape 4.x hat sonst probleme. also keine leerzeichen nach dem komma.

    gruss LenaLuna

    1. hi lena,

      super, jetzt funktionierts, danke danke danke :D
      hab da ziemlich lang heumgedoktort.

      lg lois.

    2. -die lösung ist. die erste funktion laden() ist klar.
      -wir definieren ein image-objekt und weisen die bild-adresse zu.
      -damit lösen wir ja den ladenvorgang aus.
      -jetzt rufe ich die funktion laden_2() auf.
      -diese funktion ruft sich so lange (mit einer versögerung von 500ms) immer wieder selber auf, bis die breite und höhe des bildes verfügbar ist.
      -erst dann öffnen wir das fenster und laden das bild.
      -du könntest auch versuchen dies mit einem onload-handler zu lösen.
      -funktioniert leider nicht auf allen browsern.

      Doch das funktioniert auf allen Browsern, die Images kennen.

      Struppi.

  2. hallo,

    folgendes problem:

    function laden(ref) {
      var img = new Image(); img.src = ref;
      var iw = img.width;
      var ih = img.height;
      alert (iw+' ' +ih);
      // liefert beim ersten klick "50 50" bei jedem      weiteren "600 600" obwohl sich das file ref nicht ändert
      msgWin=window.open(ref, 'imgwin1', 'resizable=yes,                                                          scrollbars=yes, width='+iw+', height='+ih+');
    }

    Du musst warten, bis das Bild geladen ist und das geht zuverlässiger als in der Variante die LenaLuna beschrieben hat, mit onload.

    function laden(ref) {
    var img = new Image();
    img.onload = fertig;
    img.onerror = function () { alert(this.src + ' konnte nicht geladen werden.');};
    img.src = ref;
    }

    function fertig()
    {
    var img = this;
    var iw = img.width;
    var ih = img.height;
    alert (iw+' ' +ih);
    msgWin=window.open(ref, 'imgwin1',
    'resizable=yes,scrollbars=yes,width='+iw+',height='+ih+');
    }

    Du solltest übrigens keine Leerzeichen in den Parameter von window.open machen, die bringen NC 4. aus den Tritt.

    Struppi.