2012-01-17 18 views
86

non riesco a ottenere il metodo .delay lavorare in jQuery:jQuery: Attendere/Delay 1 secondo senza l'esecuzione di codice

$.delay(3000); // not working 
$(queue).delay(3000); // not working 

sto usando un ciclo while attendere fino a un valore di cambio non controllato è maggiore o uguale a un altro e non riesco a trovare alcun modo per incitare l'esecuzione per X secondi.

+0

provare a utilizzare setTimeout nella richiamata – theshadowmonkey

+0

quale versione di jQuery stai usando? – L7ColWinters

+1

non è ciò per cui è progettata la funzione di ritardo, è progettato per l'uso tra eventi jquery in coda (come fade(). Delay(). Show()). Hai bisogno della funzione setTimeOut. – JoJa

risposta

131

$ .delay viene utilizzato per ritardare le animazioni in una coda, non arrestare l'esecuzione.

Invece di utilizzare un ciclo while, è necessario chiamare ricorsivamente un metodo che esegue il controllo ogni secondo utilizzando setTimeout:

var check = function(){ 
    if(condition){ 
     // run when condition is met 
    } 
    else { 
     setTimeout(check, 1000); // check again in a second 
    } 
} 

check(); 
+0

Penso che setTimeout sia sufficiente. – Jiemurat

+2

Il tuo fratello di bombe, questo è esattamente quello di cui avevo bisogno per sistemare il mio codice. – jemiloii

+0

@Jiemurat e chiunque altro in futuro: setTimeout non interrompe il flusso di esecuzione. Il grande codice di Niessner ottiene questo senza le condizioni diventate realtà! – Gabrer

7

JavaScript setTimeout è una soluzione molto buona:

function funcx() 
    { 
    // your code here 
    // break out here if needed 
    setTimeout(funcx, 3000); 
    } 

funcx(); 

Il La funzione delay in jQuery è principalmente utilizzata per ritardare le animazioni in una coda di animazione jQuery.

5

delay() non interrompe il flusso di codice quindi lo esegue nuovamente. Non c'è un modo pratico per farlo in JavaScript. Tutto deve essere fatto con funzioni che accettano richiami come setTimeout che altri hanno menzionato.

Lo scopo di jQuery delay() è di attuare una coda di animazione prima dell'esecuzione. Quindi, ad esempio $(element).delay(3000).fadeIn(250);, l'elemento si dissolverà in dissolvenza dopo 3 secondi.

7

funzione di jQuery delay è destinato a essere utilizzato con effetti e le code di effetti, vedere la delay docs e l'esempio in esso:

$('#foo').slideUp(300).delay(800).fadeIn(400); 

Se si vuole osservare una variabile per le modifiche, si potrebbe fare qualcosa di simile

(function() { 
    var observerInterval = setInterval(function() { 
     if (/* check for changes here */) { 
      clearInterval(observerInterval); 
      // do something here 
     } 
    }, 1000); 
})(); 
+0

setInterval ha un secondo parametro obbligatorio, il tempo in millisecondi;) –

+1

Grazie @ sara.potyscki, corretto. –

+0

@ JulianD. Grazie per questo suggerimento. Sono atterrato su questa domanda mentre cercavo su google per una soluzione. Questo è esattamente ciò di cui avevo bisogno per il mio progetto. –

3

Javascript è un linguaggio di programmazione asincrono per cui non è possibile interrompere l'esecuzione per un periodo di tempo; l'unico modo in cui puoi [pseudo] interrompere un'esecuzione sta usando setTimeout() che non è un ritardo ma una "funzione ritardata di richiamata".

165

Si può anche solo ritardare qualche operazione in questo modo:

setTimeout(function(){ 

    // Something you want delayed. 

}, 5000); // How long do you want the delay to be (in milliseconds)? 
+0

Funziona perfettamente !! – Kaos

+2

Solo una FYI, questo non infrange il flusso di esecuzione, quindi se hai bisogno di "fermare tutto" per qualche secondo, avrai bisogno di qualcosa di simile a quello che ha pubblicato Niessner. –

+0

Sì ... è un richiamo alla funzione e non blocca. Grazie per la risposta, ha risolto il mio problema. –

4

Solo javascript Si lavorerà senza jQuery

<!DOCTYPE html> 
<html> 
    <head> 
     <script> 
      function sleep(miliseconds) { 
       var currentTime = new Date().getTime(); 
       while (currentTime + miliseconds >= new Date().getTime()) { 
       } 
      } 

      function hello() { 
       sleep(5000); 
       alert('Hello'); 
      } 
      function hi() { 
       sleep(10000); 
       alert('Hi'); 
      } 
     </script> 
    </head> 
    <body> 
     <a href="#" onclick="hello();">Say me hello after 5 seconds </a> 
     <br> 
     <a href="#" onclick="hi();">Say me hi after 10 seconds </a> 


    </body> 
</html> 
+0

Fare un ciclo di attesa in javascript è una cattiva idea! Tutte le funzionalità javascript si fermeranno ** mentre il ciclo è in esecuzione. Ciò avrà effetti collaterali imprevisti. È molto meglio usare funzioni non bloccanti come setTimeout(). –

Problemi correlati