clearInterval не очищает интервал - PullRequest
0 голосов
/ 19 декабря 2011

Привет, у меня есть этот небольшой скрипт, который изменяет фоновое изображение с эффектом fadein / out,

/*controla la velocidad de la animación*/
    var slideshowSpeed = 1000;
    var transitionSpeed = 2000;
    var timeoutSpeed = 500;

    /*No tocar*/
    var interval;
    var activeContainer = 1;    
    var currentImg = 0;
    var animating = false;
    var navigate = function(direction) {
        // Si ya estamos navegando, entonces no hacemos nada!
        if(animating) {
            return;
        }
        currentImg++;
        if(currentImg == photos.length + 1) {
            currentImg = 1;
        }
        // Tenemos dos, uno en el que tenemos la imagen que se ve y otro d?nde tenemos la imagen siguiente
        var currentContainer = activeContainer;
        // Esto puedo optimizarlo con la funci?n modulo, y cambiar 1 y 2 por 0 y 1-> active = mod2(active + 1)
        if(activeContainer == 1) {
            activeContainer = 2;
        } else {
            activeContainer = 1;
        }
        // hay que decrementar el ?ndice porque empieza por cero
        cargarImagen(photos[currentImg - 1], currentContainer, activeContainer);
    };
    var currentZindex = -1;
    var cargarImagen = function(photoObject, currentContainer, activeContainer) {
        animating = true;
        // Nos aseguramos que el nuevo contenedor está siempre dentro del cajon
        currentZindex--;
        /*if(currentZindex < 0) currentZindex=1;*/
        // Actualizar la imagen
        $("#headerimg" + activeContainer).css({
            "background-image" : "url(" + photoObject + ")",
            "display" : "block",
            "z-index" : currentZindex
        });
        // FadeOut antigua
        // Cuando la transición se ha completado, mostramos el header 
        $("#headerimg" + currentContainer).fadeOut(transitionSpeed,function() {
            setTimeout(function() {

                animating = false;
            }, timeoutSpeed);
        });
    };


function iniciarPase(){
    var animating = false;
    //ver la siguente
     navigate("next");
    //iniciar temporizador que mostrará las siguientes
    interval = setInterval(function() {
        navigate("next");
    }, slideshowSpeed);
}
function pararPase(){
    var animating = true;
    console.log('paramos la animación');
    interval = clearInterval(interval);
}
/*Gestion de pase de imágenes de fondo*/
$(document).ready(function() {


    iniciarPase();


});

Но функция pararPase(), которая содержит выражение clearInterval, кажется, не работает, даже еслиэто на <body onload="pararPase()">

Есть идеи, что мне не хватает?

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

Ваша базовая логика работает просто отлично, вот живой тестовый пример .

Так что, скорее всего, вы связываете pararPase неправильно, например, пытаетесь привязать как обработчик кликов за пределами document.ready(), когда кнопка еще не существует - обновлен тестовый пример , чтобы доказать эту точку.

Другой вариант - другая ошибка в вашем коде, проверьте консоль Chrome JavaScript, чтобы убедиться, что это так.

Как уже упоминалось в комментариях, присвоение возвращаемого значения clearInterval обратно переменной бессмысленно, но не вредно: переменная просто будет иметь значение "undefined".

Редактировать : есть вероятность, что iniciarPase вызывается более одного раза, это вызовет более одного таймера, когда будет очищен только последний. Итак, чтобы быть в безопасности, добавьте это к вашей функции: (это на самом деле то, что Диод попытался сказать в своем ответе)

function iniciarPase(){
    var animating = false;
    //ver la siguente
    navigate("next");
    //iniciar temporizador que mostrará las siguientes
    if (interval)
        clearInterval(interval);
    interval = setInterval(function() {
        navigate("next");
    }, slideshowSpeed);
}
0 голосов
/ 19 декабря 2011
clearInterval(interval);
interval = setInterval(function() {
   navigate("next");
}, slideshowSpeed);
...