Popup von aussen schliessen wenn es "fertig" ist.
Matthias
- javascript
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
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
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
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.
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.
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
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
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
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
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
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
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
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