Domanda

Ho il seguente codice, ma il timeout chiaro non funziona e non riesco a capire il motivo per cui, qualcuno ha qualche idea? (Utilizzando il framework Prototype)

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

function bar() {
    alert("hi");
}
È stato utile?

Soluzione

È necessario memorizzare il risultato di setTimeout in una 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");
}

Altri suggerimenti

Poiché la funzione clearTimeout prendere l'argomento tornato 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");
}

Vedere la documentazione Mozilla su window.setTimeout () :

setTimeout in realtà restituisce un riferimento che è possibile utilizzare per azzerare il timeout :

tId = setTimeout(bar, 1000);
clearTimeout(tId);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top