Stefan Hubert: Window über Namen ansprechen / Zugriff auf 'fremde' Windows

Hi,

Kurz:
Kann ich in JavaScript ein (zuvor mit window.open(<source>,<name>....) geöffnetes) window-objekt
wieder über <name> ansprechen und/oder prüfen, ob es existiert (hab nichts gefunden, wahrscheinlich hab'
ich aber was übersehen)?
Kann ich weiterhin auf seine Eigenschaften und Methoden und (in der Source selbstdefinierten)
JavaScript-Funktionen zugreifen (Zugriffsschutzmechanismen) ?

Ausführlich:
Hintergrund ist, dass ich ein Help-Fenster geöffnet habe, dann eine andere Source in das opener-Window
geladen wird (die Verweisvariable auf das Help-Window geht also verloren). Dieses neue Dokument im
Opener-Window soll aber wieder aktiv mit dem Help-Fenster kommunizieren können.
Diese Anforderung rührt daher:
Im Help-Fenster soll immer eine Hilfe zum aktuellen Dokument im opener-Window angezeigt werden.
Dazu benötigt das Help-Window  u.a. die URL des Main-Windows (das hängt mit dem Mechanismus
zusammen, unter dem die Hilfetexte aus einer Datenbank geholt werden können). Da das ja so nicht
vorgesehen ist, dass das Help-Window die location des Main-Windows abfragt (Zugriffsschutz bei
unterschiedlicher Source-Domain), dachte ich mir, dass die Dokumente im Main-Window ihre URL an das
Help-Window veröffentlichen können (über ein JavaScript ). Dazu müssten sie allerdings das Help-Window
ansprechen können (genauer: eine JavaScript Funktion im Help-Window-Document). Oder ist das Aufrufen
einer JavaScript-Funktion in einem Fremden Fenster auch nur bedingt möglich (gleiche Source Domain
beider Sources erforderlich..).
Ich kann leider nicht davon ausgehen, dass die Source des Help-Windows aus der gleichen domain
kommt, wie die dokumente im Main-Window.

Ich hätte also 3 Fragen:

1. Kann ich ein Window-Object über den beim öffnen angegebenen Namen ansprechen
    (wozu sonst kann ich einen Namen angeben )?
2. Betrifft der Zugriffsschutz bei verschiedener Source-Domain auch Methoden wie 'focus()',
    oder selbstdefinierte Java-Script-Funktionen?
3. Welche Eigenschaften/Methoden/selbstdefinierte JavaScript-Funktionen sind überhaupt,
    wann geschützt? Hat vielleicht jemand eine Quelle, oder einen Tipp, wo ich mal nachschauen kann?

vielen Dank schon mal,
schön wenn mir jemand von Euch einen Schritt weiterhelfen kann,

Stefan

  1. Grundsätzlich sollte das so gehen:

    myWindow = window.open(...

    Dann steuerst du mit "myWindow" das ganze und kannst viele Funktionen wie "focus()" damit verweden.

    Probiers aus :)

    Gruß
    Thomas J.

    1. Hallo Thomas,

      Danke für Deine Reaktion, aber leider ist das noch nicht ganz mein Problem. Vielleicht habe ich mich ein
      bisschen unglücklich ausgedrückt.

      Ich habe nicht allein das Problem, das Fenster zu öffnen und mir einen Verweis in einer Variable zu
      merken, sondern ich habe den Verweis nicht mehr (weil ein Dokument zuvor das Fenster geöffnet hat / oder
      auch nicht...). Ich weiß aber z.B. den Namen, unter dem das Fenster geöffnet wurde, und möchte jetzt
      prüfen, ob es existiert, und es ev. ansprechen.

      Hmm... ob das irgendwie geht?

      Gruß

      Stefan

      1. Hallo Stefan,

        ich weiß nicht, ob ich Dich richtig verstehe, aber wenn's Dir nur drum geht zu überprüfen, ob das Fenster offen ist oder nicht, ist window.closed (s. <../../tecb.htm#a2>) das richtige für Dich.

        Grüße,

        Utz

        1. Hallo Utz,

          Unter dem Link, in Deiner Antwort habe ich folgendes gefunden:

          <script language="JavaScript">
            var InfoWin = window.open("datei2.htm", "Zweitfenster");
            function CheckOpen()
            {
             if(InfoWin.closed == true) alert("Fenster wurde geschlossen");
             else alert("Fenster noch offen");
            }
          </script>

          Mit 'InfoWin.closed' kann ich abfragen, ob es noch geöffnet ist.
          Leider habe ich aber den Verweis 'InfoWin' nicht (mehr), sondern weiß nur noch, das irgend jemand
          zuvor vielleicht ein Fenster mit dem Namen 'Zweitfenster'  z.B. so:

          var InfoWin = window.open("datei2.htm", "Zweitfenster");

          geöffnet hat
          Die Variable InfoWin gibt es bei mir aber nicht (ich bin in einem anderem Dokument, als jenes, das das
          Fenster mal geöffnet hat.). Ich habe dafür aber den Namen, unter dem das Fenster hoffentlich mal geöffnet
          wurde, nämlich "Zweitfenster". Die Frage ist, ob mir das was bringt. Kann ich diese Information dazu benutzen, wieder einen Verweis auf das "Zweitfenster" Fenster zu bekommen (also eine Variable InfoWin2 neu mit diesem Fenster belegen zu können). Ideal wäre eine Funktion, wie folgt:

          var InfoWin2 = navigator.windows("Zweitfenster");
          ...                                 ~~~~~~~~~~~~~~~~~
          InfoWin2.tueirgendwas(...);

          oder ähnlich....

          Falls das garantiert nicht geht, würde ich es gern wissen...
          (Das sind schon hohe Anforderungen, die ich stelle oder?)  :-)

          Gruß

          Stefan

          1. Hi Stefan,

            so allmählich versteh ich das Problem. Hast Du denn schon mal ganz einfach if(parent.Zweitfenster) versucht? Andernfalls hilft immer noch, die Variable über ein Frameset, Querystring oder Windownamen mitzuschleppen.

            Grüße,

            Utz

            1. Hi Utz,

              mit
              if(parent.Zweitfenster)
              scheint es erstmal nicht zu gehen, aber Du denkst irgenwie müsst das so gehen? Welches Object müsste denn Deiner Meinung nach 'Zweitfenster' kennen?
              (navigator oder window  / wer ist parent?)

              Trotzdem vielen Dank

              Gruß,

              Stefan

              1. Hi Stefan,

                ich hab etwas in der Richtung mal gemacht, ja, aber dann aus anderen Gründen verworfen und deswegen mehr oder weniger vergessen - sorry about that.
                Alternativ könntest Du noch if(top.Zweitfenster) oder auch nur if(Zweitfenster) mal testen - ich weiß nur noch, dass ich mich reichlich gewundert, als ichs raus hatte, weil ich die Logik hinter der Antwort auf die Frage

                (navigator oder window  / wer ist parent?)

                beim besten Willen nicht verstanden habe. Deswegen hab ich's dann auch gleich wieder vergessen.
                Zum Thema Fensternamen ist übrigens recht erhellend http://www.teamone.de/selfaktuell/artikel/wertueb.htm, obwohl's da eigentlich um was anderes geht, dass dann aber auch mit window.name gelöst wird.

                Viel Glück noch!

                Utz

                1. Hallo Utz!

                  Laut http://developer.netscape.com/docs/manuals/js/client/jsref/window.htm zeigen bei Nichtvorhandensein eines Framesets die Eigenschaften 'top' und 'parent' auf dasselbe Objekt wie 'window' und 'self', naemlich auf *das* window-Objekt. Nach meinen Beobachtungen gilt das zumindest bei Netscape 4 auch fuer die Eigenschaft 'frames'.

                  ich hab etwas in der Richtung mal gemacht, ja, aber dann aus anderen Gründen verworfen und deswegen mehr oder weniger vergessen - sorry about that.
                  Alternativ könntest Du noch if(top.Zweitfenster) oder auch nur if(Zweitfenster) mal testen - ich weiß nur noch, dass ich mich reichlich gewundert, als ichs raus hatte, weil ich die Logik hinter der Antwort auf die Frage

                  (navigator oder window  / wer ist parent?)

                  Wo ist dieser Thread? Ich finde ihn nicht mehr.

                  So lange

                  1. Hi Roland,

                    Wo ist dieser Thread? Ich finde ihn nicht mehr.

                    War kein Thread - da hab ich doch mal tatsächlich was _ohne_ Forum gemacht :-)

                    Allerdings: die Verwirrung wird jetzt immer größer - wie ich weiter oben las, gehst Du davon aus, dass das opener-Window komplett geschlosen wird; ich nahm an, das Fenster bleibt zwar da, nur der Inhalt ändert sich.

                    Grüße,

                    Utz-der-jetzt-dann-bald-völlig-verwirrt-ist

                    1. Hi!

                      War kein Thread - da hab ich doch mal tatsächlich was _ohne_ Forum gemacht :-)

                      Mmh.. Ich dachte, Wowbagger haette da neulich einen gemacht. So ist das mit dem Gedaechtnis...

                      Allerdings: die Verwirrung wird jetzt immer größer - wie ich weiter oben las, gehst Du davon aus, dass das opener-Window komplett geschlosen wird; ich nahm an, das Fenster bleibt zwar da, nur der Inhalt ändert sich.

                      Oops, stimmt. :-) Dann passt das mit dem Frameset. window.name jedoch nicht. Du kannst dort zwar den Namen einer Variable speichern, aber deren Inhalt ist dann trotzdem vergessen.

                      So lange

              2. Hi Stefan und Utz,

                ich (Vorsicht, JS-Neuling) bastele gerade an was Vergleichbarem. Ich hatte das eigentlich so verstanden, daß parent nur im Zusammenhang mit Frames eine Rolle spielt. Also kann ich nur sowas machen wie Roman oben geschrieben hat:

                fensterchen = window.open("blabla.html", "hilfe" ...);

                Damit der Variablenname erhalten bleibt, könnte man ihn doch vielleicht in einem unsichtbaren frame parken und dann sowas schreiben, wie

                parent.unsichtbar.fensterchen=window.open("blabla.html", etc).

                Was meint ihr, geht das?

                Liebe Grüße, Uschi

                1. Hallo Uschi! (and welcome back)

                  Damit der Variablenname erhalten bleibt, könnte man ihn doch vielleicht in einem unsichtbaren frame parken und dann sowas schreiben, wie
                  parent.unsichtbar.fensterchen=window.open("blabla.html", etc).
                  Was meint ihr, geht das?

                  Klar geht das. ;-) Wenn allerdings das Fenster geschlossen wird, in dem das ganze Frameset ist, ist die Variable dann halt auch wieder weg. So wie ich Stefan verstanden habe, ist genau das bei ihm auch der Fall. Aber wenn das fuer Deine Anwendung ok ist, dann kannst Du's einsetzen.

                  So lange, Roland

  2. Auch Hi!

    Kurz:
    Kann ich in JavaScript ein (zuvor mit window.open(<source>,<name>....) geöffnetes) window-objekt
    wieder über <name> ansprechen und/oder prüfen, ob es existiert (hab nichts gefunden, wahrscheinlich hab'
    ich aber was übersehen)?

    Kurz: Ja. ;-)

    Na gut, *pruefen* kannst Du es meines Wissens nicht, aber wenn Du den Fensternamen hast, kannst Du Dir eine neue Referenz auf das Objekt holen. Und das geht, indem Du

    wnd = window.open("", "WindowName");

    schreibst. Und stehen tut das alles bei http://developer.netscape.com/docs/manuals/js/client/jsref/window.htm#1202731.

    Kann ich weiterhin auf seine Eigenschaften und Methoden und (in der Source selbstdefinierten)
    JavaScript-Funktionen zugreifen (Zugriffsschutzmechanismen) ?

    Meinst Du Eigenschaften des window-Objekts, das innerhalb des Popups mit 'window' referenziert wird, als z.B. window.myVar ? Weiss ich auch nicht. Ich denke aber mal, Du holst Dir hier nur eine weitere Referenz auf ein und dasselbe Window-Objekt (dass also kein wirklich neues geschaffen wird), und dann sind die Eigenschaften natuerlich alle drin.

    Da, falls das Fenster noch nicht existiert, mit obigem Befehl ein neues geoeffnet wird, ist es vermutlich besser, wenn Du gleich die ganzen Window attributes im dritten Parameter mit angibst.

    1. Kann ich ein Window-Object über den beim öffnen angegebenen Namen ansprechen
          (wozu sonst kann ich einen Namen angeben )?

    Siehe oben. Der Name wird uebrigens auch im TARGET-Attribut eines A-Tags verwendet.

    1. Betrifft der Zugriffsschutz bei verschiedener Source-Domain auch Methoden wie 'focus()',
          oder selbstdefinierte Java-Script-Funktionen?
    2. Welche Eigenschaften/Methoden/selbstdefinierte JavaScript-Funktionen sind überhaupt,
          wann geschützt? Hat vielleicht jemand eine Quelle, oder einen Tipp, wo ich mal nachschauen kann?

    Schau mal bei http://developer.netscape.com/docs/manuals/js/client/jsguide/sec.htm#1015705.

    Und natuerlich immer wieder zu empfehlen: http://developer.netscape.com/docs/manuals/javascript.html.

    So lange

    1. Hallo Calocybe,

      Ich glaube
      wnd = window.open("",<name>,..);
      ist das, was ich brauche. Hoffentlich geht das beim IE genauso (ich werd's gleich probieren..)
      Vielen Dank auch für Deine Links, ich werd mal schauen....

      Stefan