jquery - 使用递归链接 jQuery 动画会导致浏览器崩溃

标签 jquery animation recursion

这是我想做的事情的基本想法:

  1. 将 DIV 的 innerHTML 设置为某个值 X
  2. 为 DIV 制作动画
  3. 动画结束后,更改 X 的值并重复 N 次

如果我在循环中执行此操作,最终会发生的情况是,因为动画是异步发生的,所以在动画有机会针对 X 的每个值运行之前,循环会完成并将 DIV 设置为其最终值。

this question请注意,解决此问题的最佳方法是在动画的回调处理程序中递归调用该函数。这样,在前一个值的动画完成之前,DIV 的值不会更改。

这在某种程度上非常有效。如果我同时对一堆 DIV 进行动画处理,我的浏览器就会不堪重负并崩溃。太多的递归。

有人能想出一种使用递归来做到这一点的方法吗?

编辑:

这是我的代码:

最佳答案

使用 setInterval,您应该能够执行如下操作。根本没有发生递归。 (当然,这个例子是人为的,但应该解释这个概念。)

工作示例:http://jsfiddle.net/TNwAZ/1/

HTML

<div id='myDiv' style="position:relative">div</div>​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

Javascript

var count = 10;
var duration = 500;

var interval = setInterval(function() { 
                                 $('#myDiv').text(count).animate({left: '+=50'},duration);
                                 count--;      // Decrement count
                                 if(!count) { clearTimeout(interval) }
                           }, duration );​
<小时/>

编辑:

不确定如何让元素进行动画处理,但这里有一个将对它们的引用放入数组中并循环的示例。

http://jsfiddle.net/TNwAZ/3/

HTML

<div id='myDiv1' style="position:relative">div 1</div>
<div id='myDiv2' style="position:relative">div 2</div>
<div id='myDiv3' style="position:relative">div 3</div>

Javascript

var divArray = ['myDiv1','myDiv2','myDiv3'];

for(var i in divArray) {
    intervalAnimate(divArray[i]);
}

function intervalAnimate(theDiv) {
    var count = 10;
    var duration = 500;

    var interval = setInterval(function() { 
              $('#' + theDiv).text(count).animate({left: '+=50'},duration);
               count--; // Decrement count
               if(!count) { clearTimeout(interval) }
       }, duration );
}
<小时/>

编辑:

此版本跳过 for 循环,仅获取 jQuery 对象的集合,并将其传递进去。

http://jsfiddle.net/TNwAZ/5/

HTML

<div id='myDiv1' style="position:relative">div 1</div>
<div id='myDiv2' style="position:relative">div 2</div>
<div id='myDiv3' style="position:relative">div 3</div>​

Javascript

var $divs = $('div[id^=myDiv]');

intervalAnimate($divs);

function intervalAnimate(collection) {
    var count = 10;
    var duration = 500;

    var interval = setInterval(function() { 
              $(collection).text(count).animate({left: '+=50'},duration);
               count--; // Decrement count
               if(!count) { clearTimeout(interval) }
       }, duration );
}

关于jquery - 使用递归链接 jQuery 动画会导致浏览器崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2761624/

相关文章:

ios - CABasicAnimation 在完成 1 个循环后回到原来的位置

javascript - ExtJs 4.2 - 取消/清除组件的动画链

jquery - 获取表中除前两列之外的所有 td?

javascript - 无法评估 AJAX 调用的 true/false 返回

jquery - 加载不同版本jquery时出现问题如何解决

javascript - html <object>,从外部读取javascript检测

javascript - 为 DOMMouseScroll 事件添加延迟

algorithm - 二叉树中的递归

java - 在二叉树中找到最小值?

javascript - 如何停止setTimeout递归