[Sie-announce] SIEコード [1631] dispatchEventメソッドを修正

アーカイブの一覧に戻る

svnno****@sourc***** svnno****@sourc*****
2010年 2月 3日 (水) 23:28:26 JST


Revision: 1631
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1631
Author:   dhrname
Date:     2010-02-03 23:28:26 +0900 (Wed, 03 Feb 2010)

Log Message:
-----------
dispatchEventメソッドを修正

Modified Paths:
--------------
    branches/ufltima/dom/events.js

Modified: branches/ufltima/dom/events.js
===================================================================
--- branches/ufltima/dom/events.js	2010-02-03 11:41:44 UTC (rev 1630)
+++ branches/ufltima/dom/events.js	2010-02-03 14:28:26 UTC (rev 1631)
@@ -109,35 +109,31 @@
     throw new EventException(EventException.UNSPECIFIED_EVENT_TYPE_ERR);
   }
   evt.target = this;
-  var te = this, s = [];
+  var te = this, s = []; //配列sに、このノードからドキュメントノードにいたるまでの、DOMツリーを作成しておく
   do {
     s[s.length] = te;
     te = te.parentNode;
   } while (te);
-  if (this === evt.target) {
-    evt.eventPhase = Event.AT_TARGET;
-  }
-  var tce = this._capter;
-  evt.currentTarget = this;
-  for (var i=0,tcli=tce.length;i<tcli;i++){
-    if (tce[i]) {
-      tce[i].handleEvent(evt);
+  s.unshift(this.ownerDocument);
+  /*最初に捕獲フェーズでDOMツリーを下っていき、イベントのターゲットについたら、
+   *そこで、浮上フェーズとして折り返すように、反復処理をおこなう
+   */
+  for (var i=0, n=1, sli = s.length;i<sli*2-1;++i){
+    var d = sli - i;
+    if (d === 0){ //イベントのターゲットに到着(折り返し地点)
+      n = -1;
+      evt.eventPhase = Event.AT_TARGET;      
     }
-  }
-  if (evt.eventPhase === Event.CAPTURING_PHASE) {
-    var cte = this.lastChild;
-    while(cte) {
-      cte.dispatch(evt);
-      if (evt.eventPhase === Event.AT_TARGET) {
-        cte = null;
-      } else {
-        cte = cte.previousSibling;
+    evt.currentTarget = s[d*n-1];
+    var tce = evt.currentTarget._capter;
+    for (var j=0,tcli=tce.length;j<tcli;++j){
+      if (tce[j]) {
+        tce[j].handleEvent(evt);
       }
     }
-  } else {
-    if (this.parentNode) {
-      this.parentNode.dispatchEvent(evt);
-    }
+    if (d === 0) {
+      evt.eventPhase = Event.BUBBLING_PHASE;
+    } 
   }
 };
 
@@ -148,7 +144,7 @@
 EventListener.prototype = {
 /*void*/ handleEvent : function( /*Event*/ evt) {
     var ph = evt.eventPhase, cap = this._cap;
-    if (ph === Event.CAPTURING_PHASE) {   //イベント位相が捕獲段階であることを示し
+    if (ph === Event.CAPTURING_PHASE) {   //イベントフェーズが捕獲段階であることを示し
       cap = cap ? false : true;    //このオブジェクト(EventListenr)が捕獲を指定するならば、リスナーを作動させる。指定しなければ、作動しない。
     }
     if (!cap && evt.type === this._type) { //
@@ -257,7 +253,7 @@
     var s = this[this._num];
     this[this._num] = node;
     evt.initMutationEvent("DOMAttrModified", true, true, node, null, node.nodeName, node.nodeName, MutationEvent.MODIFICATION);
-    node.ownerElement.dispatchEvent(evt);
+    node.ownerElement.dispatchEvent(evt); //このとき、MutationEventsが発動
     return s;
   } else {
     if ( arg.ownerElement !== void 0) { //ノードがもはや別の要素で使われている




Sie-announce メーリングリストの案内
アーカイブの一覧に戻る