Supahanz: Fenster per Link öffnen, wenn vorhanden nur fokussieren.

So, ich nochmal. Musste leider ein neues Thema aufmachen, an das alte kam ich nur über's Archiv dran und dort war kein Antworten möglich. Ich verzweifele langsam. Kurz nochmal die Original-Fragestellung:

"Per Link wird ein Fenster geöffnet. Wenn jedoch ein zweites Mal auf den Link geklickt wird, soll sich die Seite nicht nochmal im gleichen Fenster öffnen, sondern nur die bereits geöffnete Seite fokussieren. Mit window.closed hab ich jetzt den ganzen Abend herumexperimentiert, hab's aber nicht hinbekommen."

Verschiedene Vorschläge wurden gepostet:

von Cybaer:

<script type="text/javascript" language="JavaScript"><!--
function openWindow(url,name,pos,win) {
  if(win && !win.closed) {
   win.focus()
  } else {
   win=window.open(url,name,pos);
  }
  return win;
}

// Deklaration
var myWindow;

// Testausgabe
aktuell=new Date();
document.write(aktuell.getHours()+":"+aktuell.getMinutes()+":"+aktuell.getSeconds())+"<br>";
//--></script>

<a href="test3.htm" onClick="myWindow=openWindow(this.href,'testname','width=400,height=300,left=50,top=50',myWindow); »» return false">Open Window</a>

Das Script habe ich aber nicht korrekt zum Laufen gebracht, was aber wohl eher an mir als an dem Script liegt.

Andere Variante von Tom:

<HEAD>
  <TITLE>Window Open</TITLE>

<script type="text/javascript">
  <!--
    f1 = false;

function openWin()
    {
      if ((f1==false) || (f1.closed == true))
      {
        //alert('ich öffne');
        f1 = window.open('http://bitworks.de','test','width=800, >> height=600');
      }
      f1.focus();
      return false;
    }
  //-->
  </script>

</HEAD>

<BODY>
  <a href="http://de.selfhtml.org" onclick="return openWin();">Open »» Window</a>
</BODY>

Dieses Script versteht sich prima mit Firefox/Mozilla, aber der Internet-Explorer kann damit nichts anfangen, er öffnet einfach das zu öffnende Fenster im Hauptfenster.

Überlegt habe ich jetzt schon, ob ich für den Internet-Explorer ein Fenster mit dem "ShowModelessDialog"-Befehl öffnen soll. Das ist ein IE-spezifischer Befehl, der ein Fenster die ganze Zeit im Vordergrund hält, aber trotzdem weiterhin erlaubt, im Hauptfenster Text zu markieren etc. Ich habe versucht, das mit einer appName if/else-Abfrage zu verwirklichen. Das geht aber nicht gut, der IE öffnet dann 2x das selbe Fenster und zeigt das auch noch im Hauptfenster.

Ich verzweifele langsam... Ich hoffe, jemand hat noch einen Tipp parat.

In diesem Sinne, ein Gruß vom Hanz.

  1. Hallo Hanz,

    <script type="text/javascript">
      <!--
        f1 = false;

    var f1 = false; vgl. http://de.selfhtml.org/javascript/sprache/variablen.htm#definieren Punkt Erleuterung
    möglicherweise mag es dann der IE (habe leider keinen zum testen)

    function openWin()
        {
          if ((f1==false) || (f1.closed == true))
          {
            //alert('ich öffne');
            f1 = window.open('http://bitworks.de','test','width=800, >> height=600');
          }
          f1.focus();
          return false;
        }
      //-->
      </script>

    Gruß aus Berlin!
    eddi

    --
    wahsaga (?t=90932&m=546295)
    > vielleicht könnte man für heteros eine "strict"-DTD zu grunde legen [...oder...] eine darauf anwendbare CSS-eigenschaft 'sex'
    In dem Sinne: Ein "Hoch" auf die Liebe zwischen Menschen! ;)
  2. Hallo Supahanz,

    Ich verzweifele langsam...

    na supa - gleich verzweifeln.

    Ich hoffe, jemand hat noch einen Tipp parat

    mußt grad' mal nachschaun. Ich hab das mal so gemacht:

    function info(seite,_hoehe,_oben,_breite,_links)
    {
       //hier werden nur die uebergebenen Maße initialisiert
       init_masse(_hoehe,_oben,_breite,_links)

    //hier die eigentliche Funktion
       if(!fenster || fenster.closed)
          fenster=window.open(seite,'','width='+breite+',height='+hoehe+',top='+oben+',left='+links+',resizable='+resize+',scrollbars='+scroll);
       else
          fenster.focus();

    return void(null);
    }

    kann man bei meinem Pizzataxi testen (auf das kleine Fragezeichen klicken, dann geht ein Fenster auf). Die ganze .js-Datei kannst Du Dir dann ja mal selber ankucken.

    Wichtig ist, daß Du die Variable für das Fenster vorher bekannt machst.

    läuft bei mir im Mozilla und IE einwandfrei. Im Opera natürlich nicht, aber der ist auch nicht maßgeblich für JS.

    Gruß, Andreas

    --
    gemeinsam wehren:
    gegen das größte Weihnachtsgesteck der Welt in Dortmund
  3. Also...

    Es war tatsächlich nur die Frage der Variablendefinition. Erschließt sich mir nicht ganz, warum dass mit "var" davor jetzt tut, aber mir soll's recht sein. Schankedön :).

    Dank auch an Andreas, auch wenn ich dein Skript wohl nicht verwende, aber jetzt hab ich noch eins mehr ;).

    Eine allerletzte Frage hab ich aber noch. Angenommen, dieses Fenster würde von einer anderen Seite aufgerufen werden (Also man klickt auf den Link, der das Fenster öffnet. Dann geht man auf eine andere Seite und klickt dort auf den Link, der das Fenster öffnet), ist es dann möglich, dass die Funktion seitenübergreifend wirkt? Das auch derselbe Link auf der neuen Seite erst nachfragt, ob das Fenster existiert und in dem Fall nur das schon bestehende Fenster fokussiert?

    In diesem Sinne, ein Gruß vom Hanz.

    1. Eine allerletzte Frage hab ich aber noch.

      dann ist aber Schuß! ;-)

      Angenommen, dieses Fenster würde von einer anderen Seite aufgerufen werden... ist es dann möglich, dass die Funktion seitenübergreifend wirkt?

      das hängt auch wieder davon ab, ob die Variable 'fenster' oder wie immer Du sie nennst, bekannt ist. In einem Frameset kannst Du sowas machen, wenn die enstprechende Variable in einem Frame oder dem Frameset selbst abgelegt ist, und die Seite mit der Variable sich für diesen Vorgang nicht ändert.

      Gruß, Andreas

      --
      gemeinsam wehren:
      gegen das größte Weihnachtsgesteck der Welt in Dortmund
      1. In einem Frameset kannst Du sowas machen, wenn die enstprechende Variable in einem Frame oder dem Frameset selbst abgelegt ist, und die Seite mit der Variable sich für diesen Vorgang nicht ändert.

        Hmm... Die Seite, in der das Frame-Set definiert wird, ist meine index.html, da wäre die Variable also immer da. Außerdem gibt es 4 Frames, von denen sich nur einer ändert, also hätte ich davon genug. Nur, wie leg ich meine Variable dahin? Ich kann ja nicht einfach den Javascript-Code reinkopieren. Da steht, da die Funktion nie aufgerufen wird, quasi nur, dass f1 (meine Variable) nicht existiert, was nicht unbedingt hilfreich ist... Wie mach ichn dann das?

        In diesem Sinne, ein Gruß vom Hanz.

        1. hi,

          Nur, wie leg ich meine Variable dahin?

          http://de.selfhtml.org/javascript/objekte/frames.htm#scripts sollte weiterhelfen.

          gruß,
          wahsaga

          --
          "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
          1. http://de.selfhtml.org/javascript/objekte/frames.htm#scripts sollte weiterhelfen.

            Jep, der Link half, danke. Allerdings hab ich jetzt wieder das alte Problem. Firefox: Ja, InternetExplorer: Nein. Der Iexplorer will erst die verlinkte Datei (in dem Fall "bestellung.php") herunterladen (hä?) und gibt bei "Abbrechen" dann die vielsagende Fehlermeldung

            "Der aufgerufene (Server [(nicht die Serveranwendung)] ist nicht verfügbar und verschwunden. Alle Verbindungen sind ungültig. Der Aufruf wurde nicht ausgeführt."

            Hier der gesamte Code:

            Im Header-Frame:

            <script language="javascript">
            var f1 = false;
            function Bestellung_Head()
            {if ((f1==false) || (f1.closed == true))
            {//alert('öffnen');
            f1 = »» window.open("bestellen.php","Wieauchimmer","width=550,height=500,scrollbars=yes,resizable=yes");}
            f1.focus();
            return false;}
            </script>

            Im Hauptfenster:

            <script language="javascript">
            function Bestellung()
            {parent.header.Bestellung_Head();}
            function Bestellformular()
            {Math.PI;}
            </script>

            <a href="javascript:Bestellformular()" class="rot" onclick="return »» Bestellung();">

            Falls sich jemand fragt, was das mit dem Math.PI soll, ich wusste nicht, was sonst hinter das "href" schreiben.

            In diesem Sinne, ein Gruß vom Hanz.

            1. Hoppla, in den Code haben sich ein paar "»" zu viel eingeschlichen. Bitte ignorieren.

              1. OK, hat sich auch erledigt. Ich hab die Datei in "bestellen.html" umbenannt und jetzt tut's auch im IE. Meine Fresse, ich hege mittlerweile bloß noch Antipathie für diesen Browser...

                Nochmal danke an alle Helfer :).

                In diesem Sinne, ein Gruß vom Hanz.

                1. OK, hat sich auch erledigt. Ich hab die Datei in "bestellen.html" umbenannt und jetzt tut's auch im IE. Meine Fresse, ich hege mittlerweile bloß noch Antipathie für diesen Browser...

                  Oder auch nicht. Wenn ich die php-Datei in html umbenenne, dann tut das PHp-Script nicht mehr... Hmm. Was da machen?

                  1. Hi,

                    Oder auch nicht. Wenn ich die php-Datei in html umbenenne, dann tut das PHp-Script nicht mehr... Hmm. Was da machen?

                    Das sollte Dir zu denken geben - kein PHP, alles Ok. Und wo liegt dann wohl der Fehler?

                    freundliche Grüße
                    Ingo

  4. Andere Variante von Tom:

    Da sind ein paar unnötige Abfragen drin.
    Du brauchst f1 nicht zu deklarieren und die Abfragen auf true/false kann man sich in der Regel sparen.

    Das reicht:
      <script type="text/javascript">
        var f1;
        function openWin()
        {
          if ( !f1 || f1.closed)
            f1 = window.open('http://bitworks.de','test','width=800,height=600');

    f1.focus();
          return false;
        }
      </script>

    zumindest bei mir klappt's in den meisten Browsern: http://home.arcor.de/struebig/computer/javascript/test/open_focus.html
    (IE 6, MZ 1.6, FF 0.9)

    Im Opera 7.2 gibt's Probleme

    Struppi.