我有这段代码(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()
并停止所有动画
但是当离开悬停区域时它不会恢复动画,而是在控制台中出现以下错误:
未捕获的TypeError:无法读取未定义的属性'transform'
我不知道为什么会这样;有人能帮忙吗?
答案 0 :(得分:6)
在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()
调用。此函数构造一些复杂的返回值,但没有活动代码使用其返回值,只有从第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));
虽然看起来有效,但它还是有问题。
作为第二次尝试,我评论了整条线:
{{1}}
结果:它有效,但时机错误,可能应该在某处更新动画开始时间。
http://jsfiddle.net/7nGcR/26/ https://raw.github.com/gist/3067995/1e82de48eeacf98697b572efdc74c11a9b1d9d03/gistfile1.js
答案 1 :(得分: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;
}