Matthias: Fensterinhalt neu laden?

Hallo Leute,

folgendes Problem bereitet mir Kopfzerbrechen (MSIE 5):

Ich habe eine PHP-generierte HTML-Seite (besteht aus 2 Frames, einer davon ist eher passiv), die per JavaScript (window.open()) ein neues Fenster öffnet, nennen wir es "details". In diesem Fenster befindet sich ein Link; klickt man darauf, lädt sich die PHP-Seite mit veränderten Parametern neu und soll dann dafür sorgen, daß "details" sich anschließend ebenfalls neu lädt. Mein Problem besteht nun darin, daß ich "details" per JavaScript nicht ansprechen kann: ich würde es gern per reload() neu laden oder (wäre noch besser) mit .location.href=... eine neue URL zuweisen, aber alles, was dabei rauskommt, ist die Fehlermeldung "details ist kein Objekt" oder "details ist undefiniert".

Ausschnitte aus dem Source, um das Ganze zu verdeutlichen:

"details" wird geöffnet durch

fenster=window.open("quickinfo.php?dbindex="+idnr, "details", "width=300,height=400, dependent=yes,status=no,toolbar=no,resizable=no,scrollbars=yes,location=no,hotkeys=no");

Wie komme ich aus einem anderen (bzw. neu geladenen) Frame an dieses Fenster dran? Das opener-Objekt hat mir auch nicht helfen können... alles, was ich erreichen will, ist, daß ich auf die Methoden und Eigenschaften von "details" zugreifen kann. Nichts außer Fehlermeldungen (s.o.) gebracht haben

parent.details.location.href=...
top.details.location.href=...
details.location.href=...

... kann mir jemand weiterhelfen? Ich bin für jeden Hinweis dankbar :-)

