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

StackOverflow https://stackoverflow.com/questions/1893533

Вопрос

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

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

function bar() {
    alert("hi");
}
Это было полезно?

Решение

Вам нужно сохранить результат 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");
}

Другие советы

Потому что 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");
}

Смотрите документы mozilla по window.setTimeout() окно.Настройка времени():

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

tId = setTimeout(bar, 1000);
clearTimeout(tId);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top