6

我有这段代码(在 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()会正确调用并且所有动画都会停止。
但是当离开悬停区域时,它不会恢复动画,而是在控制台中出现以下错误:

未捕获的类型错误:无法读取未定义的属性“转换”

我不知道为什么会这样;有人能帮忙吗?

4

2 回答 2

6

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

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

唯一设置的地方totalOriginrunAnimation函数:

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()and调用elproto.resume()。这个函数构造了一些复杂的返回值,但没有活动代码使用它的返回值,只有从第 2980 行开始的注释掉的行。

runAnimation如果该函数有参数,该函数也会调用该函数value

 runAnimation(anim, this, -1, mmin(value, 1)     );
          totalOrigin should be passed here! ^^^

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

我尝试totalOrigin根据第 3312 行添加一个参数:

 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

于 2012-07-07T20:35:51.217 回答
0

elproto.status方法中,您需要替换(Raphael 2.1.4 中的第 5127-5128 行)

runAnimation(anim, this, -1, mmin(value, 1));
return this;

for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {
    e = animationElements[i];
    runAnimation(anim, this, -1, mmin(value, 1), e.totalOrigin, e.repeat);
    return this;
}
于 2016-01-25T23:34:08.583 回答