Michael Schröpl: cross-window-Funktionsaufruf oder onTop-Event?

Hallo Leute,

ich bin gerade dabei, meine Gedanken zu sortieren. Das, was ich erreichen möchte, kriege ich im Moment noch nicht hin - aber es könnte sehr wohl sein, daß es einen anderen Weg gibt, den ich bisher einfach nicht sehe.

Ich versuche mal, zu abstrahieren:

Ich habe eine Anwendung mit einem komplexen Frameset in ihrem Fenster (nachfolgend als "1. Fenster" bezeichnet), welche bei einem bestimmten Mausklick ein neues Fenster öffnet (JavaScript, window.open(), nachfolgend "2. Fenster" genannt).
Die Funktion, welche dieses 2. Fenster öffnet, muß gleich anschließend noch etwas tun - nämlich einen "Betriebsmodus" ihres Fenster-Inhalts umschalten (das ist mein eigener JavaScript-Kram mit Event-Überwachung - dort läuft etwas dauerhaft im Hintergrund, was kräftig Ressourcen verbraucht und was ich deshalb nur aktiv haben möchte, wenn der Benutzer dieses Fenster auch wirklich sehen kann).

Nun sei also dieses 2. Fenster offen, und es habe auch erst mal den Fokus. Das 2. Fenster (eine Art "Detail-Ansicht") ist relativ groß und nicht in der Größe veränderlich - solange dieses den Fokus hat, ist das 1. Fenster definitiv nicht sichtbar (unter meinen Randbedingungen).
Das ursprüngliche Fenster steht also im Modus "passiv" irgendwo in Hintergrund.

Irgendwann wird das 2. Fenster nun aber seinen Fokus abgeben (wahrscheinlich geschlossen oder minimiert sein) und das 1. Fenster wieder sichtbar sein. Ich gehe davon aus, daß der Besucher keine weiteren Browser-Fenster offen haben wird - weil das Ganze eine "Anwendung" ist, keine WWW-site - deshalb sind beide Ereignisse möglicherweise (hoffentlich ...) identisch.

Spätestens im zweiten Fall, eventuell aber auch im ersten, möchte ich gerne im 1. Fenster (!) wieder einen JavaScript-Event bekommen, um meinen "Passiv-Modus" wieder auf "aktiv" zurück zu schalten.
Ich habe aber noch keinen Weg gefunden, dies elegant und benutzerfreundlich zu realisieren.

Die Abgabe des Fokus des 2. Fensters kriege ich über den onBlur-Event dieses 2. Fensters mit. Aber wie rufe ich an dieser Stelle eine Funktion auf, die im 1. Fenster definiert ist und _dort_ etwas tun soll?
Irgendwie fehlt mir da der Adressierungspfad durch die Objektstrukturen - und womöglich geht es auch gar nicht in dieser Art und Weise (über Fenster-Grenzen hinweg).

Die andere Möglichkeit wäre, im 1. Fenster zu reagieren.
Dort scheint es aber keinen passenden Event ("onTop"?) zu geben, der mir sagen würde, daß das 1. Fenster wieder sichtbar ist.
Mein Problem wäre keines, wenn ich meine Besucher dazu zwingen würde, einmal in das entsprechende Fenster zu klicken - dann bekommt dieses Fenster einen onFocus-Event und ich kann darauf reagieren.

Ich möchte aber gerne erreichen, daß das Fenster "von selbst" merkt, daß es wieder sichtbar ist. Ich möchte dem Benutzer ersparen, etwas tun zu müssen, damit er in den vorherigen Zustand dieses Fensters zurück gelangt. Dieser eine Mausklick würde erfordern, daß ich ihm begreiflich mache, wieso er ihn braucht ... und das würde ihn einerseits intellektuell überfordern und andererseits ärgern.
Die Lösung mit diesem einen Mausklick (und einem dynamisch eingeblendeten Layer mit dem Erklärungstext) ist meine fallback-Strategie, falls ich nichts besseres mehr finden sollte.

Jeder Hinweis, der mich meinem Ziel näher bringen könnte, wäre mir recht - auch Ideen, das Ganze völlig anders zu lösen. (Die Existenz der beiden Fenster ist allerdings nicht diskutierbar, und die Notwendigkeit, mit diesen beiden "Betriebsmodi" zu arbeiten, auch nicht - denn diese zu etablieren, ohne dabei Funktionalität zu verlieren, ist der Sinn der ganzen Aktion.)
Meine stille Hoffnung gründet sich natürlich darauf, entweder aus dem 2. Fenster heraus die Funktion im 1. Fenster aufzurufen oder im 1. Fenster den passenden Event zu finden ...

Zu unterstützende Browser: Netscape 4 und 6, M$IE 5 und 6. (Mehr wäre angenehm, aber derzeit nicht notwendig.)

Viele Grüße
      Michael

  1. Hallo,

    [...]

    Oh, jeh! Das hört sich ja nach Monster-Projekt an. ;-)

    Die Abgabe des Fokus des 2. Fensters kriege ich über den onBlur-Event dieses 2. Fensters mit. Aber wie rufe ich an dieser Stelle eine Funktion auf, die im 1. Fenster definiert ist und _dort_ etwas tun soll?

    Versuch's mal mit:
      onBlur="opener.NameDerFunktion()"
              ^^^^^^
    siehe: </selfhtml/javascript/objekte/window.htm#allgemeines>

    [...] Dieser eine Mausklick würde erfordern, daß ich ihm begreiflich mache, wieso er ihn braucht ... und das würde ihn einerseits intellektuell überfordern [...]

    Na ja, das ist aber doch hoffentlich übertrieben, oder? ;-)

    Robert

    1. Hi Robert,

      Oh, jeh! Das hört sich ja nach Monster-Projekt an. ;-)

      Ach was ... nur das normale daily business.
      (In diesem Fall noch nicht mal mein eigenes ...)

      Aber wie rufe ich an dieser Stelle eine Funktion
      auf, die im 1. Fenster definiert ist und _dort_
      etwas tun soll?
      Versuch's mal mit:
        onBlur="opener.NameDerFunktion()"
                ^^^^^^
      siehe: </selfhtml/javascript/objekte/window.htm#allgemeines>

      Ah! Ich dachte mir doch, daß man auch so herum adressieren können müßte.
      Ich hatte heute nur die Liste aller Eigenschaften und Methoden von "window" durchgelesen und nichts Passendes gefunden - auf die Idee, das komplette Kapitel durchzuarbeiten und dort dann eine vordefinierte Instanz-Variable zu entdecken, bin ich einfach nicht gekommen.

      Dieser eine Mausklick würde erfordern, daß ich
      ihm begreiflich mache, wieso er ihn braucht ...
      und das würde ihn einerseits intellektuell
      überfordern [...]
      Na ja, das ist aber doch hoffentlich übertrieben,
      oder? ;-)

      "Es gibt keine idiotensichere Software - die Idioten sind zu erfindungsreich."

      Nein, ehrlich - fändest Du es schön, wenn Du auf einer Webseite bewußt eine Automatik eingeschaltet hast, dann eine Details-Ansicht aktivierst und beim Schließen der Details-Ansicht die Automatik aus ist und Du sie wieder einschalten mußt?
      Ich (als Benutzer) würde mich jedenfalls darüber ärgern ... und als Entwickler möchte ich das gerne vermeiden. Andererseits kostet die Automatik eben "Kraft" ...

      Vielen Dank für den Tip (wird morgen vom Kollegen ausprobiert) und ...

      Viele Grüße
            Michael

      1. Hallo,

        Dieser eine Mausklick würde erfordern, daß ich
        ihm begreiflich mache, wieso er ihn braucht ...
        und das würde ihn einerseits intellektuell
        überfordern [...]
        Na ja, das ist aber doch hoffentlich übertrieben,
        oder? ;-)

        "Es gibt keine idiotensichere Software - die Idioten sind zu erfindungsreich."

        Das muss ich mir merken. Kommt das von dir oder ist das irgend ein berühmter Satz, den ich mal wieder nicht kenne?

        Nein, ehrlich - fändest Du es schön, wenn Du auf einer Webseite bewußt eine Automatik eingeschaltet hast, dann eine Details-Ansicht aktivierst und beim Schließen der Details-Ansicht die Automatik aus ist und Du sie wieder einschalten mußt?

        Nein, natürlich ist es automatisch anwenderfreundlicher. Ich habe mich nur über den ganz oben zitierten Satz lustig gemacht. Wenn man ihn etwas unaufmerksam liest, könnte man meinen, dass ein Mausklick die intellektuellen Fähigkeiten des Anwenders übertrifft.

        Viele Grüße
              Michael

        mfg - mit ferwirrenden Grüßen,
        Robert

        1. Hi,

          "Es gibt keine idiotensichere Software - die Idioten
          sind zu erfindungsreich."
          Das muss ich mir merken. Kommt das von dir oder ist das
          irgend ein berühmter Satz, den ich mal wieder nicht kenne?

          Hast Du vor Deiner Frage die Archivsuche bemüht? Offenbar nicht ... dann also gleich noch einen: "Besser gut geklaut als schlecht erfunden." (soviel zum Thema Selbstbezüglichkeit - wozu es von Cheatah auch wieder im Archiv, äh ...)

          könnte man meinen, dass ein Mausklick die intellektuellen
          Fähigkeiten des Anwenders übertrifft.

          Was ich keineswegs in Abrede stellen möchte ...

          Viele Grüße
                Michael

  2. Hallo Michael

    Das ursprüngliche Fenster steht also im Modus "passiv" irgendwo in Hintergrund.

    Irgendwann wird das 2. Fenster nun aber seinen Fokus abgeben (wahrscheinlich geschlossen oder minimiert sein) und das 1. Fenster wieder sichtbar sein. Ich gehe davon aus, daß der Besucher keine weiteren Browser-Fenster offen haben wird - weil das Ganze eine "Anwendung" ist, keine WWW-site - deshalb sind beide Ereignisse möglicherweise (hoffentlich ...) identisch.

    Spätestens im zweiten Fall, eventuell aber auch im ersten, möchte ich gerne im 1. Fenster (!) wieder einen JavaScript-Event bekommen, um meinen "Passiv-Modus" wieder auf "aktiv" zurück zu schalten.
    Ich habe aber noch keinen Weg gefunden, dies elegant und benutzerfreundlich zu realisieren.

    Aber wie rufe ich an dieser Stelle eine Funktion auf, die im 1. Fenster definiert ist und _dort_ etwas tun soll?

    Ein kompliziertes Problem und mein Ansatz wird dir auch nur rudimentär helfen.
    Ich habe ein paar Testreihen laufen lassen. Getestet habe ich dabei das Focusverhalten von top und einem einzelnen Frame.

    Im Topframe notierte ich folgende Funktion:

    function testc()
     {

    top.defaultStatus=top.defaultStatus+" k"

    }
     window.onfocus=testc

    im Inhaltsframe:

    function testc()
     {

    top.defaultStatus=top.defaultStatus+" j"

    }
     window.onfocus=testc

    Dabei bin zu folgendem Ergebnis gekommen.

    Sowohl IE5, NN6 und NN4 registrieren, wann das Fenster den Focus erhält. Allerdings nicht immer auf die gleiche Weise. War vorher ein Frame aktiviert, so erhält auch dieser Frame den Focus zurück, war keiner aktiviert, so erhält der Top-Frame den Focus. Es spielt dabei keine Rolle, ob der Nutzer auf das Fenster geklickt hat. Bedingung ist lediglich, dass der berühmte blaue Balken erscheint. Allerdings feuert im Netscape der Event auch, wenn auf das Dokument oder einem Verweis geklickt wird.

    Dir bleibt wohl nichts anderes übrig, als jedem Frame auf den Erhalt des Focus zu überwachen. Um den kurzfristigen Focusverlust z.b. beim Click auszugleichen bietet sich folgende ungetestete Lösung an:

    top.hatfocus=0
    function testc()
    {
    if (top.hatfocus==0) {
      top.hatfocus==1;
      deineFunktion()
      setTimeout("top.hatfocus=0",100)

    }

    }

    Die Variable hatfocus würde ich in den Topframe packen. Das läßt sich besser referenzieren.
    Ich habe hier die Variable hatfocus zeitverzögert auf Null gesetzt. Eleganter ist es, den onblur-Event zu verwenden. Auch hier gilt, Netscape feuert auch beim Klick. Außerdem, befindet im Dokument ein Formularfeld verliert das Fenster ebenfalls den Focus. Für diesen Fall ist wohl eine Sonderfallbehandlung notwendig.

    Zu unterstützende Browser: Netscape 4 und 6, M$IE 5 und 6. (Mehr wäre angenehm, aber derzeit nicht notwendig.)

    Hier sind sich die Browser zufällig mal einig. Keiner macht was du möchtest, ohne komplizerten Programmieraufwand. :-(

    Viele liebe Grüße

    Antje

    1. Hallo Antje,

      Ich habe ein paar Testreihen laufen lassen...

      boah - das ist ja eine richtige Studie!

      Ich habe Deinen Code erst mal nur kurz überflogen - er deckt sich anscheinend in der Quintessenz mit den Ergebnissen meines Kollegen, der heute früh basierend auf der "opener"-Idee und onBlur des child-Fensters einiges probiert hat (aber nicht annähernd so nahe an eine vollständige Lösung gekmmen ist).

      Ich stecke selbst nicht tief genug in den Details drin, um spontan selbst etwas Kompetentes dazu zu sagen. Ich kann Deine Ausführungen erst mal nur an ihn weiterleiten.

      Browserspezifische Sonderbehandlungen sind allerdings kein Problem - alle wesentlichen Funktionen haben ohnehin bereits ihre Browserweichen drin (wenn man halt Netscape 4 unterstützen muß ...).

      Vielen Dank für die Mühe
             Michael