Ik heb een stukje js op mijn website om van afbeelding te wisselen, maar ik heb een vertraging nodig als je een tweede keer op de afbeelding klikt. De vertraging moet 1000 ms zijn. Dus je zou op de img.jpg klikken en de img_onclick.jpg zou verschijnen. U zou dan op de afbeelding img_onclick.jpg klikken, er moet dan een vertraging van 1000 ms zijn voordat de img.jpg weer wordt weergegeven.
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();
});
});
Antwoord 1, autoriteit 100%
Gebruik setTimeout()
:
var delayInMilliseconds = 1000; //1 second
setTimeout(function() {
//your code to be executed after 1 second
}, delayInMilliseconds);
Als je het wilt doen zonder setTimeout
: raadpleeg deze vraag.
Antwoord 2, autoriteit 14%
setTimeout(function(){
}, 500);
Plaats uw code in de { }
500
= 0,5 seconden
2200
= 2,2 seconden
enz.
Antwoord 3, autoriteit 7%
ES-6-oplossing
Hieronder staat een voorbeeldcode die gebruikmaakt van aync/await om een daadwerkelijke vertraging te hebben.
Er zijn veel beperkingen en dit is misschien niet handig, maar post hier gewoon voor de lol..
function delay(delayInms) {
return new Promise(resolve => {
setTimeout(() => {
resolve(2);
}, delayInms);
});
}
async function sample() {
console.log('a');
console.log('waiting...')
let delayres = await delay(3000);
console.log('b');
}
sample();
Antwoord 4, autoriteit 4%
Er zijn twee (meestal gebruikte) typen timerfuncties in javascript setTimeout
en setInterval
(overig)
Beide methoden hebben dezelfde handtekening. Ze nemen een terugbelfunctie en vertragingstijd als parameter.
setTimeout
wordt slechts één keer uitgevoerd na de vertraging, terwijl setInterval
de callback-functie blijft aanroepen na elke vertraging in millisecs.
beide methoden retourneren een geheel getal dat kan worden gebruikt om ze te wissen voordat de timer afloopt.
clearTimeout
en clearInterval
beide methoden gebruiken een geheel getal dat wordt geretourneerd door de bovenstaande functies setTimeout
en setInterval
Voorbeeld:
alert("before setTimeout");
setTimeout(function(){
alert("I am setTimeout");
},1000); //delay is in milliseconds
alert("after setTimeout");
Als u de bovenstaande code uitvoert, ziet u dat deze een waarschuwing geeft before setTimeout
en vervolgens after setTimeout
ten slotte waarschuwt het I am setTimeout
na 1sec (1000ms)
Wat je aan het voorbeeld kunt zien, is dat de setTimeout(...)
asynchroon is, wat betekent dat het niet wacht tot de timer is verstreken voordat het naar de volgende instructie gaat, bijv. alert("after setTimeout");
Voorbeeld:
alert("before setInterval"); //called first
var tid = setInterval(function(){
//called 5 times each time after one second
//before getting cleared by below timeout.
alert("I am setInterval");
},1000); //delay is in milliseconds
alert("after setInterval"); //called second
setTimeout(function(){
clearInterval(tid); //clear above interval after 5 seconds
},5000);
Als u de bovenstaande code uitvoert, ziet u dat deze before setInterval
waarschuwt en vervolgens after setInterval
ten slotte waarschuwt het I am setInterval
5 keer na 1sec (1000ms) omdat de setTimeout de timer na 5 seconden wist, anders krijg je elke 1 seconde een waarschuwing I am setInterval
Oneindig.
Hoe doet de browser dat intern?
Ik zal het in het kort uitleggen.
Om dat te begrijpen, moet u weten over de gebeurteniswachtrij in javascript. Er is een gebeurteniswachtrij geïmplementeerd in de browser. Telkens wanneer een gebeurtenis wordt geactiveerd in js, worden al deze gebeurtenissen (zoals klikken enz.) aan deze wachtrij toegevoegd. Wanneer uw browser niets heeft om uit te voeren, haalt hij een gebeurtenis uit de wachtrij en voert deze één voor één uit.
Als u nu setTimeout
of setInterval
aanroept, wordt uw callback geregistreerd bij een timer in de browser en wordt deze toegevoegd aan de gebeurteniswachtrij nadat de opgegeven tijd is verstreken en uiteindelijk javascript haalt de gebeurtenis uit de wachtrij en voert deze uit.
Dit gebeurt zo, omdat de javascript-engine single-threaded is en maar één ding tegelijk kan uitvoeren. Ze kunnen dus geen ander javascript uitvoeren en uw timer bijhouden. Dat is de reden waarom deze timers zijn geregistreerd bij de browser (browser is niet single threaded) en het kan de timer bijhouden en een gebeurtenis toevoegen aan de wachtrij nadat de timer is verlopen.
hetzelfde gebeurt voor setInterval
, alleen in dit geval wordt de gebeurtenis keer op keer toegevoegd aan de wachtrij na het opgegeven interval totdat deze wordt gewist of de browserpagina wordt vernieuwd.
Opmerking
De vertragingsparameter die u aan deze functies doorgeeft, is de minimale vertraging
tijd om het terugbellen uit te voeren. Dit komt omdat nadat de timer afloopt
de browser voegt de gebeurtenis toe aan de wachtrij die moet worden uitgevoerd door de
javascript-engine, maar de uitvoering van de callback hangt af van uw
gebeurtenissen positie in de wachtrij en aangezien de engine single threaded is
voert alle gebeurtenissen in de wachtrij één voor één uit.
Vandaar dat uw callback soms meer duurt dan de gespecificeerde vertragingstijd die speciaal wordt genoemd wanneer uw andere code de draad blokkeert en het geen tijd geeft om te verwerken wat er in de wachtrij is.
En zoals ik noemde JavaScript is enkele draad. Dus, als je de draad lang blokkeert.
Zoals deze code
while(true) { //infinite loop
}
Uw gebruiker kan een bericht krijgen dat u -pagina niet reageert, niet reageert .
Antwoord 5, Autoriteit 2%
Voor synchronisatie-oproepen kunt u de onderstaande methode gebruiken:
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
Antwoord 6, Autoriteit 2%
U kunt de belofte
gebruiken
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
Gebruik vervolgens deze methode
console.log("Hello");
sleep(2000).then(() => { console.log("World!"); });
of
console.log("Hello");
await sleep(2000);
console.log("World!");
Antwoord 7
Als u vernieuwing nodig heeft, is dit een andere mogelijkheid:
setTimeout(function () {
$("#jsSegurosProductos").jsGrid("refresh");
}, 1000);
Antwoord 8
Dit is wat ik doe om dit probleem op te lossen. Ik ben het ermee eens dat dit komt door het timingprobleem en dat er een pauze nodig was om de code uit te voeren.
var delayInMilliseconds = 1000;
setTimeout(function() {
//add your code here to execute
}, delayInMilliseconds);
Deze nieuwe code pauzeert deze voor 1 seconde en voert ondertussen uw code uit.
Antwoord 9
Ik geef mijn input omdat het me helpt te begrijpen wat ik aan het doen ben.
Om een automatisch scrollende diavoorstelling te maken met een wachttijd van 3 seconden, heb ik het volgende gedaan:
var isPlaying = true;
function autoPlay(playing){
var delayTime = 3000;
var timeIncrement = 3000;
if(playing){
for(var i=0; i<6; i++){//I have 6 images
setTimeout(nextImage, delayTime);
delayTime += timeIncrement;
}
isPlaying = false;
}else{
alert("auto play off");
}
}
autoPlay(isPlaying);
Onthoud dat bij het uitvoeren van setTimeout() als volgt; het zal alle time-outfuncties uitvoeren alsof ze tegelijkertijd worden uitgevoerd, ervan uitgaande dat in setTimeout(nextImage, delayTime);delay time een statische 3000 milliseconden is.
Wat ik deed om dit te verklaren, was een extra 3000 milli/s toevoegen na elke for-lusverhoging via delayTime += timeIncrement;
.
Voor degenen die erom geven, dit is hoe mijn nextImage() eruit ziet:
function nextImage(){
if(currentImg === 1){//change to img 2
for(var i=0; i<6; i++){
images[i].style.zIndex = "0";
}
images[1].style.zIndex = "1";
imgNumber.innerHTML = imageNumber_Text[1];
imgDescription.innerHTML = imgDescText[1];
currentImg = 2;
}
else if(currentImg === 2){//change to img 3
for(var i=0; i<6; i++){
images[i].style.zIndex = "0";
}
images[2].style.zIndex = "1";
imgNumber.innerHTML = imageNumber_Text[2];
imgDescription.innerHTML = imgDescText[2];
currentImg = 3;
}
else if(currentImg === 3){//change to img 4
for(var i=0; i<6; i++){
images[i].style.zIndex = "0";
}
images[3].style.zIndex = "1";
imgNumber.innerHTML = imageNumber_Text[3];
imgDescription.innerHTML = imgDescText[3];
currentImg = 4;
}
else if(currentImg === 4){//change to img 5
for(var i=0; i<6; i++){
images[i].style.zIndex = "0";
}
images[4].style.zIndex = "1";
imgNumber.innerHTML = imageNumber_Text[4];
imgDescription.innerHTML = imgDescText[4];
currentImg = 5;
}
else if(currentImg === 5){//change to img 6
for(var i=0; i<6; i++){
images[i].style.zIndex = "0";
}
images[5].style.zIndex = "1";
imgNumber.innerHTML = imageNumber_Text[5];
imgDescription.innerHTML = imgDescText[5];
currentImg = 6;
}
else if(currentImg === 6){//change to img 1
for(var i=0; i<6; i++){
images[i].style.zIndex = "0";
}
images[0].style.zIndex = "1";
imgNumber.innerHTML = imageNumber_Text[0];
imgDescription.innerHTML = imgDescText[0];
currentImg = 1;
}
}