我有这段代码(on jsfiddle)

var paper = new Raphael('holder', 400, 100);

var set = paper.set();

for(var i = 0; i < 10; i++) {
    var circle = paper.circle((i * 30) + 30, 20, 5);
    circle.attr({ fill: '#ff0' });
    circle.animate(Raphael.animation({ transform: 's2,2' }, 2000).repeat('Infinity'));

    set.push(circle);
}

set.hover(function() {
    set.pause();
}, function() {
    set.resume(); // <- things get nasty here
});​

现在,当鼠标进入集合时,正确调用了set.pause(),并且所有动画都停止了。
但是,当离开悬停区域时,它不会继续播放动画,而是在控制台中出现以下错误:



我不知道为什么会这样。有人可以提供帮助吗?

最佳答案

在Safari/Firefox上,悬停了一段时间后,我收到此错误消息(使用https://raw.github.com/DmitryBaranovskiy/raphael/master/raphael.js上的未压缩源):

`raphael.js`, line 2946: `e.totalOrigin is undefined`

设置totalOrigin的唯一位置是runAnimation函数:
line 3072: function runAnimation(anim, element, percent, status, totalOrigin, times) {

您的代码首先调用elproto.pause()(第3352行),然后调用elproto.resume()(第3361行)。 pause()paused属性设置为true,resume()删除此属性。但是resume也会在删除status()标志后立即调用paused方法:
var e = animationElements[i];
if (eve("raphael.anim.resume." + this.id, this, e.anim) !== false) {
    delete e.paused;
    this.status(e.anim, e.status);
}

奇怪的,正在进行的elproto.status方法(第3323行)仅由elproto.setTime()elproto.resume()调用。该函数构造一些复杂的返回值,但是没有 Activity 代码使用其返回值,仅注释掉了从2980行开始的行。

如果它具有runAnimation参数,则此函数还调用value函数:
 runAnimation(anim, this, -1, mmin(value, 1)     );
          totalOrigin should be passed here! ^^^

不幸的是,它没有为totalOrigin传递任何东西,这就是该错误的原因。

我尝试根据第3312行添加totalOrigin参数:
 runAnimation(anim, this, -1, mmin(value, 1), this.attr());

虽然它似乎可以工作,但它有问题。

作为第二次尝试,我注释掉了整行:
 // runAnimation(anim, this, -1, mmin(value, 1));

结果:它可以工作,但是时间安排不正确,可能应该在某个地方更新动画的开始时间。

http://jsfiddle.net/7nGcR/26/
https://raw.github.com/gist/3067995/1e82de48eeacf98697b572efdc74c11a9b1d9d03/gistfile1.js

09-25 19:03