Javascript 无间隔停止功能循环

Javascript 无间隔停止功能循环,javascript,jquery,Javascript,Jquery,我有一个名为particleapper的JS函数,它是一个循环: var particles = new Array("pt0","pt1","pt2","pt3"); function particleAppear(){ var genPoint = Math.floor(Math.random() * (720 - 4 + 1)) + 4; var particle = particles[Math.floor(Math.random()*particles.length)

我有一个名为particleapper的JS函数,它是一个循环:

var particles = new Array("pt0","pt1","pt2","pt3");

function particleAppear(){
    var genPoint = Math.floor(Math.random() * (720 - 4 + 1)) + 4;
    var particle = particles[Math.floor(Math.random()*particles.length)];

    $('#particles').append('<div class="'+particle+'" style="position: absolute; top: '+genPoint+'px; left: -4px"></div>');

    var rtime1 = Math.floor(Math.random() * (42000 - 32000 + 1)) + 32000;
    var rtime2 = Math.floor(Math.random() * (42000 - 32000 + 1)) + 32000;
    var rtime3 = Math.floor(Math.random() * (42000 - 32000 + 1)) + 32000;
    var rtime4 = Math.floor(Math.random() * (42000 - 32000 + 1)) + 32000;

    $('.pt0').animate({left: '+=1280px'}, rtime1, "linear",function(){
        $(this).remove();
    });
    $('.pt1').animate({left: '+=1280px'}, rtime2, "linear",function(){
        $(this).remove();
    });
    $('.pt2').animate({left: '+=1280px'}, rtime3, "linear",function(){
        $(this).remove();
    });
    $('.pt3').animate({left: '+=1280px'}, rtime4, "linear",function(){
        $(this).remove();
    });

    var randomTimeGen = Math.floor(Math.random() * (1500 - 450 + 1)) + 450;
    setTimeout(particleAppear,randomTimeGen);
}

如您所见,使用的循环不是setInterval,而是setTimeout,它在450到1500ms之间的随机时间后重新运行函数。如何使用JAVASCRIPT/JQUERY停止此操作?

您可以将超时的数字id存储在变量中并清除它:

var timeout = setTimeout(particleAppear,randomTimeGen);

clearTimeout(timeout);

您可以将超时的数字id存储在变量中并清除它:

var timeout = setTimeout(particleAppear,randomTimeGen);

clearTimeout(timeout);
使用clearTimeout

在函数之外创建一个变量:

var timeout;
在你的功能中

timeout = setTimeout(particleAppear,randomTimeGen);
在代码的其他地方,您可以调用:

clearTimeout(timeout);
使用clearTimeout

在函数之外创建一个变量:

var timeout;
在你的功能中

timeout = setTimeout(particleAppear,randomTimeGen);
在代码的其他地方,您可以调用:

clearTimeout(timeout);

可以使用与使用setInterval停止函数运行相同的方法停止函数运行


可以使用与使用setInterval停止函数运行相同的方法停止函数运行



在您需要的任何事件下使用clearTimeout,或者在满足条件时仅调用settimeout来设置下一次迭代。停止该操作的一种方法是由递归方法之外的控制器进行控制。在递归方法中,您必须在再次点击setTimeout之前放置一个条件if。在方法之外,在控制器中,您可以随时更改递归方法的启动或停止。re:downvote,我猜这是一个非常基本的Javascript主题。一个非常简单的搜索,比如javascript停止计时器,几乎可以立即给出答案。请注意,我没有投反对票,但我认为这是有道理的。谢谢@jwatts1980。我希望人们能解释他们为什么否决投票。这并不能帮助OP提出更好的问题,反而会让新用户感到不受欢迎。谢谢你澄清这一点,下次我会尝试进行更深入的搜索!在您需要的任何事件下使用clearTimeout,或者在满足条件时仅调用settimeout来设置下一次迭代。停止该操作的一种方法是由递归方法之外的控制器进行控制。在递归方法中,您必须在再次点击setTimeout之前放置一个条件if。在方法之外,在控制器中,您可以随时更改递归方法的启动或停止。re:downvote,我猜这是一个非常基本的Javascript主题。一个非常简单的搜索,比如javascript停止计时器,几乎可以立即给出答案。请注意,我没有投反对票,但我认为这是有道理的。谢谢@jwatts1980。我希望人们能解释他们为什么否决投票。这并不能帮助OP提出更好的问题,反而会让新用户感到不受欢迎。谢谢你澄清这一点,下次我会尝试进行更深入的搜索!请注意,您实际上存储的是超时的数字标识,而不是超时本身。既然变量timeout是在函数中创建的,我是否应该对其进行全局化?使用window.timeout=超时;例如?哈哈,比我快了一步:+1@pedritoalfonso全局,不,但它肯定应该存储在一个作用域中,在需要访问它的地方可以访问它。@pedritoalfonso:如果可以避免,就不会。只要把它放在一个非全局范围内,任何需要访问它的函数都有一个共同点。只有两种特殊情况需要实际的全局优化;最好避免它们。请注意,您实际上存储的是超时的数字id,而不是超时本身。我是否应该全球化变量timeout,因为它是在函数中创建的?使用window.timeout=超时;例如?哈哈,比我快了一步:+1@pedritoalfonso全局,不,但它肯定应该存储在一个作用域中,在需要访问它的地方可以访问它。@pedritoalfonso:如果可以避免,就不会。只要把它放在一个非全局范围内,任何需要访问它的函数都有一个共同点。只有两种特殊情况需要实际的全局优化;最好避免它们。