Использование clearTimeout для отмены события тайм-аута

У меня есть следующий код, но тайм-аут очистки не работает, и я не могу понять, почему, у кого-нибудь есть идеи? (Используя структуру прототипа)

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

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

person Rich    schedule 12.12.2009    source источник


Ответы (3)


Вам нужно сохранить результат setTimeout в переменной и использовать clearTimeout для очистки этой переменной, а не функции:

var timer;

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

function bar() {
    alert("hi");
}
person Doug Neiner    schedule 12.12.2009
comment
Эй, нет проблем. Обязательно отметьте ответ решенным, выбрав один из ответов в качестве принятого решения. - person Doug Neiner; 12.12.2009
comment
У меня действительно была проблема, когда переменная таймера не была глобальной. Мне пришлось использовать window.timer; Я предлагаю вам расширить свой ответ. - person Arturo Hernandez; 06.05.2013

Поскольку функция clearTimeout принимает аргумент, возвращенный функцией 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");
}
person Darin Dimitrov    schedule 12.12.2009

См. документацию Mozilla на странице window.setTimeout():

setTimeout фактически возвращает ссылку, которую вы можете использовать для обнуления тайм-аута:

tId = setTimeout(bar, 1000);
clearTimeout(tId);
person David Snabel-Caunt    schedule 12.12.2009