_Daniel_: Mehrere PopUps automatisch schliessen

Moin Moin!

Ich versuche grade eine kleine funktion zu schreiben, bei der ein PopUp geöffnet wird, und nach 3 Sek. wieder geschlossen werden soll.
Soweit auch kein Problem, aber klickt man mehrere links an öffnen sich auch mehrere PopUps aber nur das letzte schließt sich mit dem timeout des ersten, und die anderen bleiben alle geöffnet.
Nun meine Frage, wie bekomme ich es in Griff das sich jeweils immer nur das "geklickt" PopUp nach 3 Sek. wieder schließt wenn ich mehrere PopUps geöffnet habe.

hier noch mein Code...

  
function openPopUp(id)  
{  
  id = window.open("http://www.example.org/index.php?id="+id+"/", id, "toolbar=0,location=0,directions=0,status=0,menuebar=0,resizeable=0,scrollbars=1,width=700,height=500,left=100,top=100");  
  id.blur();  
  win = id;  
  window.setTimeout("win.close()",3000);  
}  

  1. Lieber _Daniel_,

    Das Problem ist, dass Du globale Variablen benutzt. Jedesmal, wenn Du "win" definierst, überschreibst Du damit die vorherige Referenz, die darin abgelegt gewesen war. Das machen wir jetzt besser.

    function openPopUp(id)

    Soweit OK.

    {

    id = window.open("http://www.example.org/index.php?id="+id+"/", id, "toolbar=0,location=0,directions=0,status=0,menuebar=0,resizeable=0,scrollbars=1,width=700,height=500,left=100,top=100");

      
    Das ist nicht besonders toll. Du bekommst einen String übermittelt, den Du in der Variablen "id" empfängst. Dann änderst Du die Bedeutung von "id", indem Du nun eine Referenz auf ein Fensterobjekt darin anlegst. Da hättest Du besser gleich "win" dafür genommen:  
      
    `    var win = window.open("http://www.example.org/index.php?id="+id+"/", id, "toolbar=0,location=0,directions=0,status=0,menuebar=0,resizeable=0,scrollbars=1,width=700,height=500,left=100,top=100");`{:.language-javascript}  
      
    Nebenbei bemerkt ist diese Variable eine lokale Variable, die außerhalb der Funktion so nicht erreichbar ist.  
      
    
    >   `id.blur();`{:.language-javascript}  
      
    Das nennen wir jetzt so:  
      
       `win.blur();`{:.language-javascript}  
      
      
    
    >   ~~~javascript
    
    window.setTimeout("win.close()",3000);  
    
    > }
    
    

    Hier benutzt Du wieder eine globale Variable. Da ich oben aber ein "var" vor das "win" geschrieben habe, ist sie nicht mehr global. Darum ändern wir das jetzt so:

    window.setTimeout(function () { win.close() }, 3000);

    Der Hintergrund ist der, dass im Aufruf von window.setTimeout eine anonyme Funktion definiert wird, die dann gleich als erster Parameter an setTimeout übergeben wird. In dieser Funktion wird eine Variablen "win" benutzt, die zur Zeit der Definition bekannt war. Daher ist sie in dieser Funktion auch bekannt, da diese Funktion ja eine "lokale Funktion" innerhalb Deiner Funktion openPopup ist. Wenn dann setTimeout diese Funktion ausführt, ist die darin enthaltene Variable "win" noch immer mit dem Wert befüllt, den sie bei der Funktionsdefinition hatte.

    Das ist zwar etwas krass zu verstehen, aber so funktioniert das in JavaScript.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Super Vielen Dank! Funktioniert einwandfrei aber verstanden hab es ich trotzdem nicht :O ;)
      Aber ich fang ja auch grad erst an mit Javascript ;)

      Nochmals vielen Dank!

      1. Liebe(r) _Daniel_,

        Super Vielen Dank! Funktioniert einwandfrei

        prima. Auf zu neuen Herausforderungen!

        aber verstanden hab es ich trotzdem nicht :O ;)

        Dann schau doch einmal in den wirklich guten Artikel Organisation von JavaScripten, und am besten gleich an diese Stelle: object-Methoden in anderen Kontexten ausführen.

        Ich weiß, dass das sehr kompliziert ist, aber je mehr man sich damit beschäftigt, desto eher begreift man das.

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)