jejay: Onclick-Event verzögern oder Link anderweitig verzögern

Hallo,

Ich habe folgendes Problem: Ich möchte, dass ein Link der Art
<a href="http://www.ard.de" target="blank">ARD</a>
erst nach ein paar Sekunden aufgerufen wird.

Mein Ansatz sah so aus, dass ich onclick false returnen lasse und dann nen Timer setze, der den OnClick-Handler wieder true returnen lässt und anschließend das OnClick-Event erneut auslöst. Nur leider habe ich dann das Problem, dass die Seite von den meisten PopUp-Blockern abgefangen wird...

lg,
Julian

  1. Hallo, Julian!

    Erstens heißt es target="_blank" und nicht "blank" und zweitens wird der Popup-Blocker wahrscheinlich unter anderem darauf reagieren, dass das Event per JS ausgelöst wird und der Link eine externe Seite ist (Same Domain).

    Gruß, LX

    --
    RFC 1925, Satz 6a: Es ist immer möglich, einen weiteren Umweg einzufügen.
    RFC 1925, Satz 11a: Siehe Regel 6a
    1. Hallo, Julian!

      Hallo LX :)

      Erstens heißt es target="_blank" und nicht "blank"

      Das ist mir natürlich bewusst, Tippfehler, war ja kein ernstzunehmendes Code-Beispiel :)

      und zweitens wird der Popup-Blocker wahrscheinlich unter anderem darauf reagieren, dass das Event per JS ausgelöst wird und der Link eine externe Seite ist (Same Domain).

      Ja mir ist klar, warum der PupUp-Blocker ausgeslöst wird. Deswegen wollte ich ja auch wissen, ob es irgendeine Möglichkeit gibt, anstatt das OnClick-Event neu auszulösen, es nur zu verzögern.

      lg, Julian

      1. Hi,

        Deswegen wollte ich ja auch wissen, ob es irgendeine Möglichkeit gibt, anstatt das OnClick-Event neu auszulösen, es nur zu verzögern.

        Nein.

        Ein Event tritt ein, und dann wird die Hierarchie durchwandert (bubbling/capturing) und geschaut, wer sich für zuständig hält. Angemeldete Funktionen werden ausgeführt, und dann ist irgendwann das durchwandern zuende und damit die Eventverarbeitung fertig.

        Du kannst zwar in der konkreten Verarbeitung eines Events etwas mittels setTimeout/setInterval "aufrufen" - aber das wird aus dieser herausgelöst bearbeitet, und beeinflusst deren Zuendekommen deshalb nicht.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. Hi,

          oder, um mich noch mal kürzer* zu fassen:

          Es gibt in JavaScript kein wait() oder sleep().

          MfG ChrisB

          * und weniger schwurbelig

          --
          Light travels faster than sound - that's why most people appear bright until you hear them speak.
          1. Es gibt in JavaScript kein wait() oder sleep().

            Das ist in meinem Fall blöd. Aber vielen Dank.

            Tja dann siehts wohl fast so aus, als wäre es nicht Möglich, dass sich ein Fenster nach seinem Link-Klick verzögert öffnet, ohne, dass der PopUp-Blocker anspringt.

            lg, Julian

          2. Hallo,

            Es gibt in JavaScript kein wait() oder sleep().

            Man könnte das doch einfach nachbauen, indem man z.B. eine Schleife solange durchläuft, bis die gewünschte Zeit abgelaufen ist. Natürlich friert die Oberfläche inwischen ein... und mir ist auch nicht ganz klar, warum jemand absichtlich die Performance herabsetzen will...

            Gruß, Don P

            1. Natürlich friert die Oberfläche inwischen ein...

              Das wäre ja dann theoretisch der Unterschied zwischen einer JavaScript-eigenen sleep()-funktion und soetwas selbstgebautem.

              lg, Julian

              1. Hallo,

                Natürlich friert die Oberfläche inwischen ein...
                Das wäre ja dann theoretisch der Unterschied zwischen einer JavaScript-eigenen sleep()-funktion und soetwas selbstgebautem.

                Eher der *praktische* Unterschied, wobei ich das auch nicht ganz einsehe. Sleep ist eben sleep, da machen auch andere Programme nichts anderes als schlafen, bis es weitergehen soll.

                Vermutlich ist das der Grund, warum es in JS so etwas nicht gibt: Wer es haben will, kann es leicht erreichen durch eine Schleife, und falls die Oberfläche nicht einfrieren soll, steht ja setimeout zur Verfügung.

                Gruß, Don P

                1. Eher der *praktische* Unterschied, wobei ich das auch nicht ganz einsehe. Sleep ist eben sleep, da machen auch andere Programme nichts anderes als schlafen, bis es weitergehen soll.

                  Ich meinte theoretisch in dem Sinne, dass es ihn nicht gibt, weil es die Möglichkeit dazu nicht gibt :) Naja würde der Browser die "schlafende Funktion" auf einen eigenen Thread legen, könnte der Rest des Browsers/Scripts ohne Probleme weiter laufen. Ist das eine so abwegige Vorstellung?

                  lg, Julian

                  1. Hi,

                    Naja würde der Browser die "schlafende Funktion" auf einen eigenen Thread legen, könnte der Rest des Browsers/Scripts ohne Probleme weiter laufen. Ist das eine so abwegige Vorstellung?

                    Nein - und genau deshalb ist das auch genau das, was setTimeout bzw. setInterval machen.

                    Die Funktion "schläft" nur nicht - denn das wäre sleep(), und warum das in JavaScrpt wenig wünschenswert ist, hatten wir ja geklärt - sondern sie wird für spätere Abarbeitung auf einen Stack gelegt.

                    MfG ChrisB

                    --
                    Light travels faster than sound - that's why most people appear bright until you hear them speak.
      2. Hallo, Julian!

        Manche Popup-Blocker erlauben es, dass Popups von der gleichen Domäne geöffnet werden - das kannst Du folgendermaßen nutzen: öffne nach dem Timeout per JS mit window.open ein Popup, in welchem eine minimalistische HTML-Datei aus der gleichen Domäne steckt, die jedoch im wesentlichen einen Meta-Refresh enthält, der auf die externe Seite führt.

        Gruß, LX

        --
        RFC 1925, Satz 6a: Es ist immer möglich, einen weiteren Umweg einzufügen.
        RFC 1925, Satz 11a: Siehe Regel 6a
        1. Manche Popup-Blocker erlauben es, dass Popups von der gleichen Domäne geöffnet werden - das kannst Du folgendermaßen nutzen: öffne nach dem Timeout per JS mit window.open ein Popup, in welchem eine minimalistische HTML-Datei aus der gleichen Domäne steckt, die jedoch im wesentlichen einen Meta-Refresh enthält, der auf die externe Seite führt.

          Ja das hatte ich mir auch überlegt, allerdings liegt das href-Attribut aus bestimmten Gründen nicht in meinem Einflussgebiet. Ich habe nur Zugriff auf den OnClick-Eventhandler. Trotzdem Vielen Dank :)

          lg

          1. Hi,

            Manche Popup-Blocker erlauben es, dass Popups von der gleichen Domäne geöffnet werden - das kannst Du folgendermaßen nutzen: öffne nach dem Timeout per JS mit window.open ein Popup, in welchem eine minimalistische HTML-Datei aus der gleichen Domäne steckt, die jedoch im wesentlichen einen Meta-Refresh enthält, der auf die externe Seite führt.

            Ja das hatte ich mir auch überlegt, allerdings liegt das href-Attribut aus bestimmten Gründen nicht in meinem Einflussgebiet. Ich habe nur Zugriff auf den OnClick-Eventhandler.

            Und damit auch Zugriff auf den Inhalt der href-Eigenschaft des auslösenden A-Elements.

            MfG ChrisB

            --
            Light travels faster than sound - that's why most people appear bright until you hear them speak.
            1. Ja das hatte ich mir auch überlegt, allerdings liegt das href-Attribut aus bestimmten Gründen nicht in meinem Einflussgebiet. Ich habe nur Zugriff auf den OnClick-Eventhandler.

              Und damit auch Zugriff auf den Inhalt der href-Eigenschaft des auslösenden A-Elements.

              Okay ich hab mich falsch ausgedrückt, ich meinte: Ich habe keinen Zugriff auf den Webspace außer eben mithilfe eines eingebundenen Scripts. Aber egal, ich bin schon dabei, mein Konzept anzupassen :)

              Vielen Dank nochmal an alle
              lg, Julian

              1. Okay ich hab mich falsch ausgedrückt, ich meinte: Ich habe keinen Zugriff auf den Webspace außer eben mithilfe eines eingebundenen Scripts.

                Auch dann hast du Zugriff auf die Attribute (zumindest wenn du von Javascript sprichst)

                Struppi.