if (simpleDur && (activeTime !== simpleDur)) {\r
/*活動継続時間と単純持続時間が異なるとき、repeatイベントを設定\r
* ただし、repeatイベントはendイベントが発生する前に起きるものと仮定*/\r
- first.next = {\r
- firstFrame: begin + simpleDur,\r
- frame: begin + simpleDur,\r
- eventType: "repeat",\r
- target: target,\r
- /*リピートの制限時間*/\r
- limit: begin + activeTime,\r
- /*リピートの回数 (n >= 1)*/\r
- count: 1,\r
- simpleDuration: simpleDur,\r
- next: first.next\r
- };\r
+ for (var a = first, i= begin + simpleDur, n=1;i < begin + activeTime; i+=simpleDur, ++n) {\r
+ a.next = {\r
+ frame: i,\r
+ eventType: "repeat",\r
+ target: target,\r
+ /*リピートの回数 (n >= 1)*/\r
+ count: n,\r
+ next: a.next\r
+ };\r
+ a = a.next;\r
+ }\r
}\r
}\r
timelines = obj = first = begin = target = simpleDur = activeTime = void 0;\r
if (frame <= num) {\r
/*IE11ではSVGEventsやDOMEventsを使うと問題が起きるため、MouseEventsで代用する*/\r
if (obj.eventType === "repeat") {\r
- var simpleDuration = obj.simpleDuration;\r
- /*リピートイベントが、リピート制限内である場合\r
- *numの段階で、何回リピートしたかを求める*/\r
- detail = obj.count = floor( (num - obj.firstFrame) / simpleDuration) + 1;\r
- /*simpleDurationを足すことによって、リピートイベントが\r
- * 単純継続時間内に何度も繰り返されることを防ぐ*/\r
- frame += simpleDuration;\r
- obj.frame = frame;\r
+ /*detailは何回リピートしたか*/\r
+ detail = obj.count;\r
}\r
- /*obj.limitはrepeatイベントの制限で使われるもの*/\r
- if ((obj.eventType !== "repeat") || (frame >= obj.limit)) {\r
- /*ポインタの連結を変更することで、リストからobj を除去*/\r
- cobj.next = obj.next;\r
- if (this.first === obj) {\r
- cobj = this.first = obj.next;\r
- }\r
+ /*ポインタの連結を変更することで、リストからobj を除去\r
+ * 一度除去したものはイベントを発生させない*/\r
+ cobj.next = obj.next;\r
+ if (this.first === obj) {\r
+ cobj = obj.next;\r
+ this.first = cobj;\r
} else {\r
cobj = obj;\r
}\r
}\r
obj = obj.next;\r
}\r
- obj = num = first = frame = target = cobj = simpleDuration = detail = void 0;\r
+ obj = num = first = frame = target = cobj = detail = void 0;\r
return s;\r
}\r
} );\r
eventType: "begin",\r
target: ele,\r
\r
- next: { firstFrame: 10,\r
+ next: {\r
frame: 10,\r
eventType: "repeat",\r
- limit: 12,\r
count: 1,\r
- simpleDuration: 9,\r
target: ele,\r
\r
next: { frame: 12,\r
eventType: "begin",\r
target: ele,\r
\r
- next: {firstFrame:5,\r
+ next: {\r
frame: 5,\r
eventType: "repeat",\r
- limit: 11,\r
count: 1,\r
- simpleDuration: 4,\r
target: ele,\r
\r
- next: { frame: 11,\r
- eventType: "end",\r
+ next: {\r
+ frame: 9,\r
+ eventType: "repeat",\r
+ count: 2,\r
target: ele,\r
- next: null\r
+ \r
+ next: { frame: 11,\r
+ eventType: "end",\r
+ target: ele,\r
+ next: null\r
+ }\r
}\r
}\r
};\r
expect(frame.first).toEqual(a);\r
frame.setFrame(5);\r
frame.$endFrame.setFrame(5);\r
- a.count = 1;\r
- a.frame = 9;\r
- expect(frame.first).toEqual(a);\r
+ expect(frame.first).toEqual(a.next);\r
\r
ele.addEventListener("repeatEvent", function(evt) {\r
expect(evt.target).toBe(ele);\r
}) );\r
frame.setFrame(9);\r
frame.$endFrame.setFrame(9);\r
- a.count = 2;\r
- a.limit = 16;\r
- a.next.frame = 16;\r
- expect(frame.first).toEqual(a);\r
+ expect(frame.first).toEqual({\r
+ frame: 13,\r
+ eventType: "repeat",\r
+ count: 3,\r
+ target: ele,\r
+ \r
+ next: { frame: 16,\r
+ eventType: "end",\r
+ target: ele,\r
+ next: null\r
+ }\r
+ } );\r
} );\r
afterEach( function() {\r
base("$frame").startAnimation();\r