Flexter: JavaScript, DOM und zwei Fenster

(Besser in Courier formatieren wg. fester Zeichenbreite)

Also,

folgende Problematik:

Ich habe eine Hauptseite mit frames, darunter einen Frame
(DynaFrame) mit einem JavaScript, welches Dynamischen Inhalt aufruft
und anzeigt. Innerhalb des Framesets geht das schon 1A... nur...

Wie schaffe ich es, aus einem Popupfenster, was aus dem speziellen
Frame geöffnet worden ist, auf die JavaScript.Funktionen von meinem
Frame zuzugreifen?

So sieht die Struktur aus (Sorry für die Turtlegrafik):

+--------------------------------+
                                  | MeinScript.js:                 |
Hauptfenster:                     +--------------------------------+
+============+                    | var Rota[1] = "test.htm];      |
|Titel       |                    | function ChangeContent(IdxChg) |
+============+                    |  {                             |
|            |                    |   self.location=Rota[IdxChg];  |
|Body        |   +--------------->|  }                             |
|            |   |                |   ...usw                       |
|            |   |                +--------------------------------+
+============+   |                                              A
|DynaFrame   |<--+                                              |
|          X |-------------> X öffnet ein Popupfenster          |
+============+                                                  |
     |                                                          |
     |                                                          |
     |                                         soll darauf zugreifen
     |                                                          |
     v                                                          |
Popupfenster:                                                   |
+============+                                                  |
|            |                                                  |
|            |                                                  |
|            |                                                  |
| Link       |<-------- Link soll Funktion ChangeContent(WhichCont)
|            |          im Hauptfenster.DynaFrame ausführen, welche
+============+          sich in MeinScript.js im DynaFrame befindet
                        (über <script src="MeinScript.js> )

Wunschgedanke und Problem:

Es soll also eine Interaktion zwischen zwei Fenstern (sog. Remote
Control Funktion) stattfinden, wobei die Besonderheit darin liegt,
daß das Hauptfenster auch noch in Frames unterteilt ist und genau
auf die Funktion in einem dieser Frames zugegriffen werden soll.

Ich habe mir zwar die JavaScriptreferenzen hier auf SelfHTML
durchgelesen, blicke da aber nicht so ganz durch und Versuche mit
<a onclick="top.DynaFrame.ChangeContent(1)">Link</a> oder
<a onclick="parent.DynaFrame.ChangeContent(1)">Link</a> oder
<a onclick="window.DynaFrame.ChangeContent(1)">Link</a> oder
<a onclick="document.DynaFrame.ChangeContent(1)">Link</a>

brachten alle den Fehler '...ist Null oder kein Objekt'

Fragestellung:

Frage 1: Ist sowas überhaupt machbar (Wegen Sicherheitsrichtlinien etc.)?

Frage 2: Wenn ja, wie muß die DOM-Referenzierung aussehen, um auf
         die Funktion entsprechend zuzugreifen?

Für Hilfe wäre ich sehr dankbar, denn ich verzweifel schon langsam...

Gruß,

Flexter

  1. Eine sehr ausführliche und anschauliche "Problembeschreibung", da blickt man schnell durch.
    Ich habe zwar nicht die gewünschte Lösung, aber warum bindest du die "MeinScript.js" nicht einfach nochmal im HTML des Popupfensters ein und passt die dortigen Funktionen dahingehend an, dass sie den Richtigen Frame adressieren?

  2. Hallo Flexter!

    Frage 1: Ist sowas überhaupt machbar (Wegen Sicherheitsrichtlinien etc.)?

    Antwort: Kommt darauf an: wenn dein DynaFrame und Popup mit Daten aus der selben Domain geladen werden, dann ja, sonst nein.

    Frage 2: Wenn ja, wie muß die DOM-Referenzierung aussehen, um auf
             die Funktion entsprechend zuzugreifen?

    opener.funktionsaufruf(parameter);

    Greets,
    Richard

  3. folgende Problematik:

    Ich habe eine Hauptseite mit frames, darunter einen Frame
    (DynaFrame) mit einem JavaScript, welches Dynamischen Inhalt aufruft
    und anzeigt. Innerhalb des Framesets geht das schon 1A... nur...

    Wie schaffe ich es, aus einem Popupfenster, was aus dem speziellen
    Frame geöffnet worden ist, auf die JavaScript.Funktionen von meinem
    Frame zuzugreifen?

    Den Zugriff auf die Framestrukturen den hast du ja schon.
    Der Zugriff vom Popup auf das Hauptfenster geht über opener
    ABER!!!

    Wenn im Popup ein Frameset steckt und du innerhalb der Frames auf opener zugreifen musst, dann über top.opener

    Wenn jetzt, wie in deinem Beispiel opener ein frameset ist, dann iste es möglich über opener.parent.anderesFrame zu zugreifen

    Fragestellung:

    Frage 1: Ist sowas überhaupt machbar (Wegen Sicherheitsrichtlinien etc.)?

    Ja, wenn alle Seiten auf der Gleichen Domain (nicht Server!) liegen

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. folgende Problematik:

      Ich habe eine Hauptseite mit frames, darunter einen Frame
      (DynaFrame) mit einem JavaScript, welches Dynamischen Inhalt aufruft
      und anzeigt. Innerhalb des Framesets geht das schon 1A... nur...

      Wie schaffe ich es, aus einem Popupfenster, was aus dem speziellen
      Frame geöffnet worden ist, auf die JavaScript.Funktionen von meinem
      Frame zuzugreifen?

      Den Zugriff auf die Framestrukturen den hast du ja schon.
      Der Zugriff vom Popup auf das Hauptfenster geht über opener
      ABER!!!

      Wenn im Popup ein Frameset steckt und du innerhalb der Frames auf opener zugreifen musst, dann über top.opener

      Wenn jetzt, wie in deinem Beispiel opener ein frameset ist, dann iste es möglich über opener.parent.anderesFrame zu zugreifen

      Fragestellung:

      Frage 1: Ist sowas überhaupt machbar (Wegen Sicherheitsrichtlinien etc.)?

      Ja, wenn alle Seiten auf der Gleichen Domain (nicht Server!) liegen

      Struppi.

      Also wenn ich das jetzt richtig verstanden habe, meinst Du mit opener den Framesetnamen, indem sich die eigentliche HTML mit dem JavaScript befindet (hier DynaFrame), oder ist opener eine fest vergebene JavaScript-Referenzierung, die sich auf das Popup bezieht, welches über den Link geöffnet wird?

      Ich muß fairerweise dazu sagen, daß das popup über ein stinknormalen Link mit target="_blank"-Ziel geöffnet wird, d,h. nicht über eine JavaScriptfunktion. Ist mir aber auch erst jetzt aufgefallen, daß ich das nicht miterwähnt habe.

      Und ja, die Seiten liegen alle auf der gleichen Domain (sogar im selben Verzeichnis), somit kann dies als Fehlerquelle ausgeschlossen werden.

    2. Problem gelöst!!!!

      Danke Struppi für den Hint mit dem opener-Objekt.

      Den Link für den Popup auf JavaScript-Ebene gescriptet und aus dem Popup mit opener.ChangeContent(1) auf das Hauptfenster zugegriffen.

      Das hat sogar die explizite Referenzierung auf den Frame erspart, weil das wohl die window.open-Funktion dem Script mit auf den Weg gibt. Feine Sache, das!

      Funzt 1A in MSIE und Firefox (1.5.0.6)

      Gruß an alle, die geholfen haben!

      TOPIC CLOSED!