javascript - jQuery + setTimeout() + clearTimeout() 在 IE7 和 8 中不起作用

标签 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);

最佳答案

您可以尝试将 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
}

删除该行即可解决问题。

关于javascript - jQuery + setTimeout() + clearTimeout() 在 IE7 和 8 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4608141/

相关文章:

php - 使用 PHP 或 Javascript 检查 iOS 版本是否为 3.0 或更高版本

javascript - 如何在 Javascript 源数据中使用(添加)行创建回调

javascript - 如何使用 JavaScript/jQuery 在单击时更改特定 TD 的背景颜色?

javascript - 每个都打破下划线

javascript - 我如何在 jquery 中将下拉列表设置为只读?

javascript - VueJS : how to reference this. $存储在组件数据属性中

javascript - 当我调整浏览器窗口大小时,我的图像在它们应该保持在一起时移动了

javascript - 调用 reduce 对对象数组求和返回 NaN

jquery - Bootstrap Modal 自动打开 关闭

javascript - 滚动太远