ruedi: ansprechen eines popups, wenn eltern veraendert werden

guten tag forum.

ich habe ein verstaendnisproblem.
ich bin kein blutiger anfaenger, aber laie. weil autodidakt und kein profi in objektreferenzen, moechte ich nach viel forumslektuere trotzdem dies mit euch teilen (da ich das problem nicht erlesen konnte, kann es gut sein, dass es ein bloeder gedankenfahler von mir ist):

ich oeffne im frameset ein popup, das ich bename.
aus diesem kann ich den mainframe opener.framename.location ansprechen, ich kann mit target oder window.open neue seiten ins popup schreiben, alles prima.

ich wollte in erster linie erreichen, dass bei mainframe-refresh auch das popup aktualisiert wird, aber kein neues geoeffnet wird, wenn es zu ist.

wie frage ich den browser, ob es dieses fenster schon gibt?

if (fakten.closed() == true) funktioniert naemlich nicht, wenn der mainframe (elternframe) geaendert wurde.

im tipps-und-tricks-bereich steht sogar ein workaround fuer den fall, dass sich der mainframe aendert und sich das kind evtl. nicht mehr an seinen vater erinnert.

hier benutzte ich (nicht lachen), die in selfhtml erklaerte methode, den window.name eines sich nicht veraendernden frames als variablenuebergabeplatz (fakten='open' oder fakten='closed') zu verwenden.

aber das muss doch auch einfacher gehen!

wenn ich per target oder window.open eine datei hineinlade, weiss der doch auch, dass das fenster da ist, und wenn er das fenster nicht kennt, macht er eins auf, das so heisst.

wie frage ich nach der existenz eines fensters?

und dann kam ich zu wirklichen problemen.

ich merkte naemlich, dass sich mein aufgemachtes popup in keinem fall per name ansprechen laesst. ich bewege mich korrekt in der framehierarchie, frage im popup nach dem opener, es kennt seinen vater, spreche im openerframe den befehl aus: fakten.close(), und das ding tut nichts.
alle anderen frames im set kann ich von diesem frame aus veraendern, nur das popup nicht.

ich erinnerte mich, dass netscape mac frueher (3 oder 4) ein problem hatte, sich framenamen zu merken, aber hier ist es auf ie 5 und auch auf windows mit ie 5 und netscape 6 dasselbe.

fakten is not defined. obwohl ich ihn im selben frame aufgemacht und benamt habe.

die loesung, per window.open eine neue datei hineinzuschicken, die onload=self.close() veranstaltet, kann nicht w3c-konform empfohlen sein, oder??

kann mir jemand helfen, oder einfach einen tipp geben?

da bereits heute jemand im forum ein popup mit namen geschlossen hat, und ich ihn auch nach diesem problem fragen werde, bitte ich, mir zumindest bei der fenster-existenz-frage auf die spruenge zu helfen.

hmm, bei der laenge dieses postings haette ich wohl doch menschelei schreiben sollen ...

besten dank.

der ruedi

