Enrico: Inhalt aus iframe einlesen

Hallo,

ich habe wieder einmal ein Problem und hoffe, ihr könnt mir wieder helfen.

Ich will über folgende beiden Funktionen über JavaScript den Inhalt einer Textdatei einlesen und später aktualisieren lassen:

  
function E (Datei, Neuer_Inhalt) // Eintragen  
{  
   var Alter_Inhalt = T (Datei);  
  
   alert (Alter_Inhalt);  
}  
  
function T (a) // Textdatei laden  
{  
   var b = document.createElement("iframe");  
  
   b.setAttribute("src", "../../TXT/" + a + ".txt");  
  
   document.body.appendChild(b);  
  
   return b.contentDocument.body.innerHTML;  
}  

Aktuell liefert mir die Funktion "T" aber immer nur einen leeren Inhalt zurück.
Im Browser sehe ich hingegen den erzeugten iframe und dessen Inhalt, d.h. an einer falschen Pfadangabe zur einzulesenden Textdatei liegt es nicht.

Sicherheitsaspekte sind hier erstmal nebensächlich. Die Absicherung wird ergänzt, sobald die Funktionalität gegeben ist.

Was habe ich falsch gemacht?

Vielen Dank und Gruß
Enrico

  1. Lieber Enrico,

    Sicherheitsaspekte sind hier erstmal nebensächlich. Die Absicherung wird ergänzt, sobald die Funktionalität gegeben ist.

    bist Du Dir da "sicher"...?

    Was habe ich falsch gemacht?

    Du hast wahrscheinlich den Aspekt Sicherheit völlig falsch eingeschätzt. Meines Wissens nach verbietet Dir der Browser Zugriff auf den Inhalt eines Dokuments in einem "fremden" Frame. Du suchst nach dem Stichwort "SOP" oder "same-origin-policy". Die Sicherheitseinstellungen Deines Browsers könnten Dir nämlich hier den Zugriff verweigert haben.

    Liebe Grüße,

    Felix Riesterer.

    --
    "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
    1. Hallo Felix,

      der Code, der den Frame erzeugt und eine Textdatei einlesen soll sowie die einzulesenden Textdateien selber sind alle innerhalb einer Domäne. Aktuell noch der localhost, wenn alles funktioniert unser Webspace.

      Sonst würde mir der Browser nicht den eingelesenen Inhalt im iframe anzeuge, oder liege ich hier falsch?

      Gruß,
      Enrico

      1. Aloha ;)

        der Code, der den Frame erzeugt und eine Textdatei einlesen soll sowie die einzulesenden Textdateien selber sind alle innerhalb einer Domäne. Aktuell noch der localhost, wenn alles funktioniert unser Webspace.

        Hm, innerhalb derselben Domäne. Okay. Ganz, ganz sicher, dass ALLES gleich ist? Um es wie mein Chrome zu sagen: Protocols, domains, and ports must match.

        Sonst würde mir der Browser nicht den eingelesenen Inhalt im iframe anzeuge, oder liege ich hier falsch?

        Da liegst du tatsächlich falsch. Die Same Origin Policy ist ein JavaScript-Konzept. iframes unterliegen dieser Restriktion nicht generell. Es ist also durchaus möglich, iframes von anderen Orten anzuzeigen. Ob du mit JavaScript darauf Zugriff hast ist daraus nicht abzulesen.

        Check doch mal in deiner Javascript-Konsole (alias Devtools - egal ob Chrome native, Firefox native, Opera native, Firebug...) ob du irgendwelche Fehler angezeigt bekommst. Denn in meinem Minimalbeispiel funktionierts mit deiner Methode. Feel free to edit & update / fork ;)

        Grüße,

        RIDER

        --
        Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
        ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
        1. Aloha ;)

          Martins Antwort dürfte damit wohl alles geklärt haben. Kein Wunder.

          Grüße,

          RIDER

          --
          Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
          ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
  2. Hi,

    function T (a) // Textdatei laden

    {
       var b = document.createElement("iframe");

    b.setAttribute("src", "../../TXT/" + a + ".txt");

    document.body.appendChild(b);

    return b.contentDocument.body.innerHTML;
    }

    
    > Aktuell liefert mir die Funktion "T" aber immer nur einen leeren Inhalt zurück.  
      
    es würde mich wundern, wenn's anders wäre. Denn du lässt dem Browser gar keine Zeit zum Laden der Ressource. Du erzeugst ein iframe-Element, gibst ihm ein src-Attribut (btw: Warum so umständlich? Ein einfaches b.src="..." wäre einfacher) und hängst es ins Dokument ein.  
      
    Aber erst wenn die Funktion beendet ist und der Browser wieder "Langeweile hat", kümmert er sich darum, die auf diese Weise angeforderte Ressource auch zu laden. Du müsstest also die Auswertung bzw. das Lesen des Inhalts verzögern, am besten indem du es an das onload-Event des iframe bindest. Bei der Gelegenheit kannst du auch noch mit einem onerror-Handler den Misserfolg feststellen, falls es mal schiefgeht.  
      
    
    > Im Browser sehe ich hingegen den erzeugten iframe und dessen Inhalt  
      
    Ja. Aber erst ein paar Sekundenbruchteile später. Du schickst quasi deinen kleinen Buben zum Brötchenholen, und greifst sofort im selben Augenblick in den Einkaufskorb und wunderst dich, dass keine Brötchen drin sind.  
      
    
    > Sicherheitsaspekte sind hier erstmal nebensächlich. Die Absicherung wird ergänzt, sobald die Funktionalität gegeben ist.  
      
    Die Einstellung ist verbreitet. Empfehlenswert ist sie aber nicht.  
      
    Ciao,  
     Martin  
    
    -- 
    In der Theorie stimmen Theorie und Praxis genau überein.  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Hallo Martin,

      onload-Event des iframe

      Perfekt! Das war's! :-)

      Danke Dir!

      Gruß,
      Enrico