Fensterputzer: PopUps automatisch schließen

Was wäre das Leben traurig, gäb's das SelfForum nicht ?? :-)
Folgendes Problem: Ich habe eine Tabelle, in der Bildinformationen verlinkt sind, die in PopUps angezeigt werden können. Der JavaScript-Code dazu lautet:

var win;
function popup (bild,fenstername,breite,hoehe)
{ win=window.open (bild,fenstername,"width="+breite+", height="+hoehe+", top=20, left=20");
win.focus();
}

Aufgerufen werden die einzelnen Fenster über gewöhnliche Anker-Tags:

<a href="javascript:popup ('bild1.png','bild1','400','250')">Bild 1</a>
<a href="javascript:popup ('bild2.png','bild2','400','250')">Bild 2</a>
etc.

Da jedesmal ein anderer Fenstername vergeben wird, öfnet sich auch jedesmal ein neues Fenster. Nun würde ich gerne beim Schließen des Hauptfensters (opener) alle geöffneten PopUps - falls geöffnet - automatisch mitschließen.
<body onunload="closepopup()">
Das Problem ist, daß alle Fenster in der selben Variablen gespeichert werden und der folgende Code deshalb nicht verwendet werden kann:

function closepopup()
{
if (win)
{  if(!win.closed)
{  win.close();  } }
}

Gelöscht wird dabei immer nur das zuletzt aufgerufene Fenster, da nur noch dessen Information in der Variablen  gespeichert vorliegt. Nun könnte man natürlich jedes Fenster in einer anderen Variablen speichern und versuchen, das Ganze mit einer if-Abfrage ( oder mit Switch/Case ) in den Griff zu kriegen, was den Code aber gewaltig aufblähen würde.
Frage: Gibt es vielleicht eine elegantere Lösung des Problems ... und zwar eine Lösung, die mich nicht allzu sehr überfordert ?!
Gruß Fensterputzer
Die Charta hab ich nicht gelesen ... :-p

  1. Hi,

    Folgendes Problem: Ich habe eine Tabelle, in der Bildinformationen verlinkt sind, die in PopUps angezeigt werden können.

    pfui bah! ;-)

    Aufgerufen werden die einzelnen Fenster über gewöhnliche Anker-Tags:

    <a href="javascript:popup ('bild1.png','bild1','400','250')">Bild 1</a>
    <a href="javascript:popup ('bild2.png','bild2','400','250')">Bild 2</a>

    Für Besucher ohne Javascript sind das funktionslose Links. Warum nicht die Bilder normal verlinken und bei aktivem Javascript über einen onclick-Handler als Popup aufrufen?

    Da jedesmal ein anderer Fenstername vergeben wird, öfnet sich auch jedesmal ein neues Fenster. Nun würde ich gerne beim Schließen des Hauptfensters (opener) alle geöffneten PopUps - falls geöffnet - automatisch mitschließen.

    Gute Idee.

    Gelöscht wird dabei immer nur das zuletzt aufgerufene Fenster, da nur noch dessen Information in der Variablen  gespeichert vorliegt. Nun könnte man natürlich jedes Fenster in einer anderen Variablen speichern und versuchen, das Ganze mit einer if-Abfrage ( oder mit Switch/Case ) in den Griff zu kriegen, was den Code aber gewaltig aufblähen würde.
    Frage: Gibt es vielleicht eine elegantere Lösung des Problems ... und zwar eine Lösung, die mich nicht allzu sehr überfordert ?!

    Die Lösung ist so trivial wie wirksam: Speichere die Fenster-Handles beim Öffnen als Array, das mit jedem weiteren Popup einen zusätzlichen Eintrag bekommt. Lauf dann beim Schließen durch dieses Array und verfahre mit jedem Eintrag so, wie du es schon mit "win" machst: Erst prüfen, ob der Eintrag gültig ist, dann, ob das zugehörige Fenster schon geschlossen ist, wenn nicht, schließen.

    Die Charta hab ich nicht gelesen ... :-p

    Böser Fensterputzer!

    Ciao,
     Martin

    --
    Zwei Kumpels sitzen vor dem Computer. "Welche Suchmaschine benutzt du eigentlich meistens?" - "Prima Vera." - "Hmm, kenn' ich gar nicht." Dann geht die Tür auf: "Schatz ich habe deine Sonnenbrille wiedergefunden!" - "Prima, Vera!"
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Tach !

      Die Lösung ist so trivial wie wirksam: Speichere die Fenster-Handles beim Öffnen als Array, das mit jedem weiteren Popup einen zusätzlichen Eintrag bekommt. Lauf dann beim Schließen durch dieses Array und verfahre mit jedem Eintrag so, wie du es schon mit "win" machst: Erst prüfen, ob der Eintrag gültig ist, dann, ob das zugehörige Fenster schon geschlossen ist, wenn nicht, schließen.

      Das das auf eine Array-Geschichte rausläuft, hab ich mir fast gedacht.
      Nur hatte ich insgeheim gehofft, den fertigen Code gleich mitgeliefert zu bekommen. :-p
      So muß ich mich jetzt wieder selbst durch die Materie durchwühlen und bei Nichtgelingen hier wieder antanzen. Aber die Hoffnung stirbt ja bekanntlich zuletzt.
      Gruß Fensterputzer.

      Ps: Bloß weil irgendwelche Idioten mit PopUps ständig Schindluder treiben, soll ich auf meine geliebten Fensterchen verzichten ?

      1. Hallo,

        Die Lösung ist so trivial wie wirksam: Speichere die Fenster-Handles beim Öffnen als Array [...]

        Das das auf eine Array-Geschichte rausläuft, hab ich mir fast gedacht.
        Nur hatte ich insgeheim gehofft, den fertigen Code gleich mitgeliefert zu bekommen. :-p

        Jeena hat sich doch diese Mühe sogar gemacht.

        Ps: Bloß weil irgendwelche Idioten mit PopUps ständig Schindluder treiben, soll ich auf meine geliebten Fensterchen verzichten ?

        Nein, nicht deshalb. Sondern weil viele Nutzer sie prinzipiell lästig oder störend empfinden. Dass es sinnvolle Anwendungsfälle für Popups gibt, bestreite ich nicht. Allerdings möchte ich auch selbst entscheiden, ob ich eine verlinkte Ressource in einem neuen Fenster öffnen will oder nicht.

        Ciao,
         Martin

        --
        Der Sinn einer Behörde besteht in ihrer Existenz.
          (alte Beamtenweisheit)
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Hallo,

    var win;

    Mach doch daraus ein array:

    var open_windows = [];

    function popup (bild,fenstername,breite,hoehe)
    { win=window.open (bild,fenstername,"width="+breite+", height="+hoehe+", top=20, left=20");
    win.focus();

    und füge jedes Fenster das du öffnest in dieses Array:

    var w = window.open(/* ... */);
      open_windows.push(w);

    }

    Aufgerufen werden die einzelnen Fenster über gewöhnliche Anker-Tags:

    Da solltest du dir eine schönere Lösung überlegen.

    Hier nur eine kleine Änderung:

    function closepopup()
    {

    for(var i=0; i<open_windows.length; i++) {
        var w = open_windows[i];
        if(!w.closed) w.close();
      }

    }

    Jeena

    1. var win;
      Mach doch daraus ein array:

      var open_windows = [];

      function popup (bild,fenstername,breite,hoehe)
      { win=window.open (bild,fenstername,"width="+breite+", height="+hoehe+", top=20, left=20");
      win.focus();

      und füge jedes Fenster das du öffnest in dieses Array:

      var w = window.open(/* ... */);
        open_windows.push(w);

      }

      Das Schöne am SelfForum ist, daß man stets neue Anregungen bekommt. Von der Methode "push" hör ich zum ersten mal, werd' mich jetzt aber sofort damit auseinandersetzen und versuchen, deine Code-Beispiele geistig zu verarbeiten.
      Dank dafür, einstweilen. Live and Learn !
      :-p

      1. Hallo Jeena.
        Hat wunderbar funktioniert. Hier der Code in Reinform:

        var w;
        var open_windows = [];
        function popup (bild,fenstername,breite,hoehe)
        {
        var w = window.open (bild,fenstername,"width="+breite+", height="+hoehe+", top=20, left=20");
        w.focus();
        open_windows.push(w);
        }

        function closepopup()
        {
        for(var i=0; i<open_windows.length; i++) {
        var w = open_windows[i];
        if(!w.closed)
        w.close();
        }}

        Gruß an Alle. :-p

        1. Hallo,

          Hallo Jeena.
          Hat wunderbar funktioniert. Hier der Code in Reinform:

          Super. Das "var w;" außerhalb der funktionen solltest du entfernen, das wird ja nirgendwo benutzt.

          Jeena

    2. Hi,

      ich habe hier grad mitgelesen und ich hätte das etwas anders gemacht.

      for(var i=0; i<open_windows.length; i++) {
          var w = open_windows[i];
          if(!w.closed) w.close();
        }

      Als erstes verstehe ich nicht wozu das if(!w.closed) gut sein soll?

      Anstelle dieses Codes hätte ich folgendes geschrieben:

      while (open_windows[0]) {  
        open_windows.shift().close();  
      }
      

      Nun macht das natürlich ein bisschen was anderes, es löscht nämlich die Elemente aus dem Array. Das sollte in diesem Anwendungsfall aber egal sein (?) deshalb ignoriere ich das.

      Nachdem ich den Code von dir etwas optimiert hatte:

      for(var i=open_windows.length-1; i>=0; i--) {  
        open_windows[i].close();  
      }
      

      Wollte ich wissen was schneller ist (mit pop() anstelle von shift(), um in beiden fällen die gleiche Reihenfolge zu haben).

      Warum ist die Variante mit pop() um sooo viel schneller?
      Oder ist in meinem Test ein Fehler?

      ~dave

      1. Hallo,

        Als erstes verstehe ich nicht wozu das if(!w.closed) gut sein soll?

        Das war schon im Code drin und ich hatte keine Lust nachzuschauen was das konkret macht und was passiert wenn man ein schon geschlossenes Fenster noch mal zumacht also habe ich es drinn gelassen.

        Anstelle dieses Codes hätte ich folgendes geschrieben:

        while (open_windows[0]) {

        open_windows.shift().close();
        }

        Das kann man sicherlich machen, ist aber für einen Neuling wie Fensterputzer eher schwieriger zu verstehen und bringt effektiv bei diesem Beispiel keinen Mehrwert da es sich ja nicht um hunderttausende von Fenstern handeln wird die gleichzeitig geschlossen werden wo sich so ein Geschwindigkeitschub überhaupt bemerkbar machen, wobei ich nicht glaube dass diese shift lösung überhaupt schneller sein würde da da ja noch die objekt-löschen methode ausgeführt werden muss die auch zeit kostet.  
          
        
        > Warum ist die Variante mit pop() um sooo viel schneller?  
        > Oder ist in meinem Test ein Fehler?  
        
        Ja da ist ein Fehler drinn, denn a[0] ist 0 und while(0) ist das gleiche wie while(false) also wird die schleife kein einziges mal durchlaufen.  
          
           Jeena  
        ![](http://jeenaparadies.net/pavatar.png)
        
        -- 
        [Jlog](http://jeenaparadies.net/webdesign/jlog/) | [Gourmetica Mentiri](http://jeenaparadies.net/gourmetica-mentiri/)
        
        1. Hi,

          Anstelle dieses Codes hätte ich folgendes geschrieben:

          while (open_windows[0]) {

          open_windows.shift().close();
          }

          
          > Das kann man sicherlich machen, ist aber für einen Neuling wie Fensterputzer eher schwieriger zu verstehen und bringt effektiv bei diesem Beispiel keinen Mehrwert da es sich ja nicht um hunderttausende von Fenstern handeln wird die gleichzeitig geschlossen werden wo sich so ein Geschwindigkeitschub überhaupt bemerkbar machen  
            
          Absolut richtig, mein Post war auch nicht als korrektur oder so gedacht, mich hat nur gewundert dass in meinem Testcase der Unterschied zwischen den beiden so gigantisch war.  
            
          
          > > Oder ist in meinem Test ein Fehler?  
          > Ja da ist ein Fehler drinn, denn a[0] ist 0 und while(0) ist das gleiche wie while(false) also wird die schleife kein einziges mal durchlaufen.  
            
          Peinlich …  
            
          ~dave
          
  3. Moin!

    Benutze ein Array. Da kannst Du fuer jedes neue Bild ein Element dranhaengen. Beim Schliessen, durchlaeufst Du dann das Array.

    Dein Vorhaben macht mehr Code unumgaenglich.

    --
    Signaturen sind blöd!