Hoe tijdvertraging instellen in javascript
Ik heb dit een stukje js in mijn website om afbeeldingen te wisselen maar heb een vertraging nodig wanneer je een tweede keer op de afbeelding klikt. De vertraging moet 1000ms zijn. Dus je zou klikken op de img.jpg dan de img_onclick.jpg zou verschijnen. Je zou dan klikken op de img_onclick.jpg afbeelding er moet dan een vertraging van 1000ms zijn voordat de img.jpg weer wordt getoond.
Hier is de code:
jQuery(document).ready(function($) {
$(".toggle-container").hide();
$(".trigger").toggle(function () {
$(this).addClass("active");
$(".trigger").find('img').prop('src', 'http://localhost:8888/images/img_onclick.jpg');
}, function () {
$(this).removeClass("active");
$(".trigger").find('img').prop('src', 'http://localhost:8888/images/img.jpg');
});
$(".trigger").click(function () {
$(this).next(".toggle-container").slideToggle();
});
});
143
3
Gebruik
setTimeout()
:Als je het zonder
setTimeout
wilt doen: Raadpleeg dan deze vraag.Plaats uw code binnen de `{ }``
500
= 0.5 seconden2200
= 2.2 secondenenz.
Er zijn twee (meestal gebruikte) types van timer functies in javascript
setTimeout
ensetInterval
(other)Beide methoden hebben dezelfde signatuur. Ze nemen een call back functie en vertragingstijd als parameter.
setTimeout
wordt slechts een keer uitgevoerd na de vertraging terwijlsetInterval
de callback functie blijft aanroepen na elke vertraging milisecs.Beide methodes geven een integer identifier terug die kan worden gebruikt om ze te wissen voordat de timer afloopt.
clearTimeout
enclearInterval
deze beide methodes nemen een integer identifier uit de bovenstaande functiessetTimeout
ensetInterval
Voorbeeld:
setTimeout
Als u de bovenstaande code uitvoert zult u zien dat het
voor setTimeout
waarschuwt en danna setTimeout
tenslotte waarschuwt hetIk ben setTimeout
na 1sec (1000ms)Wat je kunt zien in het voorbeeld is dat de
setTimeout(...)
asynchroon is, wat betekent dat het niet wacht tot de timer is verstreken voordat het naar het volgende statement gaat, dat wil zeggenalert("after setTimeout");
Voorbeeld:
setInterval
Als je de bovenstaande code uitvoert zul je zien dat het
voor setInterval
waarschuwt en danna setInterval
tenslotte waarschuwt hetIk ben setInterval
5 keer na 1sec (1000ms) omdat de setTimeout de timer na 5 seconden opruimt anders krijg je elke 1 seconde een waarschuwingIk ben setInterval
Oneindig.Hoe browser intern doet dat?
Ik zal het in het kort uitleggen.
Om dat te begrijpen moet je iets weten over gebeurtenis wachtrij in javascript. Er is een gebeurtenis wachtrij geïmplementeerd in de browser. Wanneer een gebeurtenis wordt geactiveerd in javascript, worden al deze gebeurtenissen (zoals klik enz..) toegevoegd aan deze wachtrij. Wanneer de browser niets uit te voeren heeft, neemt hij een gebeurtenis uit de wachtrij en voert ze een voor een uit.
Wanneer je
setTimeout
ofsetInterval
aanroept, wordt je callback geregistreerd als een timer in de browser en het wordt toegevoegd aan de gebeurtenis wachtrij nadat de gegeven tijd is verstreken en uiteindelijk neemt javascript de gebeurtenis uit de wachtrij en voert het uit.Dit gebeurt zo, omdat javascript motoren single threaded zijn en ze kunnen maar een ding tegelijk uitvoeren. Dus, ze kunnen niet uitvoeren van andere javascript en bijhouden van uw timer. Dat is de reden waarom deze timers zijn geregistreerd bij de browser (browser zijn niet single threaded) en het kan bijhouden van de timer en voeg een evenement in de wachtrij na de timer afloopt.
Hetzelfde gebeurt voor
setInterval
alleen in dit geval wordt de gebeurtenis toegevoegd aan de wachtrij opnieuw en opnieuw na het opgegeven interval totdat het wordt gewist of de browser pagina wordt ververst.Vandaar dat uw callback soms meer dan de opgegeven vertragingstijd kan duren om te worden opgeroepen, vooral wanneer uw andere code de draad blokkeert en het geen tijd geeft om te verwerken wat'er in de wachtrij staat.
En zoals ik al zei javascript is single thread. Dus, als je de draad voor lang blokkeert.
Zoals deze code
Uw gebruiker kan een bericht krijgen dat zegt pagina reageert niet.