jQuery + setTimeout()+ clearTimeout()在IE7& 8

时间:2011-01-05 19:04:08

标签: javascript jquery

这适用于Firefox和Chrome,但不适用于IE。

在Internet Explorer中,定时器不会被清除,并且每次调用update_slideshow()时都会显示定时器。

// slideshow params 
var currentSlide = 1;
var numSlides = 4;
var pause = false;

function pause_show(bool){
    pause = bool;
}

// transitions the slides 
function update_slideshow(slide){
    if(slide > numSlides) slide = 1;

    //is user tyring to pause/play this slide
    if(currentSlide == slide){
        switch(pause){
            case false:
                $("#ssbut" + slide.toString()).removeClass('pause').addClass('play');
                pause = true;
            break;

            case true:
                $("#ssbut" + slide.toString()).removeClass('play').addClass('pause');
                pause = false;
            break;
        }
    }else{ //user clicked on a button other than the current slide's
        clearTimeout(slideTimer);
        function complete() {
            $("#slide" + slide.toString()).fadeIn(500, "linear");
            if(!pause)  
                $("#ssbut" + slide.toString()).removeClass('inactive').addClass('pause');
            else
                $("#ssbut" + slide.toString()).removeClass('inactive').addClass('play');
        }   
        $("#ssbut" + currentSlide.toString()).removeClass('play').addClass('inactive');
        $("#slide" + currentSlide.toString()).fadeOut(300, "linear", complete);

        currentSlide = slide;
        if (typeof(slideTimer) != 'undefined') clearTimeout(slideTimer);
        slideTimer = setTimeout("slideshow()",4000);
    }
}

function slideshow(){
    if (typeof(slideTimer) != 'undefined') clearTimeout(slideTimer);
    if(!pause){
        update_slideshow(currentSlide + 1);
    }
    slideTimer = setTimeout("slideshow()",4000);
}
var slideTimer = setTimeout("slideshow()",4000);

1 个答案:

答案 0 :(得分:3)

您可以尝试将setTimeout与函数引用而不是字符串一起使用。改变这个:

setTimeout("slideshow()",4000);

对此:

setTimeout( slideshow, 4000 );

作为旁注,您可以考虑简化一些代码。 pause只有两种状态,所以:

switch(pause){
  case false:
    $("#ssbut" + slide.toString()).removeClass('pause').addClass('play');
    pause = true;
    break;
  case true:
    $("#ssbut" + slide.toString()).removeClass('play').addClass('pause');
    pause = false;
    break;
 }

......可以改写如下:

$('#ssbut' + slide.toString()).toggleClass('pause play', pause);
pause = !pause;

<小时/> 更新:注意到OP无意中在slideShow函数中递归:

function slideshow(){
  // stuff
  slideTimer = setTimeout("slideshow()",4000); // -> now there's your problem
}

删除该行可以解决问题。