nobody85: PopUp automatisch schließen?

Hallo,

versuche verzweifelt ein JS zu schreiben, in der ich mehrere Fenster öffne und diese sich nach ein paar Sekunden selbstständig wieder schließen.

Das öffnen klappt prima aber sowie ich den Timeout mit reinnehme klappt das ganze nicht mehr.

Hier der Teil meines Scripts der hackt:

function aufruf() {
f = new Array(links.length);
for (var j=0; j<links.length; j++) {
var tmp = links[j];
f[j]=window.open(links[j], "Fenster"+j, "width=310,height=400,left=0,top="+(j*10));
f[j].setTimeout("display('c','"+ele+"')",3000);
}
}

Weiß jemand Rat? Wenn ich den Timeout einfüge geht immer nur der erste Link auf und es kommt vermutlich zu einem Fehler in der Schleife. Ist bestimmt nur eine Kleinigkeit aber irgendwie sehe ich diese nicht.

Gruß
Nobody85

  1. Hallo,

    was sagt denn die Javascript-Console deines Browsers dazu? Steht da eine sinnvolle Fehlermeldung?

    Gruß,
    Marcel

  2. Hi!

    versuche verzweifelt ein JS zu schreiben, in der ich mehrere Fenster öffne und diese sich nach ein paar Sekunden selbstständig wieder schließen.

    Zum Javascript-Üben oder für den wirklichen Einsatz im Web?
    Im zweiten Fall solltest du dein Vorhaben noch einmal überdenken.
    Nicht jeder User hat JS aktiviert oder überhaupt die Möglichkeit dieses zu nutzen.
    Außerdem gibt es Popupblocker, die dein Vorhaben zunichte machen könnten.
    Mittlerweile verfügt eigentlich jeder aktuelle Browser über so einen Popupblocker.
    Außerdem bieten einige Browser die Möglichkeit, Popups in neuen Tabs statt in neuen Fenstern zu öffnen.

    Hier der Teil meines Scripts der hackt:

    Der hackt? Wirklich? Ist bestimmt nicht schön... :)
    Du meinst, es funktioniert nicht?

    Bekommst du eine Fehlermeldung?
    Wenn ja, welche?

    Bekommst du keine Fehlermeldung?
    Dann solltest du versuchen, den Fehler zu finden:
    Der Firefox bietet dir die "Fehler-Konsole" aus dem Menü "Extras".
    Damit solltest du dem Problem auf den Grund gehen können.
    Ansonsten kannst du auch einen Javascript-Debugger einsetzen.
    Für den Firefox gäbe es das Add-on "JavaScript-Debugger".
    Was andere Browser da bieten, kann ich nicht sagen.
    Schätzungsweise bietet Opera etwas ähnlich brauchbares und über den JS-Debugger des Internet Explorers will ich gar keine Vermutungen anstellen...

    Weiß jemand Rat?

    Wenn du deinen kompletten Code gepostet hättest, dann hätte man das mal ausprobieren können...

    und es kommt vermutlich zu einem Fehler in der Schleife.

    Finde dies raus, indem du einen JS-Debugger oder ein ähnliches Werkzeug einsetzt.

    Schöner Gruß,
    rob

    1. Hallo,

      Zum Javascript-Üben oder für den wirklichen Einsatz im Web?

      Es soll nachher wirklich funktionieren. Ich muss mehrere Links öffnen können aber da es einige sein können, und ich diese auch nicht alle wieder zuklicken will soll das automatisch funktionieren. Soweit ich weiß geht das rein mit html nicht oder liege ich da falsch?

      Bekommst du eine Fehlermeldung?

      Jain, im IE bekomme ich die Fehlermeldung "Zugriff verweigert, und der Firefox bringt keinerlei Fehler,allerdings funktioniert das Timeout auch nicht.

      Wenn du deinen kompletten Code gepostet hättest, dann hätte man das mal ausprobieren können...

      Sorry kommt natürlich nach. Außerdem hatte ich auch noch ne falsche Zeile drin. Also hier nochmal (ist aus verschiedenen zusammenkopiert):
      <html>
      <head>
      <script type="text/javascript">
      <!--
      function zusammenfassen() {
      var a=eval(document.getElementsByTagName("a"));
      links = new Array();
      for (var j=0; j<a.length; j++) {
      if (a[j].href.indexOf("www")>0) {
      links[j]=a[j].href;
      a[j].style.visibility="hidden";
      }
      }
      document.getElementById("einklick").style.visibility="visible";
      }

      function aufruf() {
      f = new Array(links.length);
      for (var j=0; j<links.length; j++) {
      var tmp = links[j];
      f[j]=window.open(links[j], "Fenster"+j, "width=310,height=400,left=0,top="+(j*10));
      f[j].setTimeout ('window.close()',2000);

      }
      }
      //-->
      </script>
      </head>
      <body onload="zusammenfassen()">
      <a href="http://www.muster.de/">"http://www.muster.de/"</a><br>
      <a href="http://www.beispiel.de/">"http://www.beispiel.de/"</a></br>
      <a href="http://www.test.de/">"http://www.test.de/"</a></br>
      <a href="javascript:aufruf()" style="visibility:hidden" id="einklick">alles auf einen Klick</a>

      </body>
      </html>

      Sieht jemand einen Fehler?

      Gruß
      nobody

  3. Hallo Nobody85,

    Hier der Teil meines Scripts der hackt:

    function aufruf() {
    f = new Array(links.length);
    for (var j=0; j<links.length; j++) {
    var tmp = links[j];
    f[j]=window.open(links[j], "Fenster"+j, "width=310,height=400,left=0,top="+(j*10));

    (1)

    f[j].setTimeout("display('c','"+ele+"')",3000);
    }
    }

    Zuerst ein Vorschlag - auf die Fehlerkonsole des FF wurdest du ja schon hingewiesen - füg doch mal an Stelle (1) ein alert(f[j] ein. Ist jetzt nur ein Schuß ins blaue, aber vielleicht klappt ja doch irgendwie was mit dem Erstellen des Fensters nicht... Ich könnte mir auch vorstellen, dass der browser ein paar ms braucht, bevor das Objekt richtig zur Verfügung steht und man setTimeout anwenden kann. Ist jetzt aber erstmal nur so eine Vermutung.

    Dann noch zwei kleine fragen:

    1. sind links und ele tatsächlich globale variablen, wie ich vermute? - ist meiner Ansicht nach nicht so guter Stil, warum übergibst du diese nicht als Parameter, wenn du Sie innerhalb der Funktion brauchst?

    2. brauchst du die Variable tmp, oder ist die beim debuggen und ausprobieren übrigggeblieben?

    Liebe Grüße mbr

    1. Hallo,
      und vielen Dank für deine Antwort.

      Ich hatte versehentlich eine falsche Zeile gepostet. Ich habe den kompletten Quelltext bereits komplett im Thread gepostet (siehe unten).

      Leider weiß ich nicht genau wie ich mit der Debugkonsole umgehen soll.
      Ich habe komischerweise auch einen Unterschied zwischen Firefox und IE. Beim IE geht nur ein Fenster meiner 3 Links auf, und danach wirft die Debugkonsole einen Fehler "Zugriff verweigert".
      Beim Firefox gehen alle Links auf, aber das Timeout funktioniert nicht. In der Konsole ist auch nicht ersichtlich, dass diese Zeile einen Fehler verursacht.

      Hilft dir der Quelltext im Thread weiter?

      Würde mich sehr über Hilfe freuen.

      Gruß
      Nobody

      1. Hello,

        Leider weiß ich nicht genau wie ich mit der Debugkonsole umgehen soll.
        Ich habe komischerweise auch einen Unterschied zwischen Firefox und IE. Beim IE geht nur ein Fenster meiner 3 Links auf, und danach wirft die Debugkonsole einen Fehler "Zugriff verweigert".

        ...die Fehlermeldung sollte dich auf die Fährte bringen. Kann es sein, dass PopUp und Hauptfenster von unterschiedlichen Domains stammen? Wenn ja, bist du an der Same-Origin-Policy gescheitert und nein, da gibts auch keine direkte Lösung für.

        MfG
        Rouven

        --
        -------------------
        There's no such thing as a free lunch  --  Milton Friedman
        1. Hallo,

          vielen Dank für den Tipp. Ich befürchte du hast recht. Die Seite liegt und wird auch immer lokal auf dem Rechner der das Script anwendet liegen und dann die darin vermerkten Links aufrufen. Sprich es sind 2 verschiedene Domänen.

          Gibt es eine Möglichkeit das ganze zum umgehen? Wenn Mögliche eine Variante, die nicht bei jedem Anwender als Zertifikat oder ähnliches importiert werden muss?

          Oder kennt jemand eine ganz andere Möglichkeit? Es muss ja nicht zwingend JS sein.

          Würde mich über eine schnelle Antwort freuen!

          Gruß
          Nobody

          1. Hello,

            Oder kennt jemand eine ganz andere Möglichkeit? Es muss ja nicht zwingend JS sein.

            dazu müsstest du genauer sagen, was du eigentlich vorhast. Was klappen könnte:

            1. Frameset von deinem Server, nur ein Frame mit der eigentlich Seite (ungetestet)
            2. Seite mittels PHP oder anderer serverseitiger Technologie vom Ursprungsort abrufen und dann quasi "selbst" darstellen.

            MfG
            Rouven

            --
            -------------------
            Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet
            1. Hallo,

              Was ich vorhabe:
              Ich exportiere aus einem Programm, das offline arbeitet, eine HTML-Seite lokal auf meinen Rechner. Diese beinhaltet jede Menge Links zu anderen Servern. Diese Links will ich auf einmal alle öffnen (oder auch kurz hintereinander) und die Fenster anschließend (da es einige sein können) wieder beenden.

              Da ich sozusagen nur lokal arbeite ist das mit den serverseitigen Geschichten so eine Sache!
              Wie kann man das Problem lösen?

              Gruß
              Nobody85

              1. Hello,

                Da ich sozusagen nur lokal arbeite ist das mit den serverseitigen Geschichten so eine Sache!

                das eine schließt das andere nicht aus. Du könntest dir beispielsweise lokal einen Apache und PHP installieren, die HTML-Seite über den localhost aufrufen und dort dann auch ein PHP-Skript ablegen, das die externen Seiten abruft.

                Wie kann man das Problem lösen?

                Nochmal: Alternativ könntest du es mit einem Frameset probieren.
                HTML -> PopUp = lokales Frameset -> 1 Frame mit externer Seite.

                MfG
                Rouven

                --
                -------------------
                Computer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice. Like drawing, it can be shaped to a variety of ends: commercial, artistic, and pure entertainment. Programmers have a well-deserved reputation for working long hours but are rarely credited with being driven by creative fevers. Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see. -- Larry OBrien and Bruce Eckel in Thinking in C#
                1. Hallo,

                  ich habe noch ein bisschen umprogrammiert und eine fast laufende Möglichkeit gefunden.
                  Ich habe statt dem Timeout eine weitere Schleife geschrieben, die alle Fenster nach Ablauf einer gewissen Zeit schließt.
                  Das funktioniert auch prima, leider lädt nur die sich öffnende Seiten sich nicht.

                  Mit den Frames das funktioniert leider auch nicht!

                  Ich vermute es liegt dran, dass der "tread" hängt und ein Laden somit nicht möglich ist. Hier die wichtigsten Auszüge:

                  function pausecomp(millis){
                  var date = new Date();
                  var curDate = null;
                  do { curDate = new Date(); }
                  while(curDate-date < millis);
                  }

                  function aufruf() {
                  f = new Array(links.length);
                  for (var j=0; j<links.length; j++) {
                  var tmp = links[j];
                  f[j]=window.open(links[j], "Fenster"+j, "width=310,height=400,left=0,top="+(j*10));
                  }
                  var tmp = f.length;
                  if (tmp<=5) tmp=5;
                  pausecomp((tmp/10)*5000);
                  for (var j=0; j<links.length; j++) {
                  f[j].close();
                  }

                  Weiß jemand wie ich vielleicht ein parallelen Task oder Timertask starten kann?
                  Bei dem Befehl wird der "Zugriff verweigert":
                  f[j].setTimeout ('window.close()',2000);

                  Würde mich über Hilfe sehr freuen!

                  Gruß
                  Nobody85