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; };