cOopernicus: Zwei Popups in den '...focus()' Vordergrund

Hallo Gemeinde,
ich schlage mich mit folgenden Problem herum: Auf einer Hauptseite
habe ich viele kleine Thumbnails, die ich mit der Funktion 'pop_bild'
in einem popup in einer größeren Variante darstelle. Falls der User
bei geöffnetem Popup auf einen anderen Thumb klickt, läd sich dieses im gleichen Popup-Fenster, wobei dieses über 'xy.focus()' wieder in den Vordergrund geholt wird. Funktioniert soweit wunderbar.

Dann habe ich auf der Hauptseite aber auch ein Popup mit einem Kommentar-Formular.Das Popup ist ganz ähnlich (nur ohne austauschbaren Inhalt - aber egal für mein Problem).

Beide Popups sind unabhängig voneinander und funktionieren für sich auch.
ABER: Bei geöffnetem Bild-Popup möchte ich gerne auf den Formular-Link in der Hauptseite klicken (Bild-Popup geht somit in den Hintergrund) und möchte dass sich das Bild-Popup nach vorn schiebt und dann das Formular-Popup daneben erscheint. D.h. beide Popups sollen vor der Hauptseite erscheinen.

Mit den folgenden Funktionen geht es NICHT, denn ich bekomme die
Fehlermeldung, dass bspw. 'pb undefined' ist.

Kann mir jemand einen Hint geben, wie ich mein Problemchen lösen könnte?

Vielen Dank

cOopernicus

QUELLCODE:
...

function pop_form()
{
 pf=window.open("popform.php","pf","height=300,width=618");

if (pb)       // geht nicht !
 {            //
  pb.focus(); //
 }           //
 pf.focus();
}

