【问题标题】:clearTimeout doesn't work in slideshowclearTimeout 在幻灯片中不起作用
【发布时间】:2015-06-04 21:11:41
【问题描述】:

我有一个全宽幻灯片。所以我有一些问题。 一是clearTimeout 不起作用。如果我通过单击调用该函数,它应该清除超时。

有人知道为什么这不起作用吗?请解释并说明问题到底出在哪里。

谢谢你,对不起我的英语不好。

var index = 0;
var slideSpeed = 1000;
function mainSlider(menuLink){
    clearTimeout(slide);
    if(menuLink !== false){
        alert('You call this function by a click event.');
        clearTimeout(slide);
    }
    var sliderIndex = $('.main_slider_content').length - 1;
    $('.main_slider_content').hide();
    index++;
    if(index > sliderIndex){
        index = 0;
    }
    $('.main_slider_content:eq(' + index + ')').show();
    var slide = setTimeout(function(){mainSlider(false)}, slideSpeed);
    setTimeout(countContentImg(index), slideSpeed);
}
$(document).on('click', '.main_slider_menu_link',function(){
    var linkIndex = $(this).index();
    mainSlider(linkIndex);
});
function countContentImg(index){
    $('#main_slider_selected_img').html('');
    var sliderIndex = $('.main_slider_content').length;
    for(var i = 0; i < sliderIndex; i++) {
        if(i === index)
            $('#main_slider_selected_img').append('<li class="main_slider_menu_link main_slider_menu_link_slected"></li>');
        else
            $('#main_slider_selected_img').append('<li class="main_slider_menu_link"></li>');
    }
}
$(document).ready(function(){
    countContentImg(index);
    mainSlider(false);
});

【问题讨论】:

  • 您是否希望clearTimeoutslide 值与您在mainSlider 函数底部设置的值相同?

标签: javascript jquery timeout


【解决方案1】:

这看起来像是范围问题。您正在尝试从尚不包含超时引用的变量中清除超时。每次调用 mainSlider 都会创建一个新的、本地范围的超时引用,在您尝试清除它很久之后。

function mainSlider(menuLink){
    clearTimeout(slide); // Clearing a timeout that doesn't exist yet
    if(menuLink !== false){
        alert('You call this function by a click event.');
        clearTimeout(slide); // Clearing a timeout that doesn't exist yet
    }
    var sliderIndex = $('.main_slider_content').length - 1;
    $('.main_slider_content').hide();
    index++;
    if(index > sliderIndex){
        index = 0;
    }
    $('.main_slider_content:eq(' + index + ')').show();
    // Now the timeout exists, but only in the scope of this current call
    var slide = setTimeout(function(){mainSlider(false)}, slideSpeed); 
    setTimeout(countContentImg(index), slideSpeed);
}

改成:

var slide;
function mainSlider(menuLink){
    clearTimeout(slide);
    if(menuLink !== false){
        alert('You call this function by a click event.');
        clearTimeout(slide);
    }
    var sliderIndex = $('.main_slider_content').length - 1;
    $('.main_slider_content').hide();
    index++;
    if(index > sliderIndex){
        index = 0;
    }
    $('.main_slider_content:eq(' + index + ')').show();
    // Remove var
    slide = setTimeout(function(){mainSlider(false)}, slideSpeed); 
    setTimeout(countContentImg(index), slideSpeed);
}

【讨论】:

  • 是的,这项工作很好,感谢您也感谢您的快速回复。这一切都很好,但你能解释为什么index() 不能工作,但length - 1 可以吗?
  • 说实话,我不确定你想在那里做什么。 .index() 返回集合中第一项相对于其兄弟项的位置。 .length 只是集合的逻辑长度,就像[1,2,3].length === 3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 2012-05-12
  • 1970-01-01
  • 2013-04-04
  • 2019-01-17
  • 2018-06-22
相关资源
最近更新 更多