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()が正しく呼び出され、すべてのアニメーションが停止します。
しかし、ホバー領域を離れると、アニメーションは再開されません。代わりに、コンソールで次のエラーが発生します。

Uncaught TypeError:未定義のプロパティ'transform'を読み取れません

なぜこれが起こるのか私にはわかりません。誰かが助けることができますか?

4

2 に答える 2

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行目)呼び出します。プロパティをtrueにpause()設定し、このプロパティを削除します。ただし、フラグを削除した直後にメソッドを呼び出します。pausedresume()resumestatus()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、そしてこれがバグの原因です。

totalOrigin3312行目に基づいてパラメータを追加してみました。

 runAnimation(anim, this, -1, mmin(value, 1), this.attr());

動作しているように見えますが、バグがあります。

2番目の試みとして、私は行全体をコメントアウトしました。

 // 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 に答える