svnno****@sourc*****
svnno****@sourc*****
2010年 1月 31日 (日) 21:27:29 JST
Revision: 1611 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1611 Author: dhrname Date: 2010-01-31 21:27:29 +0900 (Sun, 31 Jan 2010) Log Message: ----------- Eventに関する整理とdispatchメソッドの修正 Modified Paths: -------------- branches/DOM/org/w3c/core.js branches/DOM/org/w3c/dom/events.js Modified: branches/DOM/org/w3c/core.js =================================================================== --- branches/DOM/org/w3c/core.js 2010-01-29 12:22:03 UTC (rev 1610) +++ branches/DOM/org/w3c/core.js 2010-01-31 12:27:29 UTC (rev 1611) @@ -1087,38 +1087,6 @@ var s = (typeof(this._id[elementId]) == "undefined") ? null : this._id[elementId]; return s; }; -//以下はDOMで設計されていないことに気をつける -Document.prototype._fireEvent = function(type, bubble, cancel) { //eventの発火 - var evt = this.createEvent(); - evt.initEvent(type,bubble,cancel); - evt.target = this[window.event.srcElement.uniqueID]; - var p = evt.target, ch = [], n = 0; //chはノードリスト - while (!p) { - ch[n] = p; - n++; p = p.parentNode; - } - for (var i=0,chi=ch.length*2-1;i<chi;i++) { - evt.currentTarget = ch[i]; - if (i == ch.length-1) { - evt.eventPhase = 2; - } else if (i > ch.length-1) { - evt.eventPhase = 3; - } - ch[i].dipatchEvent(evt); - } - if (typeof this._updateAfterEvent != "undefined") { - this.updateAfterEvent(); - this._arr = null; - this._arr = []; - } - evt = null; -} -Document.prototype._updateAfterEvent = function() { //event終了時に強制描画 - var tarr = this._arr; - for (var i=0,tarri=tarr.length;i<tarr;++i) { - tarr[i].set(this.w,this.h); - } -} /* #endif // _DOM_IDL_*/ Modified: branches/DOM/org/w3c/dom/events.js =================================================================== --- branches/DOM/org/w3c/dom/events.js 2010-01-29 12:22:03 UTC (rev 1610) +++ branches/DOM/org/w3c/dom/events.js 2010-01-31 12:27:29 UTC (rev 1611) @@ -109,11 +109,66 @@ if (!evt.type || evt.type === "") { //Eventの型が設定されていないとき throw new EventException(EventException.UNSPECIFIED_EVENT_TYPE_ERR); } - var tce = this._capter; - for (var i=0,tcli=tce.length;i<tcli;i++){ - if (tce[i]) { tce[i].handleEvent(evt);} + if (this === evt.target) { + 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; + } + } + } else { + var tce = this._capter; + for (var i=0,tcli=tce.length;i<tcli;i++){ + if (tce[i]) { + tce[i].handleEvent(evt); + } + } + if (this.parentNode) { + this.parentNode.dispatchEvent(evt); + } + } }; +Document.prototype.dispatchEvent = function( /*Event*/ evt) { + this.docuemntElement.dispatch(evt); +} +//以下はDOMで設計されていないことに気をつける +Document.prototype._fireEvent = function(type, bubble, cancel) { //eventの発火 + var evt = this.createEvent(); + evt.initEvent(type,bubble,cancel); + evt.target = this[window.event.srcElement.uniqueID]; + var p = evt.target, ch = [], n = 0; //chはノードリスト + while (!p) { + ch[n] = p; + n++; p = p.parentNode; + } + for (var i=0,chi=ch.length*2-1;i<chi;i++) { + evt.currentTarget = ch[i]; + if (i == ch.length-1) { + evt.eventPhase = 2; + } else if (i > ch.length-1) { + evt.eventPhase = 3; + } + ch[i].dipatchEvent(evt); + } + if (typeof this._updateAfterEvent != "undefined") { + this.updateAfterEvent(); + this._arr = null; + this._arr = []; + } + evt = null; +} +Document.prototype._updateAfterEvent = function() { //event終了時に強制描画 + var tarr = this._arr; + for (var i=0,tarri=tarr.length;i<tarr;++i) { + tarr[i].set(this.w,this.h); + } +} function EventListener(cap,type,listener) { this._cap = cap; this._type = type; this._listener = listener; @@ -122,10 +177,10 @@ EventListener.prototype = { /*void*/ handleEvent : function( /*Event*/ evt) { var ph = evt.eventPhase, cap = this._cap; - if (ph === 1) { //イベント位相が捕獲段階であることを示し + if (ph === Event.CAPTURING_PHASE) { //イベント位相が捕獲段階であることを示し cap = cap ? false : true; //このオブジェクト(EventListenr)が捕獲を指定するならば、リスナーを作動させる。指定しなければ、作動しない。 } - if (!cap && evt.type == this._type) { // + if (!cap && evt.type === this._type) { // this._listener(evt); } }