Gute Nacht,
Matthias

  1. Hallo Matthias

    was dabei rauskommt, ist die Fehlermeldung "details ist kein Objekt" oder "details ist undefiniert".

    Ausschnitte aus dem Source, um das Ganze zu verdeutlichen:

    "details" wird geöffnet durch

    fenster=window.open("quickinfo.php?dbindex="+idnr, "details", "width=300,height=400, dependent=yes,status=no,toolbar=no,resizable=no,scrollbars=yes,location=no,hotkeys=no");

    Du bist über die Fensternamenfalle gestolpert. Dein Objekt über den du auf das Fenster zugreifen kannst heißt fenster

    fenster=window.open(...)

    dieser Ausdruck erzeugt die Referenz darauf.
    Dein Objekt fenster ist ein Fenster mit dem Fensternamen details. Ansprechen mußt du dieses aber immer über "fenster"
    Der Fenstername details dient z.B. dazu, das Fenster auch über einen ganz Link mit target="details" anzusprechen.

    parent.details.location.href=...
    top.details.location.href=...
    details.location.href=...

    je nachdem welcher Frame das Fenster geöffnet hat:

    Framereferenzierung.fenster.location.href

    Viele Grüße

    Antje

    1. Hallo Antje,

      vielen Dank erst einmal :-) Leider war's das nicht, weil das, was Du mir geraten hast, der ursprüngliche Ansatz war, mit dem ich's probiert habe, welcher auch nicht geklappt hat. Vielleicht kannst Du mir nochmal helfen?

      Ganz allgemein: wenn ich in einem Frame mit xy=window.open(...) ein Fenster öffne, kann ich dann auf Methoden und Eigenschaften des Objekts xy von allen anderen Teilen der Seite (alle anderen documents, egal ob in Frames oder weiteren Fenstern) zugreifen? Wenn ja, wie? Das ist der Punkt, an dem ich scheitere, weil ich außer Fehlermeldungen, wie sie in der letzten Mail standen, nichts zurückbekomme. Der Frame, der das Fenster geöffnet hat, hat nach Öffnen des Fensters einen neuen Inhalt bekommen; ist das irgendwie "schlimm" ? (Was wäre, wenn der Frame in der Zwischenzeit gar nicht mehr existiert und ein anderer Frame den Fensterinhalt neu laden oder das Fenster schließen will?)

      In meinem Source sah das so aus (ich hab's eben nochmal ausprobiert, wieder ohne Erfolg): In dem Frame mit Namen "info" steht der JavaScript-Code, der alles anstößt -

      fenster=window.open("quickinfo.php?dbindex="+idnr, "details", "...");

      öffnet das Fenster, wie gehabt. Soweit alles klar. In diesem Fenster, Referenz "fenster", Name "details", wird quickinfo.php geladen, das geht auch. In quickinfo.php gibt's nun einen Link, mit dem man den Inhalt des Frames, aus dem "details" heraus aufgerufen wurde, neu laden kann. Das geht ebenfalls. Das Problem entsteht erst, wenn dieser neue Frame-Inhalt versucht, das Fenster "details" zu schließen. (Gilt "fenster" nicht mehr als Referenz, sobald der Frame-Inhalt überschrieben wurde?)

      Das einzige, was tatsächlich geht, klappt mit Hilfe des Anwenders: <a href="quickinfo.php" target="details">...</a> funktioniert tadellos. Es ist allerdings nicht Sinn der Sache, daß ich den Anwender zum Klicken nötigen will, sondern mein JavaScript soll das schon allein hinbekommen können.

      Ich hab's zur Abwechslung auch mal mit neu laden (über die Methode reload()) probiert, was auch nicht funktioniert:

      info.fenster.location.href ("info ist undefiniert")
      top.fenster.location.href ("top.fenster.location ist kein Objekt")
      parent.fenster.location.href ("parent.fenster.location ist kein Objekt")
      self.fenster.location.href ("self.fenster.location ist kein Objekt")

      Was mache ich falsch? Wäre super, wenn Du das aufklären könntest, denn ich steh' irgendwie vor einem Rätsel :-}

      Vielen Dank und viele Grüße
      Matthias

      1. Hallo Matthias

        Ganz allgemein: wenn ich in einem Frame mit xy=window.open(...) ein Fenster öffne, kann ich dann auf Methoden und Eigenschaften des Objekts xy von allen anderen Teilen der Seite (alle anderen documents, egal ob in Frames oder weiteren Fenstern) zugreifen? Wenn ja, wie? Das ist der Punkt, an dem ich scheitere, weil ich außer Fehlermeldungen, wie sie in der letzten Mail standen, nichts zurückbekomme. Der Frame, der das Fenster geöffnet hat, hat nach Öffnen des Fensters einen neuen Inhalt bekommen; ist das irgendwie "schlimm" ? (Was wäre, wenn der Frame in der Zwischenzeit gar nicht mehr existiert und ein anderer Frame den Fensterinhalt neu laden oder das Fenster schließen will?)

        genau da liegt das Problem. Wird der das Fenster öffnende Frame neu geladen wird die Referenz auf das Fensterobjekt zerstört.

        Dies liegt darin, dass JavaScript immer an eine Webseite gebunden ist. Wird diese Webseite ausgetauscht, sind damit auch alle Informationen verloren.

        Lediglich URL und der Fenstername stehen weiterhin zur Verfügung und bleiben gleich. JavaScriptobjekte werden jedoch komplett gelöscht.

        In meinem Source sah das so aus (ich hab's eben nochmal ausprobiert, wieder ohne Erfolg): In dem Frame mit Namen "info" steht der JavaScript-Code, der alles anstößt -

        fenster=window.open("quickinfo.php?dbindex="+idnr, "details", "...");

        Verlagere doch die Funktion in deinen Topframe. Damit bleibt - solange dieser nicht neu geladen wird - die Referenz auf das Fenster bestehen.

        In quickinfo.php gibt's nun einen Link, mit dem man den Inhalt des Frames, aus dem "details" heraus aufgerufen wurde, neu laden kann. Das geht ebenfalls. Das Problem entsteht erst, wenn dieser neue Frame-Inhalt versucht, das Fenster "details" zu schließen. (Gilt "fenster" nicht mehr als Referenz, sobald der Frame-Inhalt überschrieben wurde?)

        Das Detailfenster kann sich doch in diesem Fall selber schließen.
        Ich gehe davon aus, dass du mit opener.location.href arbeitest. Dann brauchst du nach diesem Aufruf nur noch self.close(); schreiben.

        Was mache ich falsch? Wäre super, wenn Du das aufklären könntest, denn ich steh' irgendwie vor einem Rätsel :-}

        Ich hoffe ein klein wenig Licht in das Dunkel gebracht zu haben.

        Viele Grüße

        Antje