OSDN Git Service

Modify the setSmilEvent for a repeat event
authordhrname <dhrname@users.sourceforge.jp>
Thu, 3 Nov 2016 13:53:24 +0000 (22:53 +0900)
committerdhrname <dhrname@users.sourceforge.jp>
Thu, 3 Nov 2016 13:53:24 +0000 (22:53 +0900)
org/w3c/dom/smil.js

index 98a3e81..67e21aa 100644 (file)
@@ -1045,26 +1045,65 @@ base("$calcMode").up("$attribute").mix( {
    * setSmilEventメソッドを見よ*/\r
   _repeatList: [],\r
   \r
+  /*リピート回数を示すプロパティ\r
+   * setSmilEventメソッドを見よ*/\r
+  _repeatCount: 0,\r
+  \r
   /*SMILイベント関連を発火させるためのメソッド\r
    * もっぱら、push メソッドで使われる*/\r
    setSmilEvent: function($list) {\r
-    var detail = 0;\r
     $list.addEvent("begin", function($list) {\r
-        var target = this._ele;\r
+        var target = this._ele,\r
+            detail = 0;\r
         /*IE11のために、MouseEventsでSMILEventsの代用をする*/\r
         var evt = target.ownerDocument.createEvent("MouseEvents");\r
         evt.initMouseEvent("beginEvent" ,true, true, window, detail, 0, 0, 0, 0, false, false, false, false, 0, target);\r
         target.dispatchEvent(evt);\r
         /*repeatイベントのために、_repeatListプロパティを初期化する*/\r
         var list = this._repeatList = [],\r
+            begin = $list.begin,\r
+            end = $list.end,\r
             simpleDuration = this.timeline.simpleDuration;\r
-      }.bind(this) );\r
+            if (simpleDuration && (simpleDuration !== end - begin)) {\r
+              /*活動継続時間と単純持続時間が異なるとき、repeatイベントを設定*/\r
+              for (var m= begin + simpleDuration, n=1;m < end; m+=simpleDuration) {\r
+                list.push( {\r
+                  frame: m,\r
+                  /*リピートの回数 (n >= 1)*/\r
+                  count: n\r
+                } );\r
+                ++n;\r
+              }\r
+              $list.addEvent("play", function($list) {\r
+                var target = this._ele,\r
+                    detail = 0,\r
+                    frame = $list.currentFrame,\r
+                    list = this._repeatList;\r
+                if (!list.length) {\r
+                  return;\r
+                }\r
+                for (var i=0;i<list.length;++i) {\r
+                  if ( (this._repaetCount >= i+1)\r
+                      || (list[i].frame >= frame) ) {\r
+                    this._repeatCount = detail;\r
+                    break;\r
+                  } \r
+                  detail = list[i].count;\r
+                  var evt = target.ownerDocument.createEvent("MouseEvents");\r
+                  evt.initMouseEvent("repeatEvent" ,true, true, window, detail, 0, 0, 0, 0, false, false, false, false, 0, target);\r
+                  target.dispatchEvent(evt);\r
+                }\r
+              }.bind(this) );\r
+            }\r
+    }.bind(this) );\r
+    \r
     $list.addEvent("end", function() {\r
-        var target = this._ele;\r
+        var target = this._ele,\r
+            detail = 0;\r
         var evt = target.ownerDocument.createEvent("MouseEvents");\r
         evt.initMouseEvent("endEvent" ,true, true, window, detail, 0, 0, 0, 0, false, false, false, false, 0, target);\r
         target.dispatchEvent(evt);\r
-      }.bind(this) );\r
+    }.bind(this) );\r
    },\r
 \r
   /*引数で指定した要素 ele の属性を解析して、フレームに追加する*/\r