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