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