p.s. anbei der link, wo das popup realisiert ist, mit allen beschriebenen workarounds (click auf alle fakten oeffnet das popup).

  1. Hallo ruedi,

    ich wollte in erster linie erreichen, dass bei mainframe-refresh auch das popup aktualisiert wird, aber kein neues geoeffnet wird, wenn es zu ist.

    Wieso lässt du es zu, dass über mehrere Dokumente hinweg mehrere Fenster gleichzeitig offen sind?

    wie frage ich den browser, ob es dieses fenster schon gibt?

    Speichere die Fensterreferenz im Frameset-Dokument ab. Da das Frameset selbst unverändert bleibt, während sich der Inhaltsframe mit der jeweiligen Standortbeschreibung ändert, kannst du dort die Fensterreferenz ablegen.

    if (fakten.closed() == true) funktioniert naemlich nicht, wenn der mainframe (elternframe) geaendert wurde.

    Das kann auch gar nicht funktionieren, da kein Objekt namens Fenster existiert, da du kein solches angelegt hast, weil du den Rückgabewert von window.open() nirgendwo abspeicherst, beispielweise:

    var fakten=window.open('[URL]', 'fakten');

    Das steht im von dir offenbar erwähnten Artikel http://aktuell.de.selfhtml.org/tippstricks/javascript/fensterzugriff/.

    Außerdem ist closed eine Eigenschaft, keine Methode, also wenn, dann »if (fakten.closed) ...«.

    im tipps-und-tricks-bereich steht sogar ein workaround fuer den fall, dass sich der mainframe aendert und sich das kind evtl. nicht mehr an seinen vater erinnert.

    Ehrlich gesagt finde ich dein Konzept zweifelhaft. Ich würde simpelst das Faktenfenster automatisch schließen, wenn der Besucher einen anderen Standort oder eine andere Rubrik anwählt. Mit dem Event-Handler onunload könntest du das Fenster schließen, wenn das Dokument verlassen wird.

    hier benutzte ich (nicht lachen), die in selfhtml erklaerte methode, den window.name eines sich nicht veraendernden frames als variablenuebergabeplatz (fakten='open' oder fakten='closed') zu verwenden.

    Das ist unnötig, du kannst die Fensterreferenz wie gesagt im Frameset-Dokument speichern. Über parent kannst du auf das window-Objekt des Framesets zugreifen.

    wenn ich per target oder window.open eine datei hineinlade, weiss der doch auch, dass das fenster da ist, und wenn er das fenster nicht kennt, macht er eins auf, das so heisst.

    wie frage ich nach der existenz eines fensters?

    Auch wenn die Frage ob meiner anderen Hinweise nicht mehr relevant ist:
    Wenn du nur den Fensternamen kennst, bleibt dir meines Wissens nichts anderes übrig, als ein Popup gleichen Namens noch einmal zu öffnen - so stellst du die Verbindung zum eventuell schon offenen gleichnamigen Fenster her - und es dann zu schließen.

    ich merkte naemlich, dass sich mein aufgemachtes popup in keinem fall per name ansprechen laesst. (...) alle anderen frames im set kann ich von diesem frame aus veraendern, nur das popup nicht.

    Siehe oben, du hast die Fensterreferenz weder für das Dokument selbst noch für über mehrere Dokumente hinweg gespeichert.

    ich erinnerte mich, dass netscape mac frueher (3 oder 4) ein problem hatte, sich framenamen zu merken, aber hier ist es auf ie 5 und auch auf windows mit ie 5 und netscape 6 dasselbe.
    fakten is not defined. obwohl ich ihn im selben frame aufgemacht und benamt habe.

    Das dürfte damit gar nichts zu tun haben. Wenn du ein Fenster so öffnest:
    window.open('bla.html', 'meinfenster');
    Kannst du nicht so darauf zugreifen:
    window.alert(window.meinfenster);
    (Gibt »undefined« aus, weil kein Objekt dieses Namens existiert.)

    Abgesehen davon solltest du eine neuere Mozilla/Gecko-Version verwenden als Netscape 6 zugrunde liegt.

    die loesung, per window.open eine neue datei hineinzuschicken, die onload=self.close() veranstaltet, kann nicht w3c-konform empfohlen sein, oder??

    Innerhalb deines jetzigen Konzepts ist es nur logisch. Da die komplette Seite sowieso nicht W3C-konform ist, dürfte das nicht ausschlaggebend sein, aber konkret wüsste ich nicht, was daran immanent nicht valide sein *könnte*.

    Eine Beispiellösung, die wie oben beschrieben die Fensterreferenz im parent-Frameset ablegt:

    Frameset http://home.t-online.de/home/dj5nu/fanhost/tec-frameset.html (hier klicken ;))

    Unterseite http://home.t-online.de/home/dj5nu/fanhost/tec-seite.html
    Popup-Seite http://home.t-online.de/home/dj5nu/fanhost/tec-popup.html

    Der Code ist primitiv gehalten und nicht valide, die JavaScript-Aufrufe sind auch nicht kompatibel eingebaut.

    Öffne testweise das Fenster, lade die Unterseite über den Reload-Link neu (dadurch ginge die Verbindung zum Fenster verloren). In das Fenster sollte beim Neuladen tec-popup.html geladen werden (es kann auch fokussiert werden, die Codezeile ist auskommentiert). Versuche dann das Fenster zu Schließen. Wenn du das Frameset verlässt, wird das eventuell noch offene Fenster geschlossen.

    Ähnlich kannst du dein System realisieren - wobei ich es wie gesagt anders lösen würde. Aber dann würde ich sowieso die Seite umstrukturieren.

    Bitte lies auch http://home.t-online.de/home/dj5nu/js-popup.html. Momentan funktioniert deine Seite aber selbst abgesehen von den Popups nicht ohne JavaScript. Zu der Seite generell könnte viel gesagt werden... Wenn du noch Tipps möchtest, kannst du sie ja bspw. in einem »Bewertungs«-Thread vorstellen.

    Grüße,
    Mathias

    --
    »In anderen Newsgroups werden Pseudonyme akzeptiert, es handelt sich dabei meist um Gruppen, in denen sensible Themen (z.B. psychische oder peinliche Erkrankungen o.ä.) behandelt werden.«
    1. hi mathias!

      besten dank fuer die schnelle hilfe und beispielcode.

      zunaechst: hab mich verschrieben, mozilla/gecko teste ich hier nummer 7.

      dann bin ich beruhigt, dass es offensichtlich keinen ganz einfachen beweis gibt fuer die existenz des fensters. ich dachte (ohne das wirklich zu wissen) an so etwas globales wie
      (if (window.exist)).

      ich frage mich jetzt, was ich mache, wenn ich kein frameset habe.

      naja, und das immerwaehrende auf- und zugehen des popups onload/onunload wollte ich auch vermeiden.

      schoen ist das alles nicht.

      aber die hardcorecoder unter uns wuerden wahrscheinlich einfach keine popups verwenden =)

      herzlichen dank jedenfalls!!

      ruedi