在 jQuery 中停止递归动画

Posted

技术标签:

【中文标题】在 jQuery 中停止递归动画【英文标题】:Stop Recursive Animation in jQuery 【发布时间】:2012-05-07 08:07:08 【问题描述】:

我有一个递归动画来使屏幕上的文本改变颜色。当 div 失去可见性时,我想要一些机制来停止这个动画。在我的实际站点中,这是在一个对话框中。我想在对话框关闭时停止所有动画。我尝试使用$.stop(),但我认为这不会在递归调用期间中断调用堆栈。

这是我正在做的事情的要点:

javascript

function rainbow() 
    var hue = 'rgb(' + (Math.floor(Math.random() * 256)) + ',' + (Math.floor(Math.random() * 256)) + ',' + (Math.floor(Math.random() * 256)) + ')';
    $('#rainbow ul li').animate(
        color: hue
    , 500, rainbow);

$(function() 
    rainbow();

    $("#stop").click(function() 

        $('#rainbow ul li').stop()

    );
);​

html

<div id="rainbow">
    <ul>
        <li>Apple</li>
        <li>Microsoft</li>
        <li>SUN</li>
    </ul>
</div>
<button id="stop" type="reset">Stop</button>

http://jsfiddle.net/cRar7/12/

点击停止按钮不做任何事情,动画继续。

【问题讨论】:

不要只是发布链接.. 还要提供代码以防第三方网站出现故障! 【参考方案1】:

看看.stop的第一个参数

.stop( [clearQueue] [, jumpToEnd] )

clearQueue 一个布尔值,表示 是否也删除排队的动画。默认为 false。

所以:

$('#rainbow ul li').stop(true);

应该可以。

http://jsfiddle.net/cRar7/14/

【讨论】:

嗯,我在发布之前尝试了$('#rainbow ul li').stop(true,true);,但没有成功,但是如果我使用你发布的内容,它就可以了。 jumpToEnd 参数在处理递归时必须搞砸。我想既然没有“终点”,那就有办法去。【参考方案2】:

好吧,你可以用一个标志来做这个把戏:

var shouldStop = false;
function rainbow() 
    if(shouldStop) return;
    // rest of animation code here


$("#stop").click(function() 
    shouldStop = true;
    $('#rainbow ul li').stop();
);

这是演示:http://jsfiddle.net/cRar7/13/

【讨论】:

【参考方案3】:

如果你设置一个间隔而不是设置动画自递归,那没问题。 将您的脚本更改为:

function rainbow() 
    var hue = 'rgb(' + (Math.floor(Math.random() * 256)) + ',' + (Math.floor(Math.random() * 256)) + ',' + (Math.floor(Math.random() * 256)) + ')';
    $('#rainbow ul li').animate(
        color: hue
    , 500);

$(function() 
    var ani=setInterval(rainbow,500);

    $("#stop").click(function() 

        clearInterval(ani);

    );
);

【讨论】:

以上是关于在 jQuery 中停止递归动画的主要内容,如果未能解决你的问题,请参考以下文章

如何在jQuery中停止动画,但是当动画首先完成时

jQuery中停止动画stop

jquery中stop停止动画笔记

jQuery 停止动画

jQuery 停止动画-jQuery stop()

jQuery 效果 – 停止动画