6

I have the following code but the clear timeout doesn't work and I can't understand why, does anyone have any ideas? (Using the Prototype framework)

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

function bar() {
    alert("hi");
}
Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
Rich
  • 209
  • 1
  • 4
  • 6

3 Answers3

19

You need to store the result of setTimeout in a variable, and use clearTimeout to clear that variable, not the function:

var timer;

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

function bar() {
    alert("hi");
}
Doug Neiner
  • 65,509
  • 13
  • 109
  • 118
6

Because the clearTimeout function take the argument returned by the setTimeout function:

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");
}
Darin Dimitrov
  • 1,023,142
  • 271
  • 3,287
  • 2,928
4

See the mozilla docs on window.setTimeout():

setTimeout actually returns a reference which you can use to clear the timeout:

tId = setTimeout(bar, 1000);
clearTimeout(tId);
David Snabel-Caunt
  • 57,804
  • 13
  • 114
  • 132