Felix Riesterer: & IE: dynamisch generierter IFRAME wird nicht geladen... :-(

Liebe Spezialisten,

ein dynamisch in den DOM-Baum eingehängter IFRAME wird im Firefox korrekt nachgeladen, im IE dagegen passiert einfach nix - keine Fehlermeldung oder sonstwas. Das Objekt wird korrekt in den DOM-Baum eingehängt, jedoch wird das in den IFRAME zu ladende Dokument nicht angefordert... bestätigt mein Apache-Logfile.

Das Ganze hat den Zweck, eine <ul>-Liste "nachzuladen", da das Gesamtverzeichnis aller Dateien der Webpräsenz nur im Bedarfsfalle (HTML-Code geht dabei gegen 1MB!) geladen werden soll. Daher wollte ich den HTML-Code in einem IFRAME per Javascript nachladen, um ihn anschließend per iframe.body.innerHTML in das Hauptfenster zu übertragen. - Im Feuerfuchs klappt das auch alles wie am Schnürchen.

Mein Code sieht so aus:
Parent-Window:

    anfordern = function()  
       {  
       if (!nachgeladen) // enthält "false" oder den HTML-Code der Liste  
        if (confirm('{confirm-nachladen}'))  
          {  
          var iframe = document.createElement("iframe");  
          var URL = document.location;  
          URL += "&all=true";  
          iframe.src = URL;  
          document.getElementById("preload").appendChild(iframe);  
          }  
        else  
          {  
          return false;  
          }  
       return true  
       }  
  
    nachladen = function () // wird aus dem nachgeladenen IFRAME per body.onload "gefeuert"  
       {  
       var liste2 = document.getElementById("liste2").innerHTML + nachgeladen;  
       document.getElementById("liste2").innerHTML = liste2;  
       }

Im IFRAME steht beispielweise folgender HTML-Code:

<html>  
<head><title>JAVASCRIPT-REQUESTED FILE</title></head>  
<body onload="parent.nachgeladen=document.body.innerHTML;parent.nachladen();">  
<ul>  
   <li>VerzeichnisA</li>  
   <li>...</li>  
</ul>  
</body>  
</html>

Wer hatte auch schon einmal das Problem und konnte den IE dazu bringen, die Resource anzufordern und nachzuladen?

Liebe Grüße aus Ellwangen,

Felix Riesterer.

  1. hi,

    Das Objekt wird korrekt in den DOM-Baum eingehängt, jedoch wird das in den IFRAME zu ladende Dokument nicht angefordert... bestätigt mein Apache-Logfile.

    Gibt es Fehlermeldungen?

    Alternativ könntest du mal versuchen, ob es "funzt", wenn du den Iframe nicht per DOM erzeugst, sondern per innerHTML an den Body anfügst. Nicht schön, klar - aber erst mal zu Testzwecken, ob der IE dann weniger zickt.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Lieber wahsaga,

      Deine Tipps haben mir schon öfter geholfen, besonders um Dinge aus einer anderen Perspektive zu betrachten. Ich werde Deinen Vorschlag ausprobieren!

      Alternativ könntest du mal versuchen, ob es "funzt", wenn du den Iframe nicht per DOM erzeugst, sondern per innerHTML an den Body anfügst. Nicht schön, klar - aber erst mal zu Testzwecken, ob der IE dann weniger zickt.

      Mein neuer Javascript-Code:

          anfordern = function()  
             {  
             if (!nachgeladen)  
              if (confirm('{confirm-nachladen}'))  
                {  
                var preload = document.getElementById("preload");  
                var preload_html = preload.innerHTML;  
                var URL = document.location;  
                URL += "&all=true";  
                preload_html += '<iframe name="iframe" src="' + URL + '" />';  
                preload.innerHTML = preload_html;  
                }  
              else  
                {  
                return false;  
                }  
             return true  
             }
      

      Auch in dieser Variante meldet mir das IE-Icon unten links (im Fehlerfalle enthält es das berühmte Warndreieck) kühn ein "Fertig", was soviel heißt, wie... naja, eben nix. :-(

      Mein Apache-Log meldet aber, dass die Resource des IFRAMES tatsächlich angefordert wurde! Dieses ist ein erster Fortschritt. Leider startet der IE nicht die Funktion im parent, so wie es der FF brav tut, um die geladenen Inhalte zum Einfügen zu übertragen. Aber daran werde ich arbeiten!

      Deine Frage bezüglich Fehlermeldungen muss ich verneinen, denn weder der Apache, noch der IE hatten irgendeine Fehlermeldung ausgegeben.

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      1. Mein neuer Javascript-Code:

        anfordern = function()

        {

        [...]

        preload_html += '<iframe name="iframe" src="' + URL + '" />';
                  preload.innerHTML = preload_html;

        [...]

        }

          
        Dieses hat nicht den gewünschten Effekt - keine Ahnung warum. Aber folgende Lösung habe ich durch Ausprobieren als zuverlässig herausgefunden:  
          
        1\. den Iframe per innerHTML anlegen lassen  
           (die DOM-Methode `document.createElement("iframe")`{:.language-javascript} im IE scheint fehlerhaft -  
           jedenfalls bewirken die Zuweisungen der src-Eigenschaft an das Objekt nichts!)  
        2\. dem Iframe eine Quelle zuweisen  
          
        Daraus folgt die dritte Anpassung meines Codes:  
        ~~~javascript
            anfordern = function()  
               {  
               [...]  
                  var preload = document.getElementById("preload");  
                  var preload_html = preload.innerHTML;  
               [...]  
                  // das src-Attribut wird hier bewusst nicht angegeben:  
                  preload_html += '<iframe name="iframe" id="iframe" />';  
                  preload.innerHTML = preload_html;  
                  // erst jetzt die Resource angeben!  
                  document.getElementById("iframe").src = URL;  
               [...]  
               }
        

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

  2. Hi Felix,

    Wer hatte auch schon einmal das Problem und konnte den IE dazu bringen, die Resource anzufordern und nachzuladen?

    Das ist mir zwar noch nicht gelungen (ich habe es auch noch nicht probiert *g*), aber erzeugt der IE denn wenigstes das IFrame (auch wenn er den Inhalt nicht lädt)? Dann könntest du nämlich mal versuchen ein reload() auf das IFrame zu feuern…

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
    Patch zur Verwendung von PATHINFO in JLog
    Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet! (Anita Berres)
    1. Lieber Dennis,

      Dann könntest du nämlich mal versuchen ein reload() auf das IFrame zu feuern…

      vielen Dank für diesen Denkanstoß... dieser war mir zwischenzeitlich auch gekommen. Aber meine Versuche damit blieben erfolglos.

      Anscheinend erzeugt der IE per document.createElement zwar einen IFRAME, dieser bekommt aber irgendwie (zumindest bei mir) kein Dokument, sodass ich per src-Eigenschaft keine Resourcen hineinladen und infolge dessen auch nicht reloaden kann. Mir scheint, dass der IE (ich teste die Versionen 5.5 und 6.0) die innerHTML-Methode um Welten besser unterstützt, als ein anständiges DOM... Das kann der Mozilla gottseidank auch sehr gut, sodass mein Script einigermaßen Cross-Browser-tauglich ist (für diese zwei Browser muss mein CMS funktionieren - wenn der TinyMCE einmal korrekt für Opera9 tut, dann teste ich es auch dort).

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

  3. hi Felix,

    nochmal nachgehakt:

    var iframe = document.createElement("iframe");
              var URL = document.location;

    Was machst du denn hier eigentlich?

    Hast du eine Eigenschaft namens document.location vorher selber gesetzt?

    Oder meinst du das location-Objekt? Das liegt aber unterhalb von window.
    Und wenn du es meinst, dann willst du doch wohl nicht an dieses Objekt (dessen toString-Methode, die dann aufgerufen werden müsste, dürfte wohl auch nur "[Object]" o.ä. zurückgeben) etwas anhängen - sondern an den Wert von einer seiner Eigenschaften, wie bspw. location.href ...?

    Denn dein eigentliches Problem, mit den genannten Zeilen über das DOM einen Iframe zu erzeugen, ihm einen src-Wert zuzuweisen, und ihn dann ins DOkument einzuhängen, kann ich mit IE 5.5 und IE 6 nicht nachvollziehen - beide fügen auch über's DOM den Iframe ein, und feuern mir auch ein in dessen Quelldokument enthaltens onload, welches mir eine alert-Meldung ausgibt.

    Nur IE 5.01 mag nicht, der stellt ein Iframe-artiges Objekt von ca. 1em*1em Größe dar, und will auch den onload-Event nicht feuern.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Lieber wahsaga,

      nochmal nachgehakt:

      var iframe = document.createElement("iframe");
                var URL = document.location;

      Was machst du denn hier eigentlich?

      Du hast vollkommen Recht! Der IE hat sich hier tatsächlich korrekt verhalten und meine fehlerhafte Verwendung nicht so freundlich kompensiert, wie es der Firefox getan hat.

      Das in den Iframe zu ladende Dokument hat dieselbe URL wie das Elternfenster, nur bekommt die URL einen zusätzlichen Parameter angehängt, sodass die Scriptausgabe eine andere wird. Daher soll die Variablen die aktuelle location des Browserfensters erhalten (aber eben nicht mit document).

      Dieser Umstand hat dazu geführt, dass im IE ursprünglich die Resource nicht angefordert wurde. Nach der Korrektur meines ersten Ansatzes funktioniert dieser nun auch mit dem IE (Version 5.5 aufwärts - myElement.appendChild() wird vorher nicht unterstützt).

      Noch einmal herzlichen Dank! Dieses Problem ist sehr zufriedenstellend gelöst!

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      1. hi,

        Du hast vollkommen Recht! Der IE hat sich hier tatsächlich korrekt verhalten und meine fehlerhafte Verwendung nicht so freundlich kompensiert, wie es der Firefox getan hat.

        Ich bin mir gar nicht mehr so sicher, ob ich "vollkommen Recht" hatte - der Test, javascript:alert(window.location) in die Adresszeile einzugeben, liefert mir in Opera, Firefox und IE jeweils die Adresse der aktuellen Seite.

        Entweder ist als doch die toString-Methode für das location-Objekt doch so definiert, dass sie den Inhalt von location.href zurückliefert - oder alle drei haben es auch ohne solche Definition für sinnvoll erachtet(?).

        Nach der Korrektur meines ersten Ansatzes funktioniert dieser nun auch mit dem IE (Version 5.5 aufwärts - myElement.appendChild() wird vorher nicht unterstützt).

        Wie meinen? Generell unterstützt doch auch der 5.01er appendChild?

        Noch einmal herzlichen Dank! Dieses Problem ist sehr zufriedenstellend gelöst!

        Na, Hauptsache - dann will ich mir jetzt auch keinen Kopf mehr machen, ob ich "nach Spezifikation" Recht gehabt hätte oder nicht :-)

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hallo,

          Entweder ist als doch die toString-Methode für das location-Objekt doch so definiert, dass sie den Inhalt von location.href zurückliefert

          Genau das.

          Mathias

        2. Lieber wahsaga,

          Ich bin mir gar nicht mehr so sicher, ob ich "vollkommen Recht" hatte -

          Du hattest vollkommen Recht, als Du "document.location" als meinen Irrtum erkannt hattest!

          der Test, javascript:alert(window.location) in die Adresszeile einzugeben, liefert mir in Opera, Firefox und IE jeweils die Adresse der aktuellen Seite.

          Das sollte der Test auch in allen noch nicht getesteten Browsern zeigen. Das window-Objekt hat als Unterobjekt das location-Objekt. Ob aber auch das document-Objekt dieses Unterobjekt besitzt, scheint zumindest beim Firefox 1.5 der Fall zu sein, obwohl es niemals zu erwarten gewesen war...

          Entweder ist als doch die toString-Methode für das location-Objekt doch so definiert, dass sie den Inhalt von location.href zurückliefert - oder alle drei haben es auch ohne solche Definition für sinnvoll erachtet(?).

          Dieser Umstand war für meinen Fehler absolut nicht relevant! Daher stimmt "vollkommen Recht" in Bezug auf Deine Kritik.

          IE (Version 5.5 aufwärts - myElement.appendChild() wird vorher nicht unterstützt)

          Wie meinen? Generell unterstützt doch auch der 5.01er appendChild?

          Ich hatte mich in dieser Aussage auf die Angaben in SELFHTML 8.1.1 gestützt, in denen diese Methode erst ab dem IE 5.5 angegeben ist (siehe: http://de.selfhtml.org/javascript/objekte/node.htm#append_child@title=append.Child). Aber da ich mit meinem CMS den IE5.0x nicht mehr unterstütze, spielt das für mich mittlerweile eine eher untergeordnete Rolle.

          Liebe Grüße aus Ellwangen,

          Felix Riesterer.

    2. Hallo,

      Oder meinst du das location-Objekt? Das liegt aber unterhalb von window.
      Und wenn du es meinst, dann willst du doch wohl nicht an dieses Objekt (dessen toString-Methode, die dann aufgerufen werden müsste, dürfte wohl auch nur "[Object]" o.ä. zurückgeben)

      »Omitting a property name from the location object is equivalent to specifying location.href.« (Client JavaScript 1.3)

      Aus dem Grund liefert auch ein a-Elementknoten die URI und nicht "[object HTMLAnchorElement]" - trotzdem ist es ein Objekt, das Location und HTMLAnchorElement implementiert, es hat wie du sagst intern nur eine entsprechende toString-Methode.

      Mathias

      1. hi Mathias,

        danke für den Hinweis.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }