ClearInterval — что-то не так
-
12-12-2019 - |
Вопрос
Кажется, у каждого есть проблемы с ClearInterval.Я создал слайдер, который позволяет людям наводить курсор на стрелки.Баннер также вращается каждые несколько секунд.Я хочу иметь возможность отключать автоматический поворот после того, как кто-то нажмет на одну из стрелок.
Вот мой код:
$(function(){
var intvl = 0;
intvl = setInterval(heroTransitionNext, 2000);
$('.rightArrow').click(function(){
window.clearInterval(intvl);
});
});
РЕДАКТИРОВАТЬ:
Вот функция, которую он вызывает:
function heroTransitionNext() {
$('.HP-hero li').filter(':visible').fadeOut('normal', function () {
if ($(this).next().length != 0) {
activeZone = parseInt(activeZone) + 1;
$(this).next().fadeIn('normal', heroNavHighlight(activeZone));
} else {
activeZone = 1;
$('.HP-hero li:first-child').fadeIn('normal', heroNavHighlight(activeZone));
}
$(this).hide();
});
};
Решение
Чтобы остановить анимацию, вы можете использовать jquery
's .stop()
но не уверен, решит ли это проблему, с которой вы столкнулись (не визуализировал), но вы можете попробовать
$('.HP-hero li').stop(1,1); // or try $('.HP-hero li').stop()
window.clearInterval(intvl);
Как say2joe
сказал, что clearInterval
просто остановит вызов функции в следующий раз, но не очистит текущую очередь (он прав), так что в этом случае stop
может быть использован.
Другие советы
В зависимости от того, сколько работы ваша функция herotransitionnext делает, она все равно может быть выполнена, даже если интервал очищен - другими словами, очистка интервала остановит функцию, от которого можно будет, но любой экземпляр функции (ы), выполняющие в памяти, продолжат выполнять до конца.
Быть более понятным, вот кейс использования (вы можете проверить себя самостоятельно, используя профилировщик в инструментах Firebug или Developer):
ErtransitionNext Исполнение времени составляет 2,1 секунды. ClearInterval вызывается через 6,1 секунды после того, как SetInterval вызывается. В 6,1 секунды HertransitionNext был вызовен в четыре раза. Однако первые три казнения выполнили, однако, четвертый не будет завершен до тех пор, пока он не закончит выполнение (в 8,1 секунды с момента вызванного SetInterval). Примечание. В этом случае каждая последовательная призыва будет выполняться, когда последнее выполнение призыва все еще продолжается (на 100 мр. MS) - другими словами, у вас будет выполнение от 2 до 2,1, от 4 до 4,1 и 6 6.1 Вторых интервалов.
Если функция занимает больше времени для выполнения, чем интервал, используйте рекурсивную функцию с SettimeOut (). Следующая ссылка даст вам хороший пример.
Также, хорошая ссылка на объяснение - https://developer.mozilla.org/ en / dom / window.setintererval .