Tom: JavaScript und Window.Open Wrapper

Hello,

ich brauche mal eine gute Idee...

function openWin(url,name,height,width,top,left)
{
  var win = 0;
  win = window.open(url,name,'height='+height+',width='+width+',top='+top+',left='+left+',dependent=yes,menubar=no,resizable=no,scrollbars=no,status=no,toolbar=no,location=no,hotkeys=no');
   win.focus();
}

Fragt mich bitte nicht, wieso da ein Wrapper um die window.open()-Funktion gebaut wurde. Ich hätte das nicht so gemacht, kann aber nicht alles einfach ändern...

Mit dieser luxuriösen Funktion wird in meiner Horrorbaustelle ein Popup geöffnet.

Nun möchte ich aber den Variablennamen für das Fenster (hier 'win') selber bestimmen und der Funktion übergeben. Ausserdem muss dieser Name Public sein. Wie kann ich das machen? JavaScript kennt ja wohl keine  Metavariablen... oder?

Harzliche Grüße aus http://www.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
  1. hi,

    function openWin(url,name,height,width,top,left)
    {
      var win = 0;
      win = window.open(url,name,'height='+height+',width='+width+',top='+top+',left='+left+',dependent=yes,menubar=no,resizable=no,scrollbars=no,status=no,toolbar=no,location=no,hotkeys=no');
       win.focus();
    }

    Nun möchte ich aber den Variablennamen für das Fenster (hier 'win') selber bestimmen und der Funktion übergeben. Ausserdem muss dieser Name Public sein. Wie kann ich das machen?

    was hältst du von

    function openWin(...)
    {
       return window.open(...);
    }

    aufruf:
    var deinefenstervariable = openWin(...);

    JavaScript kennt ja wohl keine  Metavariablen... oder?

    was meinst du mit metavariablen?

    willst du soetwas wie call by reference umsetzen?

    function openWin(fenstervariable, ...)
    {
       fenstervariable = window.open(...);
    }

    openWin(deinefenstervariable, ...);

    sollte m.E. eigentlich auch funktionieren.

    gruß,
    wahsaga

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
    1. Hello,

      function openWin(url,name,height,width,top,left)
      {
        var win = 0;
        win = window.open(url,name,'height='+height+',width='+width+',top='+top+',left='+left+',dependent=yes,menubar=no,resizable=no,scrollbars=no,status=no,toolbar=no,location=no,hotkeys=no');
         win.focus();
      }

      JavaScript kennt ja wohl keine  Metavariablen... oder?

      was meinst du mit metavariablen?

      willst du soetwas wie call by reference umsetzen?

      genau. dowas wie $$var in PHP & Co.

      function openWin(fenstervariable, ...)
      {
         fenstervariable = window.open(...);
      }

      Das geht nicht, da ich nur den Namen der Variablen habe, aber nicht die Variable selber.
      Aber Arrays sind eine Lösung. Das klappt so. Ich bin mir aber eben unsicher, ob das Arrayelement als image deklariert werden muss.

      var Bilder = new array();

      function openWin(url,nummer,height,width,top,left)
      {
         Bilder[nummer] = window.open(url,'P'+nummer,'height='+height+',width='+width+',top='+top+',left='+left+',dependent=yes,menubar=no,resizable=no,scrollbars=no,status=no,toolbar=no,location=no,hotkeys=no');
         Bilder[nummer].focus();
      }

      Ein Problem habe ich noch trotzdem noch. Aus der Hauptseite heraus werden diese Popups geöffnet. Folglich verschwinden die bereits geöffneten hinter der Hauptseite. Nur das zuletzt geöffnete kommt wieder nach oben.

      Wie würdest Du das machen?

      dem Fenster ein onBlur="self.focus()" verpassen, oder den Stapel der Fenster der reihe nach aufbauen? In der Reihenfolge des Öffnens wäre es dann natürlich klasse, sodass das zuletzt geöffnete Window wieder oben auf liegt.

      Mir raucht langsam der Kopf ;-)

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Hello,

        Ein Problem habe ich noch trotzdem noch. Aus der Hauptseite heraus werden diese Popups geöffnet. Folglich verschwinden die bereits geöffneten hinter der Hauptseite. Nur das zuletzt geöffnete kommt wieder nach oben.

        Wie würdest Du das machen?

        dem Fenster ein onBlur="self.focus()" verpassen, oder den Stapel der Fenster der reihe nach aufbauen? In der Reihenfolge des Öffnens wäre es dann natürlich klasse, sodass das zuletzt geöffnete Window wieder oben auf liegt.

        onBlur() war eine doofe Idee, da die sich dann all gegenseitig beschäftigen.
        Außerdem soll eigentlich auch nicht der Focus auf dem Fesnter stehen, sondern es soll nur wieder hochkommen.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. hi,

          onBlur() war eine doofe Idee, da die sich dann all gegenseitig beschäftigen.

          gut, auch erkannt :-)

          Außerdem soll eigentlich auch nicht der Focus auf dem Fesnter stehen, sondern es soll nur wieder hochkommen.

          wie wär's, wenn du den spieß umdrehst?

          nach dem öffnen des neuen fenster begibt sich das hauptfenster wieder in den hintergrund, self.blur().

          gruß,
          wahsaga

          --
          "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
      2. hi,

        willst du soetwas wie call by reference umsetzen?

        genau. dowas wie $$var in PHP & Co.

        das ist kein call by reference, das sind variable variablen.

        Das geht nicht, da ich nur den Namen der Variablen habe, aber nicht die Variable selber.

        war es in JS nicht so, dass alle bekannten objekte (und variablen sind ja für JS auch objekte) sich auch über window["objektname"] ansprechen lassen ...?

        Aber Arrays sind eine Lösung. Das klappt so. Ich bin mir aber eben unsicher, ob das Arrayelement als image deklariert werden muss.

        image? wieso image?

        Ein Problem habe ich noch trotzdem noch. Aus der Hauptseite heraus werden diese Popups geöffnet. Folglich verschwinden die bereits geöffneten hinter der Hauptseite. Nur das zuletzt geöffnete kommt wieder nach oben.

        Wie würdest Du das machen?

        ja willst du denn wirklich, dass sich immer x popups in den vordergrund drängeln ...?

        dem Fenster ein onBlur="self.focus()" verpassen,

        nein, bloss nicht ... das kriegst du ja dann als user gar nicht mehr nach hinten.
        außerdem, wenn es mehr als ein solches popup gibt, endet das im chaos - ein fenster drängelt sich nach vorne, löst dadurch im anderen/_allen_ anderen den onBlur-event aus, voraufhin diese(s) sich wiederum nach vorne drängeln ... welcome to the loop :-)

        oder den Stapel der Fenster der reihe nach aufbauen? In der Reihenfolge des Öffnens wäre es dann natürlich klasse, sodass das zuletzt geöffnete Window wieder oben auf liegt.

        das wäre recht einfach zu realisieren, wenn du die fensternummer nicht wie jetzt beim aufruf der funktion mitgibst, sondern einfach eine globale zählvariable verwendest, und dann bei jedem neu öffnen eines fensters diese um eins hochzählst, und dann
        Bilder[zaehler] = window.open(...);
        verwendest.

        dann könntest du Bilder[i] in einer einfachn for-schleife durchlaufen, und eins nach dem anderen in reihenfolge ihres öffnens nach vorne holen.
        allerdings aufpassen, wenn ein popup zwischendurch vom user geschlossen wurde - dann "fehlt" dir ja jetzt ein fenster in deinem array. also besser vorher noch prüfen, ob das fenster noch existiert (!Bilder[i].closed o.ä.).

        gruß,
        wahsaga

        --
        "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
        1. Hello,

          Ein Problem habe ich noch trotzdem noch. Aus der Hauptseite heraus werden diese Popups geöffnet. Folglich verschwinden die bereits geöffneten hinter der Hauptseite. Nur das zuletzt geöffnete kommt wieder nach oben.

          Wie würdest Du das machen?

          ja willst du denn wirklich, dass sich immer x popups in den vordergrund drängeln ...?

          dem Fenster ein onBlur="self.focus()" verpassen,

          nein, bloss nicht ... das kriegst du ja dann als user gar nicht mehr nach hinten.
          außerdem, wenn es mehr als ein solches popup gibt, endet das im chaos - ein fenster drängelt sich nach vorne, löst dadurch im anderen/_allen_ anderen den onBlur-event aus, voraufhin diese(s) sich wiederum nach vorne drängeln ... welcome to the loop :-)

          Hab ich schon gemerkt ;-(  Hätte es sicher auch durch vorheriges Nachdenken herausfinden können. Aber nach 8 Stunden vor dem Monitor ist die Luft einfach raus...

          oder den Stapel der Fenster der reihe nach aufbauen? In der Reihenfolge des Öffnens wäre es dann natürlich klasse, sodass das zuletzt geöffnete Window wieder oben auf liegt.

          das wäre recht einfach zu realisieren, wenn du die fensternummer nicht wie jetzt beim aufruf der funktion mitgibst, sondern einfach eine globale zählvariable verwendest, und dann bei jedem neu öffnen eines fensters diese um eins hochzählst, und dann
          Bilder[zaehler] = window.open(...);
          verwendest.

          Das bringt dann wieder das Problem mit sich, dass sich jedes Popup mehfach öffnen kann.
          Es werden produkte miteinander verglichen. Die sollen benutzerfreudlich nebeneinander ausgewählt werden können.

          dann könntest du Bilder[i] in einer einfachn for-schleife durchlaufen, und eins nach dem anderen in reihenfolge ihres öffnens nach vorne holen.
          allerdings aufpassen, wenn ein popup zwischendurch vom user geschlossen wurde - dann "fehlt" dir ja jetzt ein fenster in deinem array. also besser vorher noch prüfen, ob das fenster noch existiert (!Bilder[i].closed o.ä.).

          Kann ich denn nicht so ähnlich, wie bei foreach() in PHP einfach die Kette der Elemente durchlaufen, ohne Rücksicht auf den Index?

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. hi,

            Kann ich denn nicht so ähnlich, wie bei foreach() in PHP einfach die Kette der Elemente durchlaufen, ohne Rücksicht auf den Index?

            das könnte in diesem falle eventuell mit einer "for in"-schleife gehen, wie sie http://de.selfhtml.org/javascript/sprache/schleifen.htm#for als "spezielle abart" der normalen for-schleife beschreibt.

            gruß,
            wahsaga

            --
            "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
            1. Hello,

              das könnte in diesem falle eventuell mit einer "for in"-schleife gehen, wie sie http://de.selfhtml.org/javascript/sprache/schleifen.htm#for als "spezielle abart" der normalen for-schleife beschreibt.

              mühsam ernährt sich das Eichhörnchen...
              Aber Du bist ein Schatz. Einen Schritt weiter bin ich nun:

              <html><head><title>Test</title>
              </head><body>

              <script type="text/javascript">
              <!--

              bilder = new Array();

              bilder[1] = 'Hallo';
               bilder[10] = 'du';
               bilder[15] = 'doofi';

              var Ausgabe = '';

              for (var x in bilder)
               {
                 Ausgabe = Ausgabe + bilder[x] + "<br>";
               }

              document.write(Ausgabe);
              // -->

              </script>
              </body></html>

              Harzliche Grüße aus http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              1. Hello,

                und nun sthee ich noch einen Schrit weiter vor dem Abgrund...

                function openWin(url,nummer,height,width,top,left)
                {
                  var x;
                  Bilder[nummer] = window.open(url,'P'+nummer,'height='+height+',width='+width+',top='+top+',left='+left+',dependent=yes,menubar=no,resizable=no,scrollbars=no,status=no,toolbar=no,location=no,hotkeys=no');

                for(var x in Bilder)
                  {
                    if (Bilder[x])
                    {
                      Bilder[x].focus();
                    }
                  }
                }

                Das Problem ist, wie prüfe ich, ob die zu focussierende Seite noch geöffnet ist?
                Das fällt mir einfach nicht ein.

                Solange ich nämlich keines der Popup-Fenster schließe, klappt das prima.
                Aber spätestens, wenn ich eins davon geschlossen habe und das nächste öffne, gibt es einen Laufzeitfehler.

                Man müsste also prüfen, ob das Objekt noch vorhanden ist, und wenn nicht, es auch aus der Collection entfernen, da die sonst ggf. irgendwann überläuft.

                Harzliche Grüße aus http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
                1. Hello,

                  Das Problem ist, wie prüfe ich, ob die zu focussierende Seite noch geöffnet ist?

                  function openWin(url,nummer,height,width,top,left)
                  {
                     var n = 0;

                  //for (var x in Bilder) { n++; }  // ich würde die left-Position nun noch gerne
                                                       // von der tatsächlichen Anzahl geöffneter
                                                       // Fenster abhängig machen und vor Allem die
                                                       // bereits geschlossenene aus der Collection
                                                       // entfernen!

                  Bilder[nummer] = window.open(url,'P'+nummer,'height='+height+',width='+width+',top='+top+',left='+left+',dependent=yes,menubar=no,resizable=no,scrollbars=no,status=no,toolbar=no,location=no,hotkeys=no');

                  for(var x in Bilder)
                     {
                       if (Bilder[x].closed == false)
                       {
                         Bilder[x].focus();
                       }
                     }

                  if(Bilder[nummer].closed == false)
                     {
                       Bilder[nummer].focus();
                     }
                  }

                  Harzliche Grüße aus http://www.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau