Lisää
Kuinka asettaa aikaviive javascriptissä
Minulla on tämä pala js minun verkkosivuilla vaihtaa kuvia, mutta tarvitsevat viiveen, kun napsautat kuvaa toisen kerran. Viiveen pitäisi olla 1000 ms. Joten klikkaat img.jpg:tä ja sitten img_onclick.jpg tulee näkyviin. Sitten klikkaat img_onclick.jpg kuvaa, jonka jälkeen pitäisi olla 1000 ms viive ennen kuin img.jpg näkyy uudelleen.
Tässä on koodi:
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
Käytä
setTimeout()
:Jos haluat tehdä sen ilman
setTimeout
: Katso tämä kysymys.Sijoita koodisi
{ }
-koodin sisään.500
= 0,5 sekuntia2200
= 2,2 sekuntiajne.
Javascriptissä on kaksi (useimmiten käytettyä) ajastinfunktiotyyppiä
setTimeout
jasetInterval
(other).Molemmilla menetelmillä on sama allekirjoitus. Ne ottavat parametrina takaisinsoittofunktion ja viiveajan.
setTimeout
suoritetaan vain kerran viiveen jälkeen, kun taassetInterval
kutsuu takaisinsoittofunktiota jatkuvasti jokaisen viiveen millisekunnin jälkeen.Molemmat menetelmät palauttavat kokonaislukutunnisteen, jota voidaan käyttää niiden tyhjentämiseen ennen ajastimen päättymistä.
clearTimeout
jaclearInterval
Molemmat metodit ottavat kokonaislukutunnisteen, joka palautetaan edellä mainituista funktioistasetTimeout
jasetInterval
.Esimerkki:
setTimeout setTimeout**
Jos suoritat yllä olevan koodin, huomaat, että se hälyttää
ennen setTimeout
ja sittenjälkeen setTimeout
ja lopuksi se hälyttääI am setTimeout
1 sekunnin (1000ms) jälkeen.Esimerkistä voi huomata, että
setTimeout(...)
on asynkroninen, mikä tarkoittaa, että se ei odota ajastimen päättymistä ennen kuin siirtyy seuraavaan lausekkeeseen elialert("after setTimeout");
.Esimerkki:
setInterval
Jos suoritat yllä olevan koodin, huomaat, että se hälyttää
before setInterval
ja sittenafter setInterval
lopuksi se hälyttääI am setInterval
5 kertaa 1 sekunnin (1000ms) jälkeen, koska setTimeout tyhjentää ajastimen 5 sekunnin jälkeen tai muuten saat hälytyksenI am setInterval
loputtomasti joka 1 sekunti.Miten selain sisäisesti tekee sen?
Selitän lyhyesti.
Ymmärtääksesi tämän sinun on tiedettävä javascriptin tapahtumajonosta. Selaimessa on toteutettu tapahtumajono. Aina kun js:ssä käynnistyy jokin tapahtuma, kaikki nämä tapahtumat (kuten klikkaus jne...) lisätään tähän jonoon. Kun selaimella ei ole mitään suoritettavaa, se ottaa tapahtuman jonosta ja suorittaa ne yksi kerrallaan.
Kun kutsut
setTimeout
taisetInterval
, takaisinkutsu rekisteröidään selaimen ajastimeen, ja se lisätään tapahtumajonoon, kun annettu aika on kulunut, ja lopulta javascript ottaa tapahtuman jonosta ja suorittaa sen.Näin tapahtuu, koska javascript-moottori on yksisäikeinen ja se voi suorittaa vain yhden asian kerrallaan. Ne eivät siis voi suorittaa muita javascript-ohjelmia ja seurata ajastimesi toimintaa. Siksi nämä ajastimet rekisteröidään selaimeen (selain ei ole yksisäikeinen), ja se voi seurata ajastinta ja lisätä tapahtuman jonoon ajastimen päättymisen jälkeen.
Sama tapahtuu myös
setInterval
-ajastimen kohdalla, mutta tässä tapauksessa tapahtuma lisätään jonoon uudelleen ja uudelleen määritellyn ajanjakson jälkeen, kunnes se tyhjennetään tai selaimen sivu päivitetään.Näin ollen takaisinkutsu voi joskus kestää enemmän kuin määritetty viiveaika kutsua erityisesti silloin, kun muu koodisi estää säiettä eikä anna sille aikaa käsitellä sitä, mitä jonossa on.
Ja kuten mainitsin, javascript on yksisäikeinen. Joten jos estät säikeen pitkäksi aikaa.
Kuten tämä koodi
Käyttäjä saattaa saada viestin, jossa sanotaan sivu ei vastaa.