2009-12-12 11 views
6

Ho il seguente codice ma il timeout chiaro non funziona e non riesco a capire perché, qualcuno ha qualche idea? (Utilizzando il framework Prototype)Utilizzo di clearTimeout per annullare un evento di timeout

Grazie

function foo() { 
    $("navigation").observe('mouseover', 
     function (event) { 
      clearTimeout(bar); 
     } 
    ).observe('mouseout', 
     function (event) { 
      setTimeout(bar, 1000); 
     } 
    ); 
} 

function bar() { 
    alert("hi"); 
} 

risposta

19

è necessario memorizzare il risultato di setTimeout in un variabile e utilizzare clearTimeout per cancellare quella variabile, non la funzione:

var timer; 

function foo() { 
    $("navigation").observe('mouseover', 
     function (event) { 
       clearTimeout(timer); 
     } 
    ).observe('mouseout', 
     function (event) { 
       timer = setTimeout(bar, 1000); 
     } 
    ); 
} 

function bar() { 
    alert("hi"); 
} 
+0

Ah capisco ora, grazie ragazzi :) – Rich

+0

Ehi, nessun problema. Assicurati di contrassegnare la risposta risolta scegliendo una delle risposte come soluzione "accettata". –

+0

In realtà ho avuto un problema quando la variabile del timer non era globale. Ho dovuto usare window.timer; Ti suggerisco di ampliare la tua risposta. –

6

Poiché la funzione clearTimeout prendere l'argomento restituito dalla funzione setTimeout:

var t = null; 
function foo() { 
    $("navigation").observe('mouseover', 
     function (event) { 
      if (t != null) clearTimeout(t); 
     } 
    ).observe('mouseout', 
     function (event) { 
      t = setTimeout(bar, 1000); 
     } 
    ); 
} 

function bar() { 
    alert("hi"); 
} 
4

Vedi la documentazione Mozilla su window.setTimeout():

setTimeout ritorna in realtà un riferimento che è possibile utilizzare per clear the timeout:

tId = setTimeout(bar, 1000); 
clearTimeout(tId); 
Problemi correlati