Matthias: IE9: image.complete schlägt immer fehl

Hallo,

ich lade per Javascript Bilder nach und musste feststellen, dass mein Code, der in FF 2/3/4, Opera, Safari und IE 6/7/8 einwandfrei funktioniert im IE9 fehlschlägt. Er macht einfach gar nichts und gibt auch keine JS-Fehlermeldung aus. Ich konnte das Problem inzwischen auf folgende Funktion reduzieren:

function start_procedure(direction, op_value, picpath, timefos)
{
  var new_image2 = new Image();
  new_image2.src = picpath;

if (new_image2.complete == false)
  {
    setTimeout("start_procedure('"+direction+"', '"+op_value+"', '"+picpath+"', '"+timefos+"')", timefos);
  }
  else
  {
    setTimeout("changepic_procedure('"+direction+"', '"+op_value+"', '"+picpath+"')", timefos);
  }
}

Diese Funktion soll den weiteren Ablauf verzögern bis das Bild fertig geladen ist. Im Internet Explorer 9 kommt er jedoch nie in den else-Zweig. Also vermute ich, dass der IE9 den Befehl ".complete" falsch interpretiert.
Wenn ich im IE9 einstelle er solle die Seite als IE8 oder IE7 interpretieren funktioniert es einwandfrei, mit dem Kompatibilitätsmodus in der Adressleiste nicht.

Wie kann man den Code ändern, dass der IE9 ihn frisst?

Gruß
Matthias

  1. Hi,

    function start_procedure(direction, op_value, picpath, timefos)
    {
      var new_image2 = new Image();
      new_image2.src = picpath;

    if (new_image2.complete == false)

    Du irrst in der Annahme, dass JavaScript hier „warten“ würde.
    Du erstellst ein neues Bild-Objekt, dass löst einen Request im Hintergrund aus, dass restliche Script wird sofort weiter ausgeführt.

    Wie kann man den Code ändern, dass der IE9 ihn frisst?

    https://forum.selfhtml.org/?t=204177&m=1382310

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hi,

      function start_procedure(direction, op_value, picpath, timefos)
      {
        var new_image2 = new Image();
        new_image2.src = picpath;

      if (new_image2.complete == false)

      Du irrst in der Annahme, dass JavaScript hier „warten“ würde.
      Du erstellst ein neues Bild-Objekt, dass löst einen Request im Hintergrund aus, dass restliche Script wird sofort weiter ausgeführt.

      Ich schicke JS ja in eine Endlosschleife, bis das Bild geladen war, von daher wurde mit der weiteren Codeausführung schon "gewartet" - das war auch am Ergebnis klar ersichtlich.

      Wie kann man den Code ändern, dass der IE9 ihn frisst?

      https://forum.selfhtml.org/?t=204177&m=1382310

      Danke für den Link. Ich habe den If-Zweig jetzt wie folgt angepasst:

      new_image2.onload = function () {
        setTimeout("changepic_procedure('"+direction+"', '"+op_value+"', '"+picpath+"')", timefos);
      };

      Das funktioniert in IE9, FF4, Opera und Safari ganz gut. Leider habe ich gerade keine älteren Browser mehr zum testen da. Weißt du ob das auch die alten (also hauptsächlich IE6-8 und FF2+3) vertragen?

      Gruß
      Gabriel

      1. new_image2.onload = function () {
          setTimeout("changepic_procedure('"+direction+"', '"+op_value+"', '"+picpath+"')", timefos);
        };

        Wozu der setTimeout?
        Wenn diese load-Handlerfunktion ausgeführt wird, ist das Bild verfügbar, da musst du nicht noch einen Timeout einführen. Du kannst direkt die gewünschte Funktion aufrufen:
        changepic_procedure(direction, op_value, picpath);

        Das funktioniert in IE9, FF4, Opera und Safari ganz gut. Leider habe ich gerade keine älteren Browser mehr zum testen da. Weißt du ob das auch die alten (also hauptsächlich IE6-8 und FF2+3) vertragen?

        Das ist eine uralte JavaScript-Technik, die wahrscheinlich selbst im Netscape 2 laufen wird.

        Mathias