[Sie-announce] SIEコード [2342] dispatchEventメソッドの最適化

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2011年 1月 29日 (土) 19:50:37 JST


Revision: 2342
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2342
Author:   dhrname
Date:     2011-01-29 19:50:37 +0900 (Sat, 29 Jan 2011)

Log Message:
-----------
dispatchEventメソッドの最適化

Modified Paths:
--------------
    branches/06x/069/org/w3c/dom/events.js

Modified: branches/06x/069/org/w3c/dom/events.js
===================================================================
--- branches/06x/069/org/w3c/dom/events.js	2011-01-28 14:18:36 UTC (rev 2341)
+++ branches/06x/069/org/w3c/dom/events.js	2011-01-29 10:50:37 UTC (rev 2342)
@@ -96,7 +96,7 @@
 function EventException() {
   DOMException.call(this,arguments);
   if (this.code === 0) {
-    this.message = "Uuspecified Event Type Error (イベントの型を定義されましたか)";
+    this.message = "Uuspecified Event Type Error";
   }
   return this;
 };
@@ -142,28 +142,42 @@
   }
   evt.target = this;
   evt.eventPhase = 1;//Event.CAPTURING_PHASE
-  var te = this, s = [];
-  //配列sに、このノードからドキュメントノードにいたるまでの、DOMツリーのリストを作成しておく
-  do {
-    s[s.length] = te;
-    te = te.parentNode;
-  } while (te);
-  s[s.length] = this.ownerDocument;
+  var te = this;
+  //このノードからドキュメントノードにいたるまでの、DOMツリーのリストを作成しておく
+  var td = this.ownerDocument;
+  td[Event.BUBBLING_PHASE] = null;
+  if (!te.parentNode) {
+    /*もし、親要素がなければ、
+     *ドキュメントから直接、イベントを発火させるようにする
+     */
+    td[/*Event.CAPTURING_PHASE*/ 1] = te;
+    te[/*Event.BUBBLING_PHASE*/ 3] = td;
+  } else {
+    /*以下の処理では、documentElementのparentNodeが
+     *Documentノードではなく、nullになっていることを前提としている。
+     *したがって、documentElementのparentNodeがもし、Documentノードのオブジェクトならば、以下を書き換えるべきである
+     */
+    while (te.parentNode) {
+      te.parentNode[/*Event.CAPTURING_PHASE*/ 1] = te;
+      te[/*Event.BUBBLING_PHASE*/ 3] = te.parentNode;
+      te = te.parentNode;
+    }
+    td[/*Event.CAPTURING_PHASE*/ 1] = te;
+    te[/*Event.BUBBLING_PHASE*/ 3] = td;
+  }
   /*最初に捕獲フェーズでDOMツリーを下っていき、イベントのターゲットについたら、
    *そこで、浮上フェーズとして折り返すように、反復処理をおこなう。
    *nは捕獲フェーズの段階で1、浮上フェーズに切り替わったら-1となる
    *
    */
-  for (var i=0, n=1, d=0, tce = null, sli = s.length, slii = sli*2-1;i<slii;++i){
-    var d = sli - i - 1;
-    if (d === 0){ //イベントのターゲットに到着(折り返し地点)
-      n = -1;
-      evt.eventPhase = 2;//Event.AT_TARGET;
-      evt.currentTarget = evt.target;
-    } else {
-      evt.currentTarget = s[d*n];
+  var type = /*Event.CAPTURING_PHASE*/ 1;
+  while (td) {
+    evt.currentTarget = td;
+    if (td === this) { //イベントのターゲットに到着(折り返し地点)
+      type = 2;//Event.AT_TARGET;
     }
-    tce = evt.currentTarget._capter; //tceは登録しておいたリスナーのリスト
+    evt.eventPhase = type;
+    var tce = td._capter; //tceは登録しておいたリスナーのリスト
     for (var j=0,tcli=tce.length;j<tcli;++j){
       if (tce[j]) {
         tce[j].handleEvent(evt);
@@ -173,15 +187,16 @@
     if (evt._stop) {
       break; //stopPropagationメソッドが呼ばれたら、停止する
     }
-    if (d === 0) {
+    if (td === this) {
       if (!evt.bubbles) {
         break; //浮上フェーズに移行せず、停止する
       }
-      evt.eventPhase = 3;//Event.BUBBLING_PHASE;
+      type = 3;//Event.BUBBLING_PHASE;
     }
+    td = td[type];
   }
   var ed = evt._default
-  evt = te = s = d = tce = n = sli = slii = dn = i = null;
+  evt = te = s = d = tce = n = td = type = null;
   return ed;
 };
 




Sie-announce メーリングリストの案内
Back to archive index