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) { //ノードがもはや別の要素で使われている