javascript - 带触发器的循环(包含动画)不起作用

标签 javascript jquery css loops animation

所以我好像跑进了一个死胡同。我正在制作一个包含图像 slider 的页面。 slider 有三张图片,一张在屏幕中央,另外两张在左右两侧溢出。当您单击按钮以推进幻灯片时,它会运行此代码....

$('#slideRight').click(function() {
    if ($('.container').is(':animated')) {return false;}
    var next=parseInt($('.container img:last-of-type').attr('id')) + 1;
    if (next == 12) {
        next = 0;
    }
    var diff = galsize() - 700;
    if ($('.thumbs').css("left") == "0px") {
        var plus = 78;
    } else {
        var plus = 0;
    }
    var app='<img id="' + next + '" src="' + imgs[next].src + '">';
    $('.container').width('2800px').append(app);
    $('.container').animate({marginLeft: (diff + plus) + "px"}, 300, function() {
        $('.container img:first-of-type').remove();
        $('.container').width('2100px').css("margin-left", (galsize() + plus) + "px");
    });
}); // end right click

这很好用,没问题.....我还设置了一个间隔,每 5 秒自动运行一次以形成幻灯片...

var slideShow = setInterval(function() {
    $('#slideRight').trigger("click");
}, 5000);

这也很完美,没问题....但是我的问题是....我有缩略图,当你点击缩略图时,它应该运行这段代码直到当前图片与缩略图相同....这是代码....

$('img.thumbnail').click(function() {
    clearInterval(slideShow);
    var src = $(this).attr("src");
    while ($('.container img:eq(1)').attr('src') != src) {
        $('#slideRight').trigger("click");
    }
});

当我点击缩略图时没有任何反应......我已经使用警报语句来尝试和调试,最终发生的是......

while 循环执行,但是第一次没有任何反应。幻灯片一点也不先进。从第二次执行开始,每次都会触发 is('::animated') 并且不会执行 slideRight 事件的其余部分...

那么我的第一个问题,谁能解释一下为什么它第一次没有运行?

我的第二个问题,有没有办法等到动画完成后再继续循环?

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

我将从你问题的第二部分开始,关于在继续循环之前完成动画。

我以前做过类似的事情,我做的是设置两个全局变量来控制动画。一个变量是您希望周期持续多长时间,另一个是自上次循环以来经过了多长时间的计数器。

所以,例如:

$timeToChange = 5; // in Seconds
$timeSinceReset = 0; // also in Seconds

将间隔设置为一秒并调用一个新函数 (autoAdvance()):

var slideShow = setInterval(function() {
    autoAdvance();
}, 1000); // only one second

然后使用counter变量统计每次调用interval的时间(每秒)。像这样的东西:

function autoAdvance(){

    if($timeSinceReset == $timeToChange){

        $timeSinceReset = 0;

        $('#slideRight').trigger("click"); // execute click if satisfied
    }
    else{$timeSinceReset++;}

}

要在动画完成之前停止循环,请在单击缩略图时将 $timeSinceReset 重置回 0(零)。像这样的东西:

$('#thumbnail').click(function(){
    $timeSinceReset = 0;
});

这将在循环继续之前为您提供 5 秒缓冲(或您设置的任何 $timeToChange)。

对于问题的第一部分,获取特定缩略图的编号,然后使用它滚动到适当的图像。像这样的东西:

$('.thumb').click(function (each) {
    $childNumber = $(this).index();
});

您可以在 this fiddle 中看到.单击其中一个灰色框,它会告诉您单击了哪一个。使用该信息滚动到相应的图像(如果您只有三张图像,则为 1、2 或 3)。

希望这对您有所帮助。

关于javascript - 带触发器的循环(包含动画)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21174310/

相关文章:

javascript - 两种状态的三向切换(Javascript 或 jQuery)

javascript - 如何防止在 jquery/javascript 中向表中重复追加数据?

css - 从自己的服务器使用类似 api 的字体的经验?

javascript - XMLHttpRequest 无法加载 "...No ' Access-Control-Allow-Origin' header 存在于请求的资源上。”-- Jquery

php - 总结 2 个在 PHP 中动态创建的值

javascript - 如何使用 jquery 在现有 li 列表之间添加带有文本的 li 元素?

javascript - 无法在导航点击事件上编辑 div

java - 在JSP中使用jquery ajax没有调用Servlet?

html - 如何拥有类似于 Twitter Bootstrap 网站上的导航栏

javascript - 在页面加载时隐藏 DIV