Come impostare il ritardo in javascript


170

Ho un pezzo di js nel mio sito Web per cambiare immagine ma ho bisogno di un ritardo quando fai clic sull'immagine una seconda volta. Il ritardo dovrebbe essere 1000ms. Quindi fai clic su img.jpg, quindi viene visualizzato img_onclick.jpg. Dovresti quindi fare clic sull'immagine img_onclick.jpg, quindi dovrebbe esserci un ritardo di 1000 ms prima che l'img.jpg venga nuovamente visualizzato.

Ecco il codice:

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();
    });
});

8
setTimeout(function(){/*YourCode*/},1000);
marteljn,


forse cercando .stop()però. Dai
Mark Walters,

Possibile duplicato di Put a Delay in Javascript
Anonimo

Risposte:


380

Utilizzare setTimeout():

var delayInMilliseconds = 1000; //1 second

setTimeout(function() {
  //your code to be executed after 1 second
}, delayInMilliseconds);

Se vuoi farlo senza setTimeout: fai riferimento a questa domanda .


6
come farlo in modo sincrono? il codice all'interno di setTimeout non riconosce le proprietà della classe.
ishandutta2007,

@ ishandutta2007 vedere la mia risposta qui sotto -> stackoverflow.com/a/49813472/3919057
Ninjaneer

50
setTimeout(function(){


}, 500); 

Inserisci il tuo codice all'interno del { }

500 = 0,5 secondi

2200 = 2,2 secondi

eccetera.


18

Soluzione ES-6

Di seguito è riportato un codice di esempio che utilizza aync / waitit per avere un ritardo effettivo.

Ci sono molti vincoli e questo potrebbe non essere utile, ma basta pubblicare qui per divertimento.

    async 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();


3
NON è necessario che la delayfunzione sia asincrona. Questo fantastico ritardo funziona quando una promessa restituita da una funzione regolare è attesa nel corpo di una funzione asincrona.
Intervoice

13

Esistono due tipi (principalmente usati) di funzione timer in javascript setTimeoute setInterval( altro )

Entrambi questi metodi hanno la stessa firma. Prendono una funzione di richiamata e ritardano il tempo come parametro.

setTimeoutviene eseguito una sola volta dopo il ritardo, mentre setIntervalcontinua a chiamare la funzione di richiamata dopo ogni ritardo di millisecondi.

entrambi questi metodi restituiscono un identificatore intero che può essere utilizzato per cancellarli prima della scadenza del timer.

clearTimeouted clearIntervalentrambi questi metodi accettano un identificatore intero restituito dalle funzioni precedenti setTimeoutesetInterval

Esempio:

setTimeout

alert("before setTimeout");

setTimeout(function(){
        alert("I am setTimeout");
   },1000); //delay is in milliseconds 

  alert("after setTimeout");

Se esegui il codice precedente vedrai che avvisa before setTimeoute after setTimeoutinfine avvisa I am setTimeoutdopo 1sec (1000ms)

Quello che puoi notare dall'esempio è che setTimeout(...)è asincrono, il che significa che non aspetta che il timer scada prima di passare alla prossima istruzione, ad es.alert("after setTimeout");

Esempio:

setInterval

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);

Se esegui il codice sopra riportato vedrai che avvisa before setIntervale after setIntervalinfine avvisa I am setInterval 5 volte dopo 1sec (1000ms) perché setTimeout azzera il timer dopo 5 secondi oppure ogni 1 secondo riceverai un avviso I am setIntervalInfinito.

Come lo fa internamente il browser?

Spiegherò in breve.

Per capire che devi sapere sulla coda degli eventi in JavaScript. C'è una coda di eventi implementata nel browser. Ogni volta che un evento viene attivato in js, tutti questi eventi (come clic ecc.) Vengono aggiunti a questa coda. Quando il tuo browser non ha nulla da eseguire, prende un evento dalla coda e li esegue uno per uno.

Ora, quando chiami setTimeouto il setIntervaltuo callback viene registrato su un timer nel browser e viene aggiunto alla coda degli eventi allo scadere del tempo prestabilito ed eventualmente javascript prende l'evento dalla coda e lo esegue.

Questo accade, perché i motori javascript sono a thread singolo e possono eseguire solo una cosa alla volta. Pertanto, non possono eseguire altri javascript e tenere traccia del timer. Questo è il motivo per cui questi timer sono registrati con il browser (i browser non sono a thread singolo) e possono tenere traccia del timer e aggiungere un evento nella coda dopo la scadenza del timer.

lo stesso accade setIntervalsolo in questo caso l'evento viene aggiunto più volte alla coda dopo l'intervallo specificato fino a quando non viene cancellato o aggiornato la pagina del browser.

Nota

Il parametro di ritardo che si passa a queste funzioni è il tempo di ritardo minimo per eseguire la richiamata. Questo perché dopo la scadenza del timer il browser aggiunge l'evento alla coda che deve essere eseguito dal motore javascript ma l'esecuzione del callback dipende dalla posizione degli eventi nella coda e poiché il motore è a thread singolo eseguirà tutti gli eventi in la coda uno per uno.

Pertanto, il callback potrebbe richiedere a volte più del tempo di ritardo specificato per essere chiamato specialmente quando l'altro codice blocca il thread e non gli dà il tempo di elaborare ciò che è in coda.

E come ho già detto, javascript è single thread. Quindi, se blocchi il thread a lungo.

Mi piace questo codice

while(true) { //infinite loop 
}

Il tuo utente potrebbe ricevere un messaggio che dice che la pagina non risponde .


1
Puoi dirmi come posso interrompere il comportamento asincrono di setTimeout ()?
Chandan Purbia,

Non si utilizza setTimeoutse non si desidera un comportamento asincrono.
Nadir Laskar,

5

Per le chiamate di sincronizzazione è possibile utilizzare il metodo seguente:

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}

0

Se hai bisogno di aggiornamento, questa è un'altra possibilità:

setTimeout(function () { 
    $("#jsSegurosProductos").jsGrid("refresh"); 
}, 1000);

0

Ecco cosa sto facendo per risolvere questo problema. Sono d'accordo che questo è a causa del problema di temporizzazione e ho bisogno di una pausa per eseguire il codice.

var delayInMilliseconds = 1000; 
setTimeout(function() {
 //add your code here to execute
 }, delayInMilliseconds);

Questo nuovo codice lo metterà in pausa per 1 secondo e nel frattempo eseguirà il tuo codice.


0

Darò il mio contributo perché mi aiuta a capire cosa sto facendo.

Per fare una presentazione a scorrimento automatico con un'attesa di 3 secondi ho fatto quanto segue:

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);

Ricorda che quando esegui setTimeout () in questo modo; eseguirà tutte le funzioni di timeout come se fossero eseguite contemporaneamente supponendo che in setTimeout (nextImage, delayTime); il tempo di ritardo è di 3000 millisecondi statici.

Ciò che ho fatto per tenere conto di ciò è stato aggiungere altri 3000 milli / s dopo ciascuno per l'incremento del loop tramite delayTime += timeIncrement;.

Per coloro a cui importa qui è come appare il mio nextImage ():

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;
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.