これは簡単です。ユーザーがボタンをクリックしたときに実行される D3 トランジションを開始したいだけです。
ただし、D3end
イベントはトランジションで正しく発生していないようです: へのトランジションを要求しましたが、属性が のみの場合にイベントが発生しているようrotate(120)
です。end
rotate
45
これは私のコードです:
var angle = 0;
// handle click event
d3.selectAll('.mycolour').on('click', function() {
d3.select("#loadingicon").remove();
// redraw the icon (excluded here for brevity)...
// setting the transform attribute to 0 explicitly..
group2.attr("transform", "rotate(0,0,0)");
// and start it turning:
angle = 0;
function rotateLoadingIcon() {
angle = angle%360;
angle += 120;
console.log('rotateLoadingIcon', angle, group2.attr("transform"));
d3.select(".icon").transition().ease("linear")
.duration(4000)
.attr("transform", "rotate(" + angle + ",0,0)")
.each("end", function() {
angle += 120;
console.log('innerRotateLoadingIcon', angle, group2.attr("transform"));
group2.transition().ease("linear")
.duration(4000)
.attr("transform", "rotate(" + angle + ",0,0)")
.each("end", function() {
rotateLoadingIcon();
});
});
}
console.log('about to start icon loading');
rotateLoadingIcon();
});
アイコンが初めて描画されるときに機能します。
rotateLoadingIcon 120 rotate(0,0,0)
innerRotateLoadingIcon 240 rotate(119.99999999999999)
しかし、2 回目以降のクリックの後、次のようなコンソール出力が生成されるのを見てきました。
about to start icon loading
rotateLoadingIcon 120 rotate(0,0,0)
innerRotateLoadingIcon 240 rotate(45.14999999999999)
実際には、これが意味することは、回転の方向が変わるということです:(
属性が にしか設定されていないのに、なぜinnerRotateLoadingIcon
開始したのですか? 確かにコードを考えると、コードが最初に実行されるときのように、到達するまで開始するべきではありません。rotate
45.1...
rotate
120
私が JavaScript をセットアップした方法は、2 つの異なるバージョンのrotateLoadingIcon
が同時に実行される可能性があることを意味するかどうか疑問に思っています。これは可能ですか、そうであれば修正できますか?
更新: 問題を示す JSFiddle を次に示しますsetInterval
がend
、2 回クリックすると、回転の方向が変わることがわかります。理由はわかりません: http://jsfiddle.net/QtBvJ/