Matthias: Popup von aussen schliessen wenn es "fertig" ist.

Hallo allerseits!

ich tüftle jetzt schon seit zwei Tagen an folgendem Problem herum:

Eine Website öffnet per window.open() ein neues Fenster. Das neue Fenster erwartet eine Usereingabe (und tut was damit) und soll dann aus dem aufrufenden Fenster heraus wieder geschlossen werden.

Die folgenden 2 Seiten sollten die Situation illustrieren:

<html>
<head>
<title>test1</title>
</head>
<body>
<script type="text/javascript">
fenster = window.open("test2.asp");
setInterval("fenster.close();", 1000)
</script>
</body>
</html>

<html>
<head>
<title>test2</title>
</head>
<body>
<script type="text/javascript">
confirm("test2");
</script>
</body>
</html>

In der Theorie funktioniert das recht gut. Wenn man das confirm-Fenster im test2 wegklickt, wird test2 von test1 aus geschlossen. Problem: immer wenn test1 versucht, test2 zuzumachen, und das wegen des noch offenen Dialoges nicht kann, macht es "bing", was natürlich nicht so toll ist.

Also nochmal kurz: Fenster test1 soll Fenster test2 zumachen, wenn dieses nicht mehr auf Eingaben wartet, ohne dabei jede Sekunde "bing" zu machen.

Auf test2 habe ich keinen direkten Einfluss, also können dort keine Scripte rein - es muss von aussen geschlossen werden. Das ganze muss nur im IE funktionieren, aber eine universelle Lösung wäre natürlich trotzdem schöner.

PS: Könnte es sein, dass der IE mit dem externen Eventhandling nicht zurechtkommt? Dieses Beispiel produziert bei mir den Fehler "Error: 'Event' is undefined":
file:///C:/Documents%20and%20Settings/freyerma.BTC/My%20Documents/Dokumentationen/SelfHTML%208.1.1/javascript/objekte/window.htm#capture_events

Vielen Dank für eure Hilfe

Matthias

  1. Hi,

    regele über eine Variable in einem der beiden Fenster ob das Popup schließbereit ist, z.B.
    Anlegen der Variable im öffnenden Fenster
    var closeable = false;
    var fenster = null;

    function attemptClose() {
       if ((closeable)  && (fenster) && (!fenster.closed))
          fenster.close();
    }

    fenster = window.open("test2.asp");
    setInterval("attemptClose();", 1000)

    Und aus dem Popup:
    <script type="text/javascript">
    confirm("test2");
    if ((opener) && (!opener.closed))
       opener.closeable = true;
    </script>

    MfG
    Rouven

    --
    -------------------
    Computer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice. Like drawing, it can be shaped to a variety of ends: commercial, artistic, and pure entertainment. Programmers have a well-deserved reputation for working long hours but are rarely credited with being driven by creative fevers. Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see. -- Larry OBrien and Bruce Eckel in Thinking in C#
    1. Hallo,

      Der Knackpunkt war eben:

      Auf test2 habe ich keinen direkten Einfluss, also können dort keine Scripte rein - es muss von aussen geschlossen werden.

      Mathias

  2. In der Theorie funktioniert das recht gut. Wenn man das confirm-Fenster im test2 wegklickt, wird test2 von test1 aus geschlossen. Problem: immer wenn test1 versucht, test2 zuzumachen, und das wegen des noch offenen Dialoges nicht kann, macht es "bing", was natürlich nicht so toll ist.

    Was du aber nicht verhindern kannst. Das alert bzw. confirm Fenster kannst du nicht mit JS steuern und solange es offen ist, kannst du das dazugehörige Fenster nicht schliessen.

    PS: Könnte es sein, dass der IE mit dem externen Eventhandling nicht zurechtkommt? Dieses Beispiel produziert bei mir den Fehler "Error: 'Event' is undefined":
    file:///C:/Documents%20and%20Settings/freyerma.BTC/My%20Documents/Dokumentationen/SelfHTML%208.1.1/javascript/objekte/window.htm#capture_events

    Ein Link auf eine Interneseite wäre hilfreicher gewesen, so muss ich jetzt die Datei suchen um zu verstehen was du meinst
    ....
    [suche]
    ...

    Hast du dir dort mal die (bzw. das) Browsericons angeschaut?

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Ein Link auf eine Interneseite wäre hilfreicher gewesen, so muss ich jetzt die Datei suchen um zu verstehen was du meinst

      uups.. sorry, hab nicht gemerkt dass ich die adresse aus der lokalen version kopiert habe.

      Hast du dir dort mal die (bzw. das) Browsericons angeschaut?

      scheinbar nicht ;-) Nebenbei bemerkt sind sie falsch, denn Firefox schluckt dieses Beispiel ohne Probleme.

  3. Hallo,

    Auf test2 habe ich keinen direkten Einfluss, also können dort keine Scripte rein - es muss von aussen geschlossen werden. Das ganze muss nur im IE funktionieren, aber eine universelle Lösung wäre natürlich trotzdem schöner.

    Das wird schwierig. Ich fürchte, es gibt keine Möglichkeit, den Status des Fensters abzufragen.

    Wenn das Dokument im Popup nicht von deinem Server stammt, hättest du sowieso das grundlegende Problem, dass du nicht auf dessen JavaScript-Objekte zugreifen könntest (Same Origin Policy).

    PS: Könnte es sein, dass der IE mit dem externen Eventhandling nicht zurechtkommt? Dieses Beispiel produziert bei mir den Fehler "Error: 'Event' is undefined":
    http://de.selfhtml.org/javascript/objekte/window.htm#capture_events

    Was verstehst du unter externem Event-Handling?

    Dieses Beispiel zeigt captureEvents, eine Funktion, die lediglich im Netscape 4 nötig ist. IE kennt sie nicht und braucht sie auch nicht. Es ist klar, dass das Beispiel dort nicht funktioniert. Im Internet Explorer greift manüber window.event auf das Ereignisobjekt zu.

    http://de.selfhtml.org/javascript/objekte/event.htm#allgemeines

    Mathias

    1. Hallo,

      Das wird schwierig. Ich fürchte, es gibt keine Möglichkeit, den Status des Fensters abzufragen.

      Wenn das Dokument im Popup nicht von deinem Server stammt, hättest du sowieso das grundlegende Problem, dass du nicht auf dessen JavaScript-Objekte zugreifen könntest (Same Origin Policy).

      Von meinem Server stammt das Dokument schon, aber es schickt seinen Inhalt direkt als Download an den Client, darum kann ich da nichts ausführen lassen. Der sperrende Dialog ist die IE "Open/Save/Cancel" Box. Und das soll (leider) vorerst auch so bleiben.

      Dieses Beispiel zeigt captureEvents, eine Funktion, die lediglich im Netscape 4 nötig ist. IE kennt sie nicht und braucht sie auch nicht. Es ist klar, dass das Beispiel dort nicht funktioniert. Im Internet Explorer greift manüber window.event auf das Ereignisobjekt zu.

      Ich werde es damit versuchen, das Problem ist, das ich nicht weiss wie ich abfragen soll, ob das Fenster gerade "schliessbar" ist. Denn wenn ich versuche es zu schliessen, obwohl es noch nicht reagiert, dann gibt es eben das Fehler-ping.

      Das einzige was mir einfällt ist "schliessen wenn es den Focus hat", denn dann muss die Downloadabfrage ja geschlossen sein. Das habe ich eben bis jetzt mit diesen captureEvent-Funktionen versucht.

      Danke für die Hilfe

      Matthias

      1. Hallo,

        Von meinem Server stammt das Dokument schon, aber es schickt seinen Inhalt direkt als Download an den Client, darum kann ich da nichts ausführen lassen. Der sperrende Dialog ist die IE "Open/Save/Cancel" Box. Und das soll (leider) vorerst auch so bleiben.

        Achso, sag doch gleich, was der Sinn des Popups ist. Also wird im Popup gar kein HTML-Dokument angezeigt und dein confirm-Beispiel war nur theoretisch?

        In dem Fall frage ich mich, warum überhaupt ein Popup? Du kannst auch einen normalen Hyperlink auf die Download-Ressource setzen. Dann kommt genauso der Download-Dialog und das Dokument bleibt angezeigt.

        Ich werde es damit versuchen, das Problem ist, das ich nicht weiss wie ich abfragen soll, ob das Fenster gerade "schliessbar" ist.

        Das geht meines Wissens nicht.

        Du kannst höchstens JavaScript-Fehler über try { ... } catch (e) { ... } abfangen.
        http://de.selfhtml.org/javascript/beispiele/fehlerbehandlung_try_catch.htm

        Das einzige was mir einfällt ist "schliessen wenn es den Focus hat", denn dann muss die Downloadabfrage ja geschlossen sein.

        Wenn mich meine Tests mit dem IE nicht täuschen:

        Ein Dialog ist kein eigenes autonomes Fenster. Ein Dialog gehört aus Sicht von onfocus und onblur zu dem dahinterliegenden, gesperrten Fenster. Nachdem der Dialog geschlossen wurde, passiert kein Focus-Ereignis (im Opera und Firefox ist das etwas anders).

        Außerdem lässt sich nicht »von außen« über das Fensterobjekt überwachen, ob dort ein Focus passiert. Und in einem Dokument im Popup geht es auch nicht, der Fokus-Event passiert, bevor das Ereignis überwacht werden kann.

        Das habe ich eben bis jetzt mit diesen captureEvent-Funktionen versucht.

        Ich weiß immer noch nicht, was du mit captureEvents anfangen willst.

        Mathias

        1. hi,

          In dem Fall frage ich mich, warum überhaupt ein Popup? Du kannst auch einen normalen Hyperlink auf die Download-Ressource setzen. Dann kommt genauso der Download-Dialog und das Dokument bleibt angezeigt.

          Wenn ich ihn richtig verstanden habe, fordert das Popup den Nutzer noch zu einer Werteingabe auf, auf die hin dann vom Server eine individuelle Download-Ressource dynamisch generiert wird.

          Dann wäre wohl die Frage, ob man die Wertübermittlung durch das externe Popup nicht auch durch eine eigene Seite ersetzen könnte, die die Nutzereingabe an de Server übermittelt.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. Hallo,

            Wenn ich ihn richtig verstanden habe, fordert das Popup den Nutzer noch zu einer Werteingabe auf, auf die hin dann vom Server eine individuelle Download-Ressource dynamisch generiert wird.

            nein, tut es nicht. Dynamisch generiert wird der Download vorher. Das Popup ist wirklich nur "Hilfsmittel" um das eigentliche File vom Server aus gesehen "hochzuladen". Zu diesem Zwecke wird es per (asp)
            Response.ContentType = Mimetype und
            Response.AddHeader "Content-Disposition", "attachment; filename=XXX"
            als "download" gekennzeichnet. Dann wird das file ebenfalls (binär) in die (gepufferte) Response geschrieben und mit Response.End abgeschickt.
            Daraufhin öffnet sich beim User das IE-Standard-Download-Window. Nun kann er das file sofort öffnen, abspeichern oder abbrechen. Aber was immer er tut, das window, in dem diese response generiert wurde (das sie aber nie erhalten hat, weil die ja direkt zum client ging) steht noch blöd in der Gegend rum.

            siehe auch mein Posting hier: http://forum.de.selfhtml.org/?t=132544&m=858478

            Matthias

        2. Hallo,

          Achso, sag doch gleich, was der Sinn des Popups ist. Also wird im Popup gar kein HTML-Dokument angezeigt und dein confirm-Beispiel war nur theoretisch?

          Sorry, ich hätte es wirklich gleich ausführlicher beschreiben können. Ich wollte euch nicht mit Details belasen und nur das eigentliche Problem darstellen, da habe ich wohl etwas zu weit abstrahiert.

          In dem Fall frage ich mich, warum überhaupt ein Popup? Du kannst auch einen normalen Hyperlink auf die Download-Ressource setzen. Dann kommt genauso der Download-Dialog und das Dokument bleibt angezeigt.

          Da bist Du nicht der Einzige, der sich das fragt ;-) Ich habe das eben so "gegerbt". Und das ganze Download-Handling komplett zu ändern wäre ein ziemlicher Aufwand. Zumal ja nicht jeder eingeloggte User alles runterladen können/dürfen soll, das heisst ich kann nicht einfach den Ordner mit den ganzen Files dem Webserver freigeben und einfach Links setzen. Es funktioniert ja soweit auch ganz gut.

          Die Anforderung lautet nur: "Das Fenster was nach dem Download leer und sinnlos in der Gegend rumsteht soll automatisch zugehen, damit man dort nicht jedesmal noch auf das "x" klicken muss.

          Da hatte ich eben gehofft, das "von aussen" per Javascript erledigen zu können, weil dieses Download-Popup sowieso von einer JS-Funktion geöffnet wird, die ich dann nur noch anpassen müsste.

          Wäre ja auch alles wunderbar, wenn das Ding nicht jede Sekunde "bing" machen würde!

          Ich werde es damit versuchen, das Problem ist, das ich nicht weiss wie ich abfragen soll, ob das Fenster gerade "schliessbar" ist.

          Das geht meines Wissens nicht.

          Schade.

          Du kannst höchstens JavaScript-Fehler über try { ... } catch (e) { ... } abfangen.

          Klar, aber das bringt nix, weil die Anweisungen im try-Block ja trotzdem ausgeführt werden. Das heisst es macht immer noch Krach. Wie oben schon gesagt müsste ich vor dem Schliessversuchen wissen ob es schliessbar ist.

          Ein Dialog ist kein eigenes autonomes Fenster. Ein Dialog gehört aus Sicht von onfocus und onblur zu dem dahinterliegenden, gesperrten Fenster. Nachdem der Dialog geschlossen wurde, passiert kein Focus-Ereignis (im Opera und Firefox ist das etwas anders).

          Scheint mir auch so.

          Ich weiß immer noch nicht, was du mit captureEvents anfangen willst.

          Schon gut, war ein Missverständnis (im Wortsinne) meinerseits.

          Trotzdem Danke für Deine Hilfe

          Matthias

  4. Hi Matthias,

    <script type="text/javascript">
    confirm("test2");
    </script>

    Auf test2 habe ich keinen direkten Einfluss, also können dort keine Scripte rein - es muss von aussen geschlossen werden.

    Da du auf den obigen Scriptblock keinen Einfluss hast, also keine zusätzlichen Variablen o.ä. setzen kannst, bleibt dir vielleicht noch die Möglichkeit die confirm-Methode des Popups zu überschreiben. Ist zwar ziemlich dreckig, könnte aber funktionieren:
     - Öffnen des Popups
     - Überschreiben von confirm. Sinngemäß: window.confirm = new function(){alert("überschriebenes confirm");};
     - In der überschriebenen Funktion deine steuernden Variablen für den opener setzen

    Gruß
    Mausi

    1. hi,

      Da du auf den obigen Scriptblock keinen Einfluss hast, also keine zusätzlichen Variablen o.ä. setzen kannst, bleibt dir vielleicht noch die Möglichkeit die confirm-Methode des Popups zu überschreiben. Ist zwar ziemlich dreckig, könnte aber funktionieren:

      Da müsstest du m.E. aber schon die confirm-Methode in der Fensterinstanz des Popups überschreiben.
      Wenn, wie schon vermutet, der "nicht vorhandene Einfluss" aus einer Überquerung von Domaingrenzen herrührt - dann hast du darauf aber auch keinen Zugriff.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }