fenster schliessen

ich sitze seit ein paar tagen vor einem "banalen" problem und hab fast keine haare mehr auf dem kopf.

ich möchte ein mit js geöffnetes fenster wieder schliessen:

Code:
<html>
<head>
  <script language="JavaScript"> 
      var fenster;
      function warte ()  {
       fenster = window.open ('./fenster.php', 'fenster', 'width=200,height=100,toolbar=no,scrollbar=no,status=no');
      }
      function windowclose ()  {
        
        var fenster.close ();
      }
  </script>
</head>
<body>
  <a href="?" onClick="warte();">open</a><br>
  <a href="?"onClick="windowclose();">close</a>
</body>
</html>

das fenster wird auch problemlos geöffnet - es lässt sich nur nicht mehr schliessen.
leider gibts auch keine fehlermeldungen. die dokus, die ich fand, haben letzten endes die selben beispiele beinhaltet.
währe jetzt für jede hilfe echt dankbar :)
 
ich kenne mich mit js nich so aus aba so wie es bei dir aussieht müsstest du auf der seite wo der href hingeht die funktion window close einbauen ^^
weil so siehts für mich aus als könne man auf dieser seite entweder das fenster öffnen ODER das noch nicht offene fenster schließen
ich würd das dann irgendwie so lösen
Code:
<html>
<head> <!--das is die seite von der man aus startet OHNE die close funktion-->
  <script language="JavaScript"> 
      var fenster;
      function warte ()  {
       fenster = window.open ('./fenster.php', 'fenster', 'width=200,height=100,toolbar=no,scrollbar=no,status=no');
      }
      function windowclose ()  {
        
        var fenster.close ();
      }
  </script>
</head>
<body>
  <a href="?" onClick="warte();">open</a><br>
</body>
</html>

und dann wenn das fenster offen is auf dem den link mit close platzieren

Code:
 <html><!-- das is jetzt das offene fenster -->
 <head>name und js </head>
<body> <a href="?" onClick="windowsclose();>close</a> </body>
</html>
 
ShadowFire:

Dein Script weist 2 Fehler auf:

1. In der Schließen-Funktion deklarierst du "fenster" nochmal, also muss das "var" da weg, damit die globale Variable verwendet wird, die am Anfang deklariert wird.

2. Damit diese Variable auch tatsächlich erhalten bleibt, musst du dich auf der gleichen Seite befinden wie beim klicken auf den Öffnen-Link. Das ist aber nicht gegeben, da du mit einem Aufruf von "?" die Seite neu lädst und damit die Variable "fenster" zerstörst.

Um das zu verhindern, gibt's nun mehrere Möglichkeiten, wie du die Links gestalten kannst. Entweder du rufst direkt JavaScript im href-Attribut auf:

Code:
<a href="javascript:warte()">open</a>

oder du musst im onclick EventHandler dafür sorgen, dass der Link nicht aufgerufen wird sondern nur die Funktion:

Code:
<a href="?" onclick="warte();return false">open</a>

Alternativ könntest du das href-Attribut auch auf die gleiche Seite setzen:

Code:
<a href="#" onclick="warte()">open</a>

Viele Wege führen nach Rom ;)
 
LX:
genau da liegt das problem - die seite muss neu geladen werden:

Code:
<html>
<head>
  <script language="JavaScript"> 
     var fenster;
      function warte ()  {
       fenster = window.open ('./warten.php', 'fenster', 'width=200,height=100,toolbar=no,scrollbar=no,status=no');
       document.location.href ('zip.php?aktion=bla');
      }
      function windowclose ()  {
        
        fenster.close ();
      }
  </script>
</head>
<a href="?aktion=restore" onClick="javScript:warte()">backup</a>

<?php
if ($_REQUEST["aktion"] == "restore")  {  /* do restore */
  ?>
  <body onLoad="javaScript:windowclose()">
  <?php
  define("MYSQL", "/usr/local/bin/mysql");
  
  $array = gzfile("./test.gz");

  $target = fopen("./temp.sql", "w");
  foreach ($array as $line)  {
    if (!preg_match("/^\s$/", $line))  {
      fputs($target, $line);
    }
  }

  $sql = parse_ini_file("/devel/projects/restore/extern-libs/mysql.ini");
  mysql_connect($sql["HOST"], $sql["USER"], $sql["PASS"]);
  mysql_select_db($sql["DB"]);
  mysql_query("DROP DATABASE " . $sql["DB"]);
  mysql_close();
  
  system (MYSQL . " -h " . $sql["HOST"] . " -u " .  $sql["USER"] . " -p" .  $sql["PASS"] . " < ./temp.sql");
unlink ("./temp.sql");
  print "done";
  }
?>

das script läuft ziemlich lange (ca. 50 sekunden)
in der zeit soll lediglich eine meldung erscheinen, dass der benutzer warten soll.
diese meldung soll wieder verschwinden, wenn das script zu ende ist.

:) und bitte kein blame über das php-script - das wird noch schöner :D
 
Warum lagerst du die Restore-Funktionalität dann nicht einfach in dein "Bitte warten"-Popup aus? Eine nicht ganz saubere, aber zumindest nett aussehende Lösung für dein Popup:

Code:
<html>
<head>
  <title>Bitte warten...</title>
</head>
<body>
<p>Wenn du dieses Fenster zumachst ist alles hin...</p>

<?php

// dein Restore-Zeugs

?>
<script type="text/javascript">
this.close();
</script>
</body>
</html>

Somit sieht der Benutzer die Meldung, dann wird dein Restore-Kram ausgeführt, und wenn der durchgerasselt ist, wird das Fenster automatisch geschlossen.

Unsauber isses, weil keine komplette HTML-Seite angezeigt wird, bis das PHP-Script durchgelaufen ist. Die meisten Browser zeigen aber auch unvollständige Seiten bereits an. Unsauber isses auch deswegen, weil goa nix passiert, wenn der Nutzer JavaScript deaktiviert hat :D
 
das hab ich zuerst auch versucht.
aber wie du schon sagtest, wird der content erst dann angezeigt, wenn das script abgelaufen ist. also fällt die idee leider weg.

da die anwendung js vorraussetzt, fällt das zweite problem auch weg:
wenn sie nicht gestartet werden kann, brauch ich auch kein wartehinweis :)

andere frage:
kann js beim klick eine grafik anzeigen und diese dann nach scriptablauf verschwinden lassen, oder stosse ich damit an das selbe problem?
 
Original von ShadowFire
aber wie du schon sagtest, wird der content erst dann angezeigt, wenn das script abgelaufen ist. also fällt die idee leider weg.
Naja okay, das Beispiel war etwas zu einfach gehalten. Es müssen noch 2 Voraussetzungen erfüllt werden:

1. Jegliches Output-Buffering von PHP und Apache muss deaktiviert sein.
2. Vorm Restore-Teil muss ein flush() dafür sorgen, dass der bisher generierte Output an den Browser gesendet wird.

Dann sollte das aber klappen.
 
Zurück
Oben