function pop_bild(bn)
{
 pb=window.open("popbild.php?bd="+bn+"","pb","height=600,width=800");

if (pf)       // geht nicht !
 {            //
  pf.focus(); //
 }           //
 pb.focus();
}

  1. Hallo cOopernicus,

    Beide Popups sind unabhängig voneinander und funktionieren für sich auch.
    ABER: Bei geöffnetem Bild-Popup möchte ich gerne auf den Formular-Link in der Hauptseite klicken (Bild-Popup geht somit in den Hintergrund) und möchte dass sich das Bild-Popup nach vorn schiebt und dann das Formular-Popup daneben erscheint. D.h. beide Popups sollen vor der Hauptseite erscheinen.

    Dass du insgesamt drei Fenster belegst, ist kein durchdachtes Konzept. Auch dass du ein 800×600-Fenster öffnest, ist unvorteilhaft, so es denn bei einer 800×600-Auflösung den vollen Bildschirm belegen würde, was schlecht möglich ist, wenn noch zusätzliche Leisten aktiviert sind. Bitte mache deshalb das Fenster kleiner und beide Fenster vergrößer- und verkleinerbar durch resizable=yes im dritten Parameter. Nur dadurch ist garantiert, dass der Besucher letztlich den Inhalt lesen kann, denn deine Popups selbst sind alles andere als flexibel.

    Mit den folgenden Funktionen geht es NICHT, denn ich bekomme die
    Fehlermeldung, dass bspw. 'pb undefined' ist.

    Für den Internet Explorer wurden die Variablen pb und pf in einem begrenzten Geltungsbereich, nämlich dem der jeweiligen Funktionen, deklariert. Dadurch kann nach Ausführen der Funktion nicht von »außerhalb«, also beispielsweise einer anderen Funktion, auf die Variable zugegriffen werden. Dies kannst du umgehen, indem du die Variablen global deklarierst, also vor den Funktionen
      var pf,pd;
    notierst.
    http://selfhtml.teamone.de/javascript/sprache/variablen.htm#definieren

    Im Gecko und Opera ist dies übrigens nicht nötig, und dass es im MSIE nötig ist, wundert mich, vielleicht übersehe ich etwas...

    Mathias

    --
    »Emphasize structure through presentation« http://www.w3.org/TR/WCAG20/#structure-emphasis
    1. hi,

      http://selfhtml.teamone.de/javascript/sprache/variablen.htm#definieren

      Im Gecko und Opera ist dies übrigens nicht nötig, und dass es im MSIE nötig ist, wundert mich, vielleicht übersehe ich etwas...

      entweder der IE oder die anderen beiden weichen dann wohl vom konzept der trennung von globalen und lokalen variablen ab - wer hier "im recht" ist, müsste man im zweifelsfalle wohl in der spezifikation von ECMA-script nachsehen (bin aber zu faul mich jetzt auf die suche zu machen, bei der hitze, *ächz*).

      gruss,
      wahsaga

      1. Hallo,

        IMHO sind nur Variablen, die innerhalb von Anweisungsbloecken mit dem Schluesselwort 'var' deklariert werden, lokale Variablen...

        Dass jetzt aber sowohl die Opera- als auch die Mozilla-Engine UNDEFINIERTE Variablen mit Werten vergleichen, ohne zu meckern, ist IMHO schon ein (Schenkel-)Klopfer !

        Schliesslich protestieren sie ja nicht mal, wenn die zweite Funktion noch garnicht gelaufen ist !

        (Soviel als kleiner Seitenhieb auf die Mozilla-/Opera-Anbeter) SCNR

        gruesse
        rainer groth

        --
        ss:| zu:} ls:& fo:) de:] va:| ch:] n4:° rl:? br:$ js:| ie:| fl:( mo:?
        (--> einer der letzten bauhaeusler <--)
        1. hi,

          IMHO sind nur Variablen, die innerhalb von Anweisungsbloecken mit dem Schluesselwort 'var' deklariert werden, lokale Variablen...

          stimmt, hast recht, zitat selfhtml:
          "Eine lokale Variable erhalten Sie durch die Deklaration der Variablen mit var innerhalb einer  Funktion. [...] Wenn Sie innerhalb von Funktionen Variablen ohne das Schlüsselwort var deklarieren, dann sind diese Variablen global."

          gruss,
          wahsaga

  2. Hallo cOopernicus,

    QUELLCODE:

    wie Dir schon von molily mitgeteilt wurde, musst Du hier erstmal deine Variablen deklarieren:

    var pb,pf;

    function pop_form()
    {
     pf=window.open("popform.php","pf","height=300,width=618");

    if (pb)       // geht nicht !

    diese Abfrage geht jetzt - Du solltest sie aber ergaenzen (koennte ja sein, dass User das Popup geschlossen hat):

    if(pb && pb.closed==false)

    {            //
      pb.focus(); //
     }           //
     pf.focus();
    }

    function pop_bild(bn)
    {

    weil ich gleich ein Problem erahne, schlage ich Dir vor, den URI in einer Variablen als String abzulegen:

    datei="popbild.php?bd"+bn;

    pb=window.open("popbild.php?bd="+bn+"","pb","height=600,width=800");

    die Methode 'open' kennt bis zu drei Argumente - wenn ich Dein Konstrukt mit Browser-Logik betrachte, lautet das zweite Argument (der HTML-Target-Wert) "" und der dritte (die Darstellungsanweisungen) "pb" - das unerwartete VIERTE Argument "height=600,width=800" wuerde ich (als Browser) ignorieren :-)

    deshalb jetzt besser:

    pb=window.open(datei,"pb","height=600,width=800")

    if (pf)       // geht nicht !

    hier nochmal analog zum obigen Fall:

    if(pf && pf.closed==false)

    {            //
      pf.focus(); //
     }           //
     pb.focus();
    }

    Nun sollte es klappen - auch mit den Fenstern :-)

    gruesse
    rainer groth

    --
    ss:| zu:} ls:& fo:) de:] va:| ch:] n4:° rl:? br:$ js:| ie:| fl:( mo:?
    (--> einer der letzten bauhaeusler <--)
    1. Hallo Rainer,

      pb=window.open("popbild.php?bd="+bn+"","pb","height=600,width=800");

      die Methode 'open' kennt bis zu drei Argumente - wenn ich Dein Konstrukt mit Browser-Logik betrachte, lautet das zweite Argument (der HTML-Target-Wert) "" und der dritte (die Darstellungsanweisungen) "pb" - das unerwartete VIERTE Argument "height=600,width=800" wuerde ich (als Browser) ignorieren :-)

      Nein, friemel das Konstrukt doch einmal auseinander. Der Ausdruck ist richtig, aber ein Teil ist unnötig.

      window.open(
       "popbild.php?bd="+bn+"", /* erster Parameter */
       "pb",                    /* zweiter Parameter */
       "height=600,width=800"   /* dritter Parameter */
      )

      Der erste Parameter ist ein Ausdruck, in welchem drei Strings aneinandergehängt werden, mit dem Operator »+«:

      "popbild.php?bd=" + bn + ""

      Der letzte String ist jedoch vernachlässigbar, da er leer ist, also lässt es sich auf folgendes kürzen:

      "popbild.php?bd=" + bn

      Dieser Ausdruck liefert natürlich einen zusammenhängenden String. Letztlich wird die Funktion bzw. Methode folglich mit drei Parametern des Types String gefüttert. Es ist somit dasselbe wie...

      datei="popbild.php?bd="+bn;
      pb=window.open(datei, "pb", "height=600,width=800");

      ...denn sofern der Ausdruck, welche die Variable datei bildet, als zweiter Parameter eingesetzt wird, sähe es so aus:

      pb=window.open("popbild.php?bd="+bn, "pb", "height=600,width=800");

      Dies wäre äquivalent, denn der Ausdruck wird zuerst berechnet, es ist dasselbe wie bei window.alert('bla'+variablenname+'bla') usw., nur dass eben dahinter noch weitere Parameter folgen, durch Kommas abgetrennt.

      Grüße,
      Mathias

      --
      »Das Usenet ist mittlerweile in Teilen unbenutzbar geworden, ein düsterer, mit Glasscherben und Hundescheiße übersäter Spielplatz für Kontroll- und Hassmaniker, deren Neurosen sich gegenseitig ergänzen.« (MH)
      1. Hallo Mathias,

        verstehe ich Dich richtig: die Argumente werden durch die ',' getrennt und nicht durch die "" definiert ?

        Ist das nach Deiner Erfahrung zuverlaessig ? (Bitte sag ja - waere toll :-))

        gruesse
        rainer groth

        --
        ss:| zu:} ls:& fo:) de:] va:| ch:] n4:° rl:? br:$ js:| ie:| fl:( mo:?
        (--> einer der letzten bauhaeusler <--)
        1. Hallo,

          verstehe ich Dich richtig: die Argumente werden durch die ',' getrennt und nicht durch die "" definiert ?

          Was meinst du mit definiert? Sofern ein Argument aus einem einzigen String besteht, wird es natürlich mit Anführungszeichen begrenzt (bspw. window.alert('bla')). Ein Argument kann aber auch anders notiert sein.

          Funktionsargumente werden immer durch Kommas getrennt. Zwischen den Kommas kann ein beliebiger Ausdruck mit jeder möglichen Operation bzw. jedem möglichen Methodenaufruf stehen, wie er beispielsweise auch in einer Wertzuweisung möglich ist, solange die Syntax stimmt.

          Anführungszeichen begrenzen lediglich Strings und haben mit dem Aufbau der Parameterliste nichts zu tun. Ein Argument kann wie gesagt aus mehreren verketteten direkt notierten Strings bzw. Stringvariablen bzw. in Strings umwandelbare Variablen bestehen. Zur Sicherheit kann man um diesen Ausdruck zusätzliche Klammern notieren, also bla( ('x'+variable+'y'), ('a'+'b'+'c') ); usw., das sollte aber nicht nötig sein.

          Ist das nach Deiner Erfahrung zuverlaessig ? (Bitte sag ja - waere toll :-))

          Sofern ich dich nicht falsch verstanden habe: Ja, das sind grundlegende JavaScript-Syntaxregeln.

          Mathias

          --
          »Das Usenet ist mittlerweile in Teilen unbenutzbar geworden, ein düsterer, mit Glasscherben und Hundescheiße übersäter Spielplatz für Kontroll- und Hassmaniker, deren Neurosen sich gegenseitig ergänzen.« (MH)
          1. Danke Mathias !

            gruesse
            rainer groth

            --
            ss:| zu:} ls:& fo:) de:] va:| ch:] n4:° rl:? br:$ js:| ie:| fl:( mo:?
            (--> einer der letzten bauhaeusler <--)