[Javascript/JQuery] setTimeout call cancelen?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Anoniem: 308713

Topicstarter
Ik ben bezig om met behulp van JQuery en standaard Javascript een functie uit te voeren die pas na enkele seconden (laat zeggen: 3 seconden) uitgevoerd wordt. De volgende code verduidelijkt het e.e.a.:

code:
1
2
3
4
5
function start() {
    setTimeout(function() {
        alert('3 seconden voorbij.');
    }, 3000);
}


Dit representeert zichzelf als volgt:
  • 0 seconden: start() wordt aangeroepen
  • 3 seconden: alert verschijnt
Maar stel je nu de volgende situatie voor:
  • 0 seconden: start() wordt aangeroepen (aanroep 1)
  • 2 seconden: start() wordt wederom aangeroepen (aanroep 2)
  • 3 seconden: alert verschijnt (door aanroep 1)
  • 5 seconden: alert verschijnt (door aanroep 2)
Hoe kan ik er nu voor zorgen dat de eerste alert die verschijnt, gecanceld wordt? Met andere woorden, hoe kan ik alle functie calls die aan een timeout gekoppeld zijn (en die dus nog "in de wacht staan") cancellen als start() voor een tweede (of derde, etc.) maal aangeroepen wordt?

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Binnen de functie van de timeout een extra controle doen. Hiermee kijk je of er al een keer de functie is uitgevoerd, waardoor je nooit een tweede keer de alert zal zien.

Acties:
  • 0 Henk 'm!

Anoniem: 308713

Topicstarter
mithras schreef op donderdag 13 mei 2010 @ 14:58:
Binnen de functie van de timeout een extra controle doen. Hiermee kijk je of er al een keer de functie is uitgevoerd, waardoor je nooit een tweede keer de alert zal zien.
Maar het gewenste resultaat is dat de eerste alert gecanceld moet worden, en de tweede alert getoond moet worden. Oftewel, als je vier keer start() uitvoert, moet alleen de laatste aanroep er voor zorgen dat er 3 seconden na dat moment een alert getoond wordt, de eerste drie moeten dan niet verschijnen.

Gewenste situatie bij vier keer aanroepen start():
  • 0 seconden: aanroep start() (aanroep 1)
  • 1 seconden: aanroep start() (aanroep 2)
  • 1.5 seconden: aanroep start() (aanroep 3)
  • 2 seconden: aanroep start() (aanroep 4)
  • 3 seconden: alert (door aanroep 1; deze moet niet uitgevoerd worden)
  • 4 seconden: alert (door aanroep 2; deze moet niet uitgevoerd worden)
  • 4.5 seconden: alert (door aanroep 3; deze moet niet uitgevoerd worden)
  • 5 seconden: alert (door aanroep 4; deze moet wel uitgevoerd worden)

[ Voor 32% gewijzigd door Anoniem: 308713 op 13-05-2010 15:04 ]


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Nu online

orf

Met clearTimeout moet je een eind kunnen komen. :)

http://www.w3schools.com/jsref/met_win_cleartimeout.asp

Acties:
  • 0 Henk 'm!

Anoniem: 308713

Topicstarter
U bent mijn held. Dit zocht ik :)

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 12-07 22:24
Heel fijn om met de hand met timer IDs te lopen modderen, maar dat kan beter.

Acties:
  • 0 Henk 'm!

  • pieturp
  • Registratie: April 2004
  • Laatst online: 13-07 19:55

pieturp

gaffa!

R4gnax schreef op donderdag 13 mei 2010 @ 15:14:
Heel fijn om met de hand met timer IDs te lopen modderen, maar dat kan beter.
* Mompelt: mug, olifant

Oeps, sorry! Niet goed gelezen 8)7

Inderdaad betere oplossing

[ Voor 11% gewijzigd door pieturp op 13-05-2010 19:09 ]

... en etcetera en zo


Acties:
  • 0 Henk 'm!

  • UltimateB
  • Registratie: April 2003
  • Niet online

UltimateB

Pomdiedom

Eh waarom niet iets van

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
var currentTimer = false;

function start() {
      if(currentTimeout !== false) {
        clearTimeout(currentTimeout);
      }
      currentTimeout = setTimeout(function() {
          alert('3 seconden voorbij.');
          currentTimeout = false;
      }, 3000);
}

"True skill is when luck becomes a habit"
SWIS


Acties:
  • 0 Henk 'm!

Anoniem: 308713

Topicstarter
UltimateB schreef op donderdag 13 mei 2010 @ 19:21:
Eh waarom niet iets van

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
var currentTimer = false;

function start() {
      if(currentTimeout !== false) {
        clearTimeout(currentTimeout);
      }
      currentTimeout = setTimeout(function() {
          alert('3 seconden voorbij.');
          currentTimeout = false;
      }, 3000);
}
Is exact wat ik nu heb :) Maar wist in eerste instantie niet van het bestaan van clearTimeout af...

Acties:
  • 0 Henk 'm!

  • Tom
  • Registratie: Juni 1999
  • Niet online

Tom

Ik gebruik deze voor timer-achtige dingen:
http://jquery.offput.ca/every/
Pagina: 1