【问题标题】:Jquery slider with autoplay and navigation带有自动播放和导航功能的 Jquery 滑块
【发布时间】:2026-01-17 14:30:08
【问题描述】:

我正在尝试在 jquery 中构建一个小滑块,它可以自动播放并且还具有允许更改当前幻灯片的导航按钮。到目前为止,我设法让按钮工作,但由于我对 JQuery 不是很有信心,我不知道如何让定时更改工作。

我尝试了一些我在 * 上看到的建议,比如使用 setInterval 和 setTimeout,但我无法让它正常工作。我的主要问题是我想确保动画在每次单击更改幻灯片之前完成,并且单击会重置自动播放的计时器。

我希望这里有人可以帮助我解决我的问题。

编辑:我有一个计时器功能可以工作,现在我的问题是,如果在动画运行时单击按钮,可能会导致同时显示两张幻灯片。在动画播放完毕之前,如何确保点击被排队?

这是一个小提琴:http://jsfiddle.net/9sgfd22r/10/

这是我的功能:

 (function($){
        $.fn.Slider = function(interval) {

            var slides = $sliderdiv.children('.slides');
            var amount = slides.length;
            var i = 0;
            var animation = 0;
            var clicked = 0;

            function run() {
                animation = 1;
                $('.slides:visible').each(function() {
                    active = this.id.replace('slide', '');
                    active = active - 1;
                    console.log(active);
                });

                $(slides[active]).fadeOut(1000, function(){
                    i = clicked - 1;

                    $("img", $(slides[i])).each(function(){
                        $(this).attr('src', $(this).attr('data-src'));
                    });

                    $(slides[i]).fadeIn(1000);
                    clicked = 0;
                    animation = 0;
                    intervaltint = setInterval(autoplay,3000);
                });
            }



            function autoplay(){
                console.log('running');
                animation = 1;
                $('.slides:visible').each(function() {
                    active2 = this.id.replace('slide', '');
                    active2 = active2 - 1;
                    console.log(active2);
                });

                $(slides[active2]).fadeOut(1000, function(){
                    active2++;
                    if (active2 >= amount) active2 = 0;

                    $("img", $(slides[active2])).each(function(){
                        $(this).attr('src', $(this).attr('data-src'));
                    });

                    $(slides[active2]).fadeIn(1000);
                    animation = 0;
                });
            }

            intervaltint = setInterval(autoplay,3000);

            var $slidernav = $('.slidernav');
            $('.slidernav').click(function() {

                clearInterval(intervaltint);

                activeslide = this.id.replace('slidernav', '');

                if (animation == 0) {
                    clicked = activeslide;
                    run();
                }
                else {
                    console.log('not now');

                    clicked = activeslide;
                    run();
                }
            });

        };
    })(jQuery);

【问题讨论】:

  • 制作小提琴并与我们分享
  • 我添加了小提琴,但这听起来很愚蠢,我什至无法让我的脚本在小提琴中工作。我必须改变什么才能让它工作?编辑:让它工作!
  • 我根据我目前管理的内容更改了小提琴,但我仍然需要帮助。

标签: javascript jquery slideshow


【解决方案1】:

这个fiddle怎么样

我添加的示例代码是

function next(){
    if (animation == 0) {
        $('.slides').each(function(index,value) {
            if($(this).is(':visible')){
                if(($('.slides').length-1) == index){
                    clicked = 1;
                }
                else{
                    if(clicked == 0)
                        clicked++;
                    clicked++;
                }
            }
        });
        run();
    }
}

$('#next').click(function(){
    next();
});

【讨论】:

  • 你能给我解释一下你的代码吗?特别是这一行 $('.slides').each(function(index,value) ,我不太明白您的函数中使用了什么索引和值。非常感谢。
  • 我将一个匿名函数传递给each 方法,它接受两个参数,一个是索引,另一个是实际元素(值)。更多信息请阅读this
  • 好吧,我明白了。但是,如果我没记错的话,您的函数也不能处理在动画仍在播放时按下“下一个”元素的问题。如何“排队”元素上的点击?所以快速按下下一个元素两次实际上会推进两张幻灯片?
  • 目前还不是。我只会取消创建的事件,直到动画完成。如果要排队,则必须通过构建队列机制手动执行此操作。这也是你最初问的吗?
  • 构建队列机制会很复杂吗?正如我所说,我还没有太多使用 Jquery 和 JS 的经验。这不是我最初要求的,而是在我更新了我到目前为止所取得的成果之后。但是我可以在动画完成之前忽略所有点击,或者有我在问题中提到的错误。最初,我正在寻求有关计时器功能的帮助,后来我设法自己开始工作。如果我的问题非常混乱且语法不好,我很抱歉,英语不是我的第一语言,我也不太擅长。因此,如果您误解了我,我想真诚地道歉。