JavaScript / jQuery - 在添加和删除类与下一个函数之间添加延迟[重复]

Posted

技术标签:

【中文标题】JavaScript / jQuery - 在添加和删除类与下一个函数之间添加延迟[重复]【英文标题】:JavaScript/jQuery - Add Delay between Add and Remove Class and next function [duplicate] 【发布时间】:2012-09-01 20:57:36 【问题描述】:

可能重复:jquery add a fade to an .addClass

这是我的 jsFiddle 示例:http://jsfiddle.net/sLzGc/

我正在尝试创建选项 1 到 3 正在旋转的效果。每隔 1.2 秒,green 类就会从拥有它的选项中删除,green 类会添加到下一个选项中。这个想法是,在执行最终函数 alert('Finished') 之前,三个选项的轮换发生五次 (i<5)。

我正在尝试使用 setTimeout(),但我愿意使用 .delay()、另一个 jQuery 函数或其他选项。

这是我的 JavaScript/jQuery:

alert('Start');

sampleFunction();

function sampleFunction() 

for (i=0; i<5; i++) 

  setTimeout(function() 
    $('#option2').addClass('green');
    $('#option1').removeClass('green');
  ,1200);

  setTimeout(function() 
    $('#option3').addClass('green');
    $('#option2').removeClass('green');
  ,1200);

  setTimeout(function() 
    $('#option1').addClass('green');    
    $('#option2').removeClass('green');
  ,1200);

//end for loop



alert('Finished');​

我的整个例子都在 jsFiddle 上:http://jsfiddle.net/sLzGc/

感谢您提供的任何帮助或见解!

【问题讨论】:

【参考方案1】:

这是我解决问题的方法:

​(​function() 
    var options = [$("#option1"), $("#option2"), $("#option3")],
        cycles = 5,
        i = 0,
        $last = $(null);

    (function next()  
        if(i < cycles * options.length) 
            $last.removeClass("green");
            $last = options[i % options.length].addClass("green");
            i++;
            setTimeout(next, 1200);
         else 
            $last.removeClass("green");
            alert("finished!"); //do any other "we're done" stuff here.
        
    ());
());​

这很简单,很酷的部分是您可以将元素添加到元素列表中以非常容易地循环(只需将它们添加到options)。如果需要,您还可以设置周期数。我没有将类或延迟长度设为变量,但如果您想这样做,那将非常简单。

您可以在此处查看演示:

http://jsfiddle.net/D7SR8/

您还可以考虑在末尾添加一个回调函数并将alert() 放入其中。这样会更可重用。

【讨论】:

+1 非常干净、简单且易于定制。 作为一种可能的改进,您也可以只获取具有特定类的所有元素。这样您就不必单独列出每个选择器。 jsfiddle.net/D7SR8/2 同意,@JoshMein,但您将无法控制它选择每个项目的顺序。像这样控制可能更容易。不过,很酷的是,由于它使用 jQuery 对象,如果您愿意,您可以一次突出显示一堆。归根结底,它实际上是一段方便的代码。 :-) @Pete 非常酷的解决方案!我添加了一个变量count = options.length。谢谢!【参考方案2】:

如果您想使用 setTimeouts,那么您的代码可能如下所示:

var iteration = 0;
alert('start');
rotateColors();

function rotateColors() 
    setTimeout(function() 
        $('#option2').addClass('green');
        $('#option1').removeClass('green');
            setTimeout(function() 
                $('#option3').addClass('green');
                $('#option2').removeClass('green');
                setTimeout(function() 
                    $('#option1').addClass('green');    
                    $('#option3').removeClass('green');
                    iteration += 1;

                    if(iteration < 5)
                        rotateColors();
                    else
                        alert('finished');
            ,1200);
        ,1200);
    ,1200);   

Live DEMO

【讨论】:

@Mark Rummel 如果可以的话,我也会尝试考虑一个更简洁的 jquery 版本。 谢谢!我有你的解决方案工作!感谢 jsFiddle 演示!一个更干净的 jQuery 解决方案会很好。我也在审查 Pete 的解决方案,因为它听起来会在未来提供更大的灵活性,但你的回答肯定解决了我所需要的!再次感谢! @MarkRummel 我停止了更清洁的解决方案,因为皮特提供的与我的想法相似。不过,请务必查看我对他的代码的简短说明,这将使您更轻松。我在他的答案的 cmets 中附加了一个 jsfiddle。【参考方案3】:
alert('Start');
 var varobj=0;
sampleFunction();

function sampleFunction() 
setTimeout(function() 
    $('#option2').addClass('green');
    $('#option1').removeClass('green');

  ,1200, setTimeout(function() 
        $('#option3').addClass('green');
        $('#option2').removeClass('green');

      ,1200,setTimeout(function() 
            $('#option1').addClass('green');    
            $('#option3').removeClass('green'); if(varobj<5)varobj=varobj+1;sampleFunction();else alert('finished');
      ,1200);););

这是在 settimeout 中执行其他函数后调用函数的方法

【讨论】:

【参考方案4】:

我同时使用 setTimeout()setInterval() 来执行此操作,然后在 5 次执行后清除间隔。如果您希望它们都以某种颜色或任何其他修改结束,请告诉我!我刚刚对其进行了修改以遍历您的询问方式。 http://jsfiddle.net/sLzGc/9/

sampleFunction();

function sampleFunction() 
    alert('Start');
    $('#option1').addClass('disabled');

    var i = 0;
    var shift = function() 
        setTimeout(function() 
            $('#option1').toggleClass('disabled');
            $('#option2').toggleClass('disabled');
        , 0);
        setTimeout(function() 
            $('#option2').toggleClass('disabled');
            $('#option3').toggleClass('disabled');
        , 400);
        setTimeout(function() 
            $('#option3').toggleClass('disabled');
            $('#option1').toggleClass('disabled');
        , 800);
    ;
    var interval = setInterval(function() 
        ++i;
        if (i == 5) 
            clearTimeout(interval);
            alert('Finished');
         else 
            shift();
        
    , 1200);

    shift();
​

【讨论】:

以上是关于JavaScript / jQuery - 在添加和删除类与下一个函数之间添加延迟[重复]的主要内容,如果未能解决你的问题,请参考以下文章

通过 jQuery/Javascript 添加悬停 CSS 属性

在javascript或jQuery中检测iframe的负载(不是同一个域,动态添加)?

jquery怎么在元素前面插入东西

JavaScript Jquery - 在悬停时向div添加一个类

为啥使用 javascript / jQuery 添加类时 css 转换不起作用?

javascript 使用jQuery或javascript在鼠标悬停(鼠标悬停/鼠标移出)中添加或删除类