Kalle_B: geschachtelte id ansprechen

Hallöle,

ich wollte mal ausprobieren, ob ich aus einem iframe einen Feldwert auslesen kann.

dokument1.htm
-------------
<iframe id=abc src='dokument2.htm'>

dokument2.htm
-------------
<input id=def type=text value='50'>

Leider ergibt dieses Konstrukt in dokument1.htm einen Laufzeitfehler:
alert( document.getElementById( 'abc' ).getElementById( 'def' ).value );

Wie schachtelt man mit Javascript?

LG Kalle

  1. Hi,

    ich wollte mal ausprobieren, ob ich aus einem iframe einen Feldwert auslesen kann.
    [...]
    Leider ergibt dieses Konstrukt in dokument1.htm einen Laufzeitfehler:
    alert( document.getElementById( 'abc' ).getElementById( 'def' ).value );

    Wie schachtelt man mit Javascript?

    Mit "Verschachtelung von IDs" hat das nichts zu tun.

    getElemenentbyId ist eine Methode des document-Objektes - mit dem ersten getElementById greifst du aber nur auf das Iframe-Element zu, und nicht auf das in ihm liegende Dokument.

    http://xkr.us/articles/dom/iframe-document/

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Hi,

      http://xkr.us/articles/dom/iframe-document/

      _das_ Beispiel (blauer Hintergrund) klappt bei mir in der Opera.

      _mein_ Beispiel klappt nicht, Meldung:
      Security error: attempted to read protected variable

      Der scr im iframe kommt von einer anderen Domain. Ich hatte gehofft, wenn das Dokument im iframe seine Höhe ausrechnet und in einem Feld ablegt, diesen Wert lesen zu können und das iframe entsprechend anzupassen.

      Wieder nichts. Oder kann man da noch tricksen?

      LG Kalle

      1. Hi,

        _mein_ Beispiel klappt nicht, Meldung:
        Security error: attempted to read protected variable

        Der scr im iframe kommt von einer anderen Domain.

        *Seufz*
        Same Origin Policy.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Hi,

          Der scr im iframe kommt von einer anderen Domain.

          Noch eine Idee, aber recht kompliziert.

          Kann Javascript eine Datei von einer fremden Domain lesen?

          Wenn ja, dann könnte das Dokument im iframe per Ajax seine Höhe an ein PHP- Script melden, das hinterlegt eine Textdatei mit dem Wert auf def.de.

          Zeitversetzt liest dann das Dokument abc.de (mit dem iframe) diese Datei von def.de.

          Warum ist das mit iframe überhaupt so problematisch? Wenn ich window.open mache, kann ich doch auch zugreifen, oder?

          LG Kalle

          1. Hi,

            Kann Javascript eine Datei von einer fremden Domain lesen?

            Wenn ja, dann könnte das Dokument im iframe per Ajax seine Höhe an ein PHP- Script melden, das hinterlegt eine Textdatei mit dem Wert auf def.de.

            Wenn das PHP-Script auf dem selben Server liegt, wie das Dokument im Iframe ...
            (Oder wenn JavaScript ein neues Img-Objekt erzeugt, dieses betrifft die Samer Origin Policy nicht.)

            Aber dann musst du auch fuer jeden Nutzer eine Textdatei erstellen.

            Warum ist das mit iframe überhaupt so problematisch? Wenn ich window.open mache, kann ich doch auch zugreifen, oder?

            Noe, da gilt die Same Origin Policy genauso.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. Hi,

              Wenn das PHP-Script auf dem selben Server liegt, wie das Dokument im Iframe ...

              Ja, sonst klappt Ajax wieder nicht, ist mir bekannt.

              (Oder wenn JavaScript ein neues Img-Objekt erzeugt, dieses betrifft die Samer Origin Policy nicht.)

              Wie? Javascript im iframe erzeugt ein Img-Objekt und Javascript ausserhalb des iframe kann zugreifen?

              Das Img-Objekt könnte dann ja eine bestimmte ID haben und der name='x500' ist dann die Höhe in Pixel?

              Aber dann musst du auch fuer jeden Nutzer eine Textdatei erstellen.

              Ja. Deren Name wird von abc.de vorgegeben (mit Millisekunden drin) und nach - sagen wir mal - 3 sec. von Server abc.de bei def.de gelesen.

              LG Kalle

              1. Hi,

                (Oder wenn JavaScript ein neues Img-Objekt erzeugt, dieses betrifft die Samer Origin Policy nicht.)

                Wie? Javascript im iframe erzeugt ein Img-Objekt und Javascript ausserhalb des iframe kann zugreifen?

                Nein, aber die Bildressource kann von einer Fremddomain stammen, und einen GET-Parameter an diesen uebermitteln.

                Aber dann musst du auch fuer jeden Nutzer eine Textdatei erstellen.

                Ja. Deren Name wird von abc.de vorgegeben (mit Millisekunden drin) und nach - sagen wir mal - 3 sec. von Server abc.de bei def.de gelesen.

                Und woher weiss example.com, welche Ressource es von example.net anfordern soll?

                MfG ChrisB

                --
                „This is the author's opinion, not necessarily that of Starbucks.“
                1. Hi,

                  Ja. Deren Name wird von abc.de vorgegeben (mit Millisekunden drin) und nach - sagen wir mal - 3 sec. von Server abc.de bei def.de gelesen.

                  Und woher weiss example.com, welche Ressource es von example.net anfordern soll?

                  Die Frage nach der vorangegangenen Erklärung habe ich nicht verstanden.

                  1. (abc.de) <iframe src='http://def.de/example.php?dateiname=x9192939495...
                  2. (def.de im iframe) meldet Höhe an def.de/ajax.php?dateiname=x9192939495...
                  Zeit vergeht (3 sec)
                  3. (abc.de) Javascript liest Datei http://def.de/x9192939495... und ändert mit dem Inhalt (478) das iframe auf diese Pixelhöhe.

                  Bevor ich aber _den_ Zirkus veranstalte, muss ich wissen, ob Punkt 3 funktionieren _kann_

                  Punkt 1: der Dateiname x9192939495... könnte von Javascript erzeugt werden, wenn JS abgeschaltet ist, beginnt das Spielchen gar nicht erst.

                  LG Kalle

                  1. guckst du einfach hier: osmer.de

                    ruft in iframe auf: remso.de

                  2. Hi,

                    1. (abc.de) <iframe src='http://def.de/example.php?dateiname=x9192939495...
                    2. (def.de im iframe) meldet Höhe an def.de/ajax.php?dateiname=x9192939495...
                      Zeit vergeht (3 sec)

                    Und die soll reichen?

                    1. (abc.de) Javascript liest Datei http://def.de/x9192939495... und ändert mit dem Inhalt (478) das iframe auf diese Pixelhöhe.

                    Bevor ich aber _den_ Zirkus veranstalte, muss ich wissen, ob Punkt 3 funktionieren _kann_

                    Das JavaScript von example.com [1] kann per AJAX nur Ressourcen anfordern, die auch unter example.com liegen. Der Iframe unter der anderen Domain example.net muesste also seine Hoehe an example.com "melden".

                    [1] Merkst du was ...?

                    MfG ChrisB

                    --
                    „This is the author's opinion, not necessarily that of Starbucks.“
                    1. Hi,

                      [1] Merkst du was ...?

                      Ja, wir drehen uns im Kreis. Aber du schriebtest, Images können zwischen den Paralleluniversen ausgetauscht werden?

                      Wie wäre denn dies: Der INNER-iframe meldet seine Höhe an _seinen_ Server. Der generiert ein (leeres) Bild mit der genannten Höhe.

                      Der OUTER-iframe liest dieses Bild vom fremden Server und weiss aufgrund der Höhe, wie er jetzt den frame einstellen muss.

                      LG Kalle

                      1. Wie wäre denn dies: Der INNER-iframe meldet seine Höhe an _seinen_ Server. Der generiert ein (leeres) Bild mit der genannten Höhe.

                        Der OUTER-iframe liest dieses Bild vom fremden Server und weiss aufgrund der Höhe, wie er jetzt den frame einstellen muss.

                        Irgendwie ist das doch vollkommen durchgeknallt. In einem Browser-Fenster können sich zwei Elemente nicht verständigen und korrespondieren nur über ihre "Anwälte" *kopfschüttel*

                        1. Hallo,

                          kann man nicht von beiden window-variablen setzten? oder sowas wie window.name? darein kann man doch was speichern...

                          mfg, Flo

                          --
                          sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
                          1. kann man nicht von beiden window-variablen setzten? oder sowas wie window.name? darein kann man doch was speichern...

                            Selbst das window ist kein window mehr. Im iframe:
                            <div id=ganzunten></div>

                            <div id=ganzunten></div>  
                            <script type="text/javascript">  
                            //alert( document.getElementById('ganzunten').offsetTop );  
                              var hoehe = document.getElementById('ganzunten').offsetTop;  
                              var winname_alt = window.name;  
                              var winname_neu = 'x' +hoehe;  
                              window.name = winname_neu;  
                              alert( "alt=[" +winname_alt +"] neu=["  +winname_neu +"]" );  
                            </script>  
                            
                            

                            Anzeige: alt=[remsoframe] neu=[x1895]

                            Dokument mit dem iframe, 3 sec. später:

                              alert ( document.getElementsByTagName('iframe')[0].name +"/" +document.getElementsByTagName('iframe')[0].id );  
                            
                            

                            Anzeige: /remsoframe

                            Also weder name noch id des iframe lassen sich "von innen" ändern.

                            Kalle

                            1. Du solltest dir nochmal durchlesen, was ChrisB geschrieben hat:
                              https://forum.selfhtml.org/?t=182978&m=1211594
                              Denn du verwechselst iframe-Elementobjekt und das window-Fensterobjekt des IFrames immer noch.

                              window.name = winname_neu;

                              Hier legst du eine Eigenschaft am window-Objekt an.

                              alert ( document.getElementsByTagName('iframe')[0].name

                              Hier liest du ein Attribut vom iframe-Element.

                              Die haben nichts miteinander zu tun.

                              Siehe ChrisBs Link, wenn du auf das window-Objekt des Dokuments im iframe zugreifen willst, verwende window.frames.iframeName mit <iframe name="iframeName">

                              Die Frage wäre also, ob window.frames.iframeName.name geändert wurde.

                              Also weder name noch id des iframe lassen sich "von innen" ändern.

                              Fenstername != name-Attribut des iframe-Elementobjekt!

                              Mathias

                          2. kann man nicht von beiden window-variablen setzten? oder sowas wie window.name? darein kann man doch was speichern...

                            Das geht m.W. nur mit Folgeseiten, also wenn im selben Fenster erst URI von example.org und dann von example.net angezeigt werden. Dann kann example.org in window.name eine Nachricht hinterlassen, die example.net auslesen könnte.
                            Siehe auch http://aktuell.de.selfhtml.org/artikel/javascript/wertuebergabe/

                            Mathias

                            1. kann man nicht von beiden window-variablen setzten? oder sowas wie window.name? darein kann man doch was speichern...

                              Das geht m.W. nur mit Folgeseiten, also wenn im selben Fenster erst URI von example.org und dann von example.net angezeigt werden. Dann kann example.org in window.name eine Nachricht hinterlassen, die example.net auslesen könnte.

                              Das ist schon richtig, aber es kann auch mit einem iframe funktionieren. Dazu muss die Parent-Dokument die URI des iframes wieder auf eine Seite auf derselben Domain lenken. Die hat dann Zugriff auf das gesetzte window.name und kann problemlos mit dem Parent-Dokument kommunizieren, weil die Same-Origin-Policy nicht mehr gilt. So macht es z.B. Dojo:

                              »The name property is only accessible for frames that are in the same domain. This means that Dojo must navigate the frame back to the origin domain after the remote web service page has been loaded, in order to access the name property.«

                              Kalle könnte also einen zweiten unsichtbaren iframe genau in dieser Weise nutzen, dann ginge die Datenübertragung mit window.name. Finde ich aber sehr umständlich...

                              Mathias

                      2. Hi,

                        Aber du schriebtest, Images können zwischen den Paralleluniversen ausgetauscht werden?

                        JavaScript kann ein neues Img-Objekt erzeugen, und dessen Adresse kann unterhalb der anderen Domain liegen.
                        Damit laesst sich dann natuerlich auch ein Parameter uebergeben.

                        MfG ChrisB

                        --
                        „This is the author's opinion, not necessarily that of Starbucks.“
                    1. (abc.de) Javascript liest Datei http://def.de/x9192939495... und ändert mit dem Inhalt (478) das iframe auf diese Pixelhöhe.

                    Die Datei kann entweder ein dynamisch generiertes Bild sein, deren Größe du über .height/.width auslesen kannst. Die Größe könnte dann der Soll-Iframe-Höhe entsprechen.
                    Oder die Datei ist ein mit <script src> eingebundenes Script, dass eine Callback-Funktion ausführt und ihr den Wert übergibt. Das ginge.

                    Für solche Zwecke gibt es in neueren Browsern Cross-Domain Messaging über postMessage und entsprechende Events.

                    Mathias