OSDN Git Service

Version 0.6.78, bugfix & starting jsdoc.
authoritozyun <itozyun@user.sourceforge.jp>
Sat, 13 Sep 2014 01:48:04 +0000 (10:48 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Sat, 13 Sep 2014 01:48:04 +0000 (10:48 +0900)
12 files changed:
0.6.x/js/00_core/02_XType.js
0.6.x/js/00_core/03_XCallback.js
0.6.x/js/00_core/04_XClass.js
0.6.x/js/00_core/05_XTimer.js
0.6.x/js/00_core/06_XEventDispatcher.js
0.6.x/js/01_dom/10_XDom.js
0.6.x/js/01_dom/11_XDomNode.js
0.6.x/js/01_dom/14_XDomAttr.js
0.6.x/js/01_dom/15_XDomStyle.js
0.6.x/js/01_dom/20_XDomImage.js
0.6.x/js/01_dom/22_XDomBuilder.js
0.6.x/js/10_ui/06_AbstractUINode.js

index 1861709..005ea3e 100644 (file)
@@ -49,7 +49,7 @@ X.Type = {
        isHTMLElement :\r
                new Function( 'v',\r
                        ( X.UA.IE4 || X.UA.MacIE ) ?\r
-                               'return v&&v.tagName&&v.all' :// ie4 or MacIE5.23\r
+                       'return v&&v.tagName' : // ie4 or MacIE5.23, v.all <- error\r
                        window[ 'HTMLElement' ] ?\r
                                'return v instanceof HTMLElement' :\r
                        //window[ 'Element' ] ?\r
index b9cc825..7e880de 100644 (file)
@@ -1,4 +1,35 @@
 \r
+// ------------------------------------------------------------------------- //\r
+// ------------ local variables -------------------------------------------- //\r
+// ------------------------------------------------------------------------- //\r
+\r
+var XCallback_USE_CLOSURE = false,\r
+\r
+       XCallback_LIVE_LIST   = [],\r
+       XCallback_POOL_LIST   = [],\r
+       \r
+       XCallback_THIS_FUNC   = 1,\r
+       XCallback_HANDLEEVENT = 2,\r
+       XCallback_FUNC_ONLY   = 3;\r
+       \r
+\r
+/*\r
+ * handleEvent という関数のメンバーを持つオブジェクト\r
+ * @typedef {{ handleEvent : function }}\r
+ */\r
+var listener;\r
+\r
+/*\r
+ * コールバックに thisObject や、追加の引数を設定するための情報を収めたハッシュ\r
+ * @typedef {{ k : number, f : (function|undefined), x : (listener|undefined), s : (Array|undefined) }}\r
+ */\r
+var callbackHash;\r
+\r
+/*\r
+ * \r
+ * @typedef {funciton}\r
+ */\r
+var functionHash;\r
 \r
 X.Callback = {\r
        \r
@@ -198,5 +229,13 @@ X.Callback = {
        }\r
 };\r
 \r
+// ------------------------------------------------------------------------- //\r
+// --- implements ---------------------------------------------------------- //\r
+// ------------------------------------------------------------------------- //\r
+\r
+\r
+\r
+\r
+\r
 console.log( 'X.Core.Callback' );\r
 \r
index 2de9d36..76e0957 100644 (file)
@@ -99,17 +99,35 @@ X.Class = ( function(){
                                klass    = X.Class._getClass( instance ),\r
                                def      = X.Class._getClassDef( klass ),\r
                                data, p, i;\r
-                       if( def.isPrivate === true && killPrivateFlag === false ){\r
+                       if( def.isPrivate && !killPrivateFlag ){\r
                                X.Notification.critical( 'PrivateInstance.kill() work in PrivateUser.kill().' );\r
                                return;\r
                        };\r
                        killPrivateFlag = false; // onKill 内で PrivateInstance.kill() を防ぐため\r
+                       \r
                        // onKill() === false の場合、kill のキャンセル\r
                        // private      は false での キャンセル は無視される\r
-                       // TODO kill instance event\r
+                       if( this.instanceOf( X.EventDispatcher ) ){\r
+                               if( !def.isPrivate ){\r
+                                       if( this._dispatching ){\r
+                                               this.dispatch( X.Event.BEFORE_KILL_INSTANCE );\r
+                                               this._killReserved = true;\r
+                                               this.dispatch( X.Event.KILL_INSTANCE_CANCELED );\r
+                                               return;\r
+                                       } else\r
+                                       if( this.dispatch( X.Event.BEFORE_KILL_INSTANCE ) & X.Callback.PREVENT_DEFAULT ){\r
+                                               this.dispatch( X.Event.KILL_INSTANCE_CANCELED );\r
+                                               return;\r
+                                       };\r
+                               };\r
+                               this.dispatch( X.Event.BEFORE_KILL_INSTANCE );\r
+                               this.dispatch( X.Event.KILL_INSTANCE );\r
+                               this._listeners && this.unlisten();\r
+                       } else\r
                        if( X.Type.isFunction( instance.onKill ) && instance.onKill() === false && !def.isPrivate ){\r
                                return;\r
                        };\r
+                       \r
                        for( p in instance ){\r
                                if( instance.hasOwnProperty && !instance.hasOwnProperty( p ) ) continue;\r
                                delete instance[ p ];\r
@@ -123,7 +141,11 @@ X.Class = ( function(){
                                if( i !== -1 ){\r
                                        data            = X.Class._getPrivate( instance );\r
                                        killPrivateFlag = true;\r
-                                       data.kill();\r
+                                       if( data._dispatching && data.instanceOf( X.EventDispatcher ) ){\r
+                                               data._killReserved = true;\r
+                                       } else {\r
+                                               data.kill();\r
+                                       };\r
                                        def.dataList.splice( i, 1 );\r
                                        def.userList.splice( i, 1 );\r
                                };\r
index 2ee67e3..42b5157 100644 (file)
@@ -58,9 +58,11 @@ X.Timer = {
        requestID      : 0,\r
        \r
        _loop : function(){\r
-               var next = X.Timer.next,\r
-                       list = X.Timer.TICKET_LIST,\r
-                       i    = list.length,\r
+               var next  = X.Timer.next,\r
+                       list  = X.Timer.TICKET_LIST,\r
+                       i     = 0,\r
+                       l     = list.length,\r
+                       start = X.getTime(),\r
                        q, f, c, r;\r
                \r
                if( X.Timer.busy ){\r
@@ -69,8 +71,8 @@ X.Timer = {
                \r
                X.Timer.busy = true;\r
                \r
-           for( ; i; ){\r
-               q = list[ --i ];\r
+           for( ; i < l; ++i ){\r
+               q = list[ i ];\r
                        if( 0 < ( q.last -= next ) ) continue;\r
                        c = q.count;\r
                        \r
@@ -83,10 +85,17 @@ X.Timer = {
                        \r
                        if( r & X.Callback.UN_LISTEN || c === 1 ){\r
                                list.splice( i, 1 );\r
+                               --i;\r
+                               --l;\r
                                continue;\r
                        } else\r
                        if( 1 < c ) --q.count;\r
                        q.last = q.time;\r
+                       \r
+                       if( start < X.getTime() ){\r
+                               console.log( '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@' );\r
+                               break;\r
+                       };\r
            };\r
            X.Timer.timerId = 0;\r
            X.Timer.busy = false;\r
index f9fa5c1..152c63e 100644 (file)
  */\r
 \r
 X.Event = {\r
-       COMPLETE      : 1,\r
-       SUCCESS       : 2,\r
-       ERROR         : 3,\r
-       PROGRESS      : 4,\r
-       BEFORE_CANCEL : 5,\r
-       CANCELED      : 6,\r
-       TIMEOUT       : 7,\r
-       // BEFORE_KILL_INSTANCE\r
-       // KILL_INSTANCE_CANCELED\r
-       _LAST_EVENT   : 7\r
+       COMPLETE               :  1,\r
+       SUCCESS                :  2,\r
+       ERROR                  :  3,\r
+       PROGRESS               :  4,\r
+       BEFORE_CANCEL          :  5,\r
+       CANCELED               :  6,\r
+       TIMEOUT                :  7,\r
+       BEFORE_KILL_INSTANCE   :  8,\r
+       KILL_INSTANCE          :  9,\r
+       KILL_INSTANCE_CANCELED : 10,\r
+       _LAST_EVENT            : 10\r
 };\r
 \r
 // ------------------------------------------------------------------------- //\r
-// --- define / local variables -------------------------------------------- //\r
+// ------------ local variables -------------------------------------------- //\r
 // ------------------------------------------------------------------------- //\r
 var x_eventdispatcher_once       = false,\r
        x_eventdispatcher_needsIndex = false,\r
@@ -66,20 +67,27 @@ if( document.layers ){
        \r
 };\r
 \r
+// ------------------------------------------------------------------------- //\r
+// --- interface ----------------------------------------------------------- //\r
+// ------------------------------------------------------------------------- //\r
+\r
 /**\r
  * イベントターゲットをラップする場合(widnow, document, Image, XHR 等)、通常は new 時に渡します。参照:コンストラクタ実体 {@link X.EventDispatcher.Constructor}\r
  * アプリケーション独自のイベントをやり取りしたいだけ、という場合、イベントターゲットは不要です。\r
- * @constructor\r
+ * @class\r
  * @classdesc EventTarget オブジェクトをラップしたり、アプリケーションで独自に定義したイベントを発信するためのクラスです。\r
- * listen, unlisten, dispatch という addEventListener, removeEventListener, dispatchEvent に対応する関数を持ちます。さらに listening という as3 の hasEventListener に相当する関数を持ちます。\r
- * as3 の EventDispatcher に相当する機能に加え、イベントターゲットオブジェクト(widnow, document, HTMLElement, XHR 等)が設定されていた場合に、それらへ実際のイベント登録・解除も行います。\r
- * このイベントの登録・解除はクロスブラウザ対策が施されていて、IE5~8の独自イベントの差異を吸収し、DOM0 に対しても複数のイベントリスナを登録します。\r
- * さらに、コールバックに対して、this コンテキストや、追加の引数を指定できます。 this コンテキストを指定しなかった場合、EventDispatcher インスタンスがコールバック関数の this になります。 \r
- * @param {object=} opt_argument \r
+ *     listen, unlisten, dispatch という addEventListener, removeEventListener, dispatchEvent に対応する関数を持ちます。\r
+ *     さらに listening という as3 の hasEventListener に相当する関数を持ちます。\r
+ *     イベントターゲットオブジェクト(widnow, document, HTMLElement, XHR 等)が _rawObject に設定されていた場合に、それらへ実際のイベント登録・解除も行います。\r
+ *     このイベントの登録・解除はクロスブラウザで、IE5~8 の独自イベントの差異を吸収し、DOM0 に対しても複数のコールバックを登録することができます。\r
+ *     またコールバックに対して、this コンテキストや、追加の引数を指定もできます。 this コンテキストを指定しなかった場合、EventDispatcher インスタンスがコールバックの this になります。 \r
+ * @param {object=} opt_rawObject\r
  */\r
 X.EventDispatcher =\r
        X.Class.create(\r
                'EventDispatcher',\r
+               \r
+       /** @lends {X.EventDispatcher.prototype} */\r
                {\r
 \r
            /**\r
@@ -91,9 +99,9 @@ X.EventDispatcher =
                 * イベントリスナをイベント名(string)や数値(1~,フレームワーク内で定義)をキーとするArrayで記憶します。\r
                 * Arrayには、{k:種類,x:コンテキスト(thisObject),f:関数,s:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。\r
                 * @private\r
-                * @type {Object.<(number|string), Array.<(callbackDef|function)>>}\r
+                * @type {Object.<(number|string), Array.<(callbackHash|function)>>}\r
                 */\r
-                       _listeners    : null,\r
+                       '_listeners'    : null,\r
 \r
                /**\r
                 * _rawObject には HTMLElement, window, document, XHR といったイベントターゲットオブジェクトを設定します。\r
@@ -103,22 +111,56 @@ X.EventDispatcher =
                 * @private\r
                 * @type {Object}\r
                 */\r
-                       _rawObject    : null,\r
-                       _handleEvent  : null,\r
+                       '_rawObject'    : null,\r
+               \r
+               /**\r
+                * _rawObject がある場合、イベントターゲットオブジェクトに対して addEventListener, attachEvent, onXX 時に実際に渡される関数。\r
+                * イベントタイプが変わっても、単一の オブジェクトを使いまわす。(但し例外は、IE8以下の XHR|MSXML に対して。)最初の listen で生成されて、最後の unlisten で削除される。\r
+                * @private\r
+                * @type {X.Callback}\r
+                */\r
+                       '_handleEvent'  : null,\r
                        \r
-                       _dispatching  : 0,     // dispatch 中の unlisten で使用\r
-                       _unlistens    : null,  // dispatch 中の unlisten で使用\r
-                       _reserves     : null,  // dispatch中に unlisten されたイベントリスナ\r
-                       _killReserved : false,\r
+               /*\r
+                * dispatch 中に dispatch が呼ばれた際に、そのネストの深さを保存する。\r
+                * dispatch() 終了時に _dispatching が 0 の場合に、現在のインスタンスの dispatch がすべて終わったことになる。\r
+                * @private\r
+                * @type {number}\r
+                */\r
+                       '_dispatching'  : 0,     // dispatch 中の unlisten で使用\r
+\r
+               /*\r
+                * dispatch 中に listen が呼ばれた場合に、配列のindexがずれることを避けるため、一旦保持する。\r
+                * _dispatching が 0 のときに _reserves を使って listen() を呼び出す。\r
+                * @private\r
+                * @type {Object.<(number|string), Array.<(X.Callback|function)>>}\r
+                */\r
+                       '_reserves'     : null,\r
+               \r
+               /*\r
+                * dispatch 中に unlisten が呼ばれた場合に、配列のindexがずれることを避けるため、一旦保持する。\r
+                * _dispatching が 0 のときに _unlistens を使って unlisten() を呼び出す。\r
+                * @private\r
+                * @type {Object.<(number|string), Array.<(X.Callback|function)>>}\r
+                */\r
+                       '_unlistens'    : null,\r
+                       \r
+               /*\r
+                * dispatch 中に kill が呼ばれた場合に、X.EventDispatcher インスタンスの削除を dispatch 後にずらすために立てるフラグ。\r
+                * @private\r
+                * @type {boolean}\r
+                */\r
+                       '_killReserved' : false,\r
                        \r
            /**\r
             * X.EventDispatcher のコンストラクタの実体。\r
-            * @private\r
+            * @constructs\r
             * @this {X.EventDispatcher}\r
+            * @params {object=} opt_rawObject\r
             */\r
-                       Constructor : function( rawObject ){\r
-                               if( rawObject ){\r
-                                       this._rawObject = rawObject;\r
+                       Constructor : function( opt_rawObject ){\r
+                               if( opt_rawObject ){\r
+                                       this._rawObject = opt_rawObject;\r
                                };\r
                        },\r
 \r
@@ -126,32 +168,55 @@ X.EventDispatcher =
             * \r
             * @this {X.EventDispatcher}\r
             */\r
-                       on     : x_eventdispatcher_on,\r
-                       listen : x_eventdispatcher_on,\r
-                       \r
-                       listenOnce : function( type, arg1, arg2, arg3 ){\r
+                       on     : x_eventdispatcher_listen,\r
+                       listen : x_eventdispatcher_listen,\r
+               \r
+               /**\r
+                * 一度 dispatch された時に自動で unlisten されるフラグを立てて listen する。\r
+                * @this {X.EventDispatcher}\r
+                * @return {X.EventDispatcher}\r
+                * @param {(string|number|Array.<(string,number)>)} type\r
+                * @param {(listener|function|Array)=} opt_arg1\r
+                * @param {(function|Array=} opt_arg2\r
+                * @param {Array=} opt_arg3\r
+                */\r
+                       listenOnce : function( type, opt_arg1, opt_arg2, opt_arg3 ){\r
                                x_eventdispatcher_once = true;\r
-                               this.listen( type, arg1, arg2, arg3 );\r
+                               this.listen( type, opt_arg1, opt_arg2, opt_arg3 );\r
                                x_eventdispatcher_once = false;\r
                                return this;\r
                        },\r
                        \r
-                       off      : x_eventdispatcher_off,\r
-                       unlisten : x_eventdispatcher_off,\r
-                       \r
-                       listening : function( type, arg1, arg2, arg3 ){\r
+                       off      : x_eventdispatcher_unlisten,\r
+                       unlisten : x_eventdispatcher_unlisten,\r
+\r
+               /**\r
+                * イベントリスナの登録状況を真偽値で返す。戻り値が数値(index)の場合もあるが、これは内部のみで使用。\r
+                * listening() と type を省略した場合、一つでも登録があれば true を返す。\r
+                * listening( type ) と type だけを与えた場合、その type に登録があれば true を返す。\r
+                * type と イベントリスナの組み合わせが登録されているかを調べる場合は、listen 時の thisObject や args(Array) も一致させて渡す必要がある。\r
+                *  this.listen( [ 'myevent', 'yourevent' ], this, onMyEvent, args = [ 1, 'a' ] );\r
+                *  this.listening( 'myevent', this, onMyEvent, args ) === true;\r
+                * @this {X.EventDispatcher}\r
+                * @return {(number|boolean)}\r
+                * @param {(string|number)=} opt_type\r
+                * @param {(listener|function|Array)=} opt_arg1\r
+                * @param {(function|Array=} opt_arg2\r
+                * @param {Array=} opt_arg3\r
+                */                     \r
+                       listening : function( opt_type, opt_arg1, opt_arg2, opt_arg3 ){\r
                                var list = this._listeners, unlistens, i, f, hash;\r
-                               if( type === undefined ) return !!list;\r
-                               if( !list || !( list = list[ type ] ) ) return false;\r
-                               if( arg1 === undefined ) return true;\r
+                               if( opt_type === undefined ) return !!list;\r
+                               if( !list || !( list = list[ opt_type ] ) ) return false;\r
+                               if( opt_arg1 === undefined ) return true;\r
                                \r
-                               if( arg1.k ){\r
-                                       hash = arg1;\r
+                               if( opt_arg1.k ){\r
+                                       hash = opt_arg1;\r
                                } else {\r
-                                       hash = X.Callback._classifyCallbackArgs( arg1, arg2, arg3, this );\r
+                                       hash = X.Callback._classifyCallbackArgs( opt_arg1, opt_arg2, opt_arg3, this );\r
                                };\r
                                \r
-                               if( ( unlistens = this._unlistens ) && ( unlistens = unlistens[ type ] ) ){\r
+                               if( ( unlistens = this._unlistens ) && ( unlistens = unlistens[ opt_type ] ) ){\r
                                        for( i = unlistens.length; i; ){\r
                                                f = unlistens[ --i ];\r
                                                if( f === hash || ( f.x === hash.x && f.f === hash.f && f.s === hash.s ) ) return false;\r
@@ -163,30 +228,28 @@ X.EventDispatcher =
                                };\r
                                return false;\r
                        },\r
-                       /*\r
-                        * dispatch 中に dispatch が呼ばれるケースがあるため、\r
-                        * _dispatching では その深さを保存する\r
-                        * _dispatching が 0 のときに unlistens を削除する\r
-                        *\r
-                        */\r
+\r
+               /**\r
+                * 登録されたイベントリスナを呼び出す。イベントリスナの返り値(数値)を OR したものを返す。\r
+                * @this {X.EventDispatcher}\r
+                * @return {number}\r
+                * @param {(eventHash|string|number)} e\r
+                */     \r
                        dispatch : function( e ){\r
                                // dispatch 中の listen は?\r
-                               var list  = this._listeners,\r
+                               var list  = this[ '_listeners' ],\r
                                        ret   = X.Callback.NONE,\r
-                                       type  = e.type,\r
+                                       type  = e[ 'type' ],\r
                                        unlistens, i, l, f, r, sysOnly;\r
                                \r
-                               if( !list ) return ret;\r
+                               if( !list || !( list = list[ type || e ] ) ) return ret;\r
                                \r
                                // 数値, 文字が渡された場合\r
                                if( !type ){\r
-                                       type = e;\r
-                                       e = { type : type };\r
+                                       e = { type : type = e };\r
                                };\r
                                e.target = e.target || this;\r
                                \r
-                               if( !( list = list[ type ] ) ) return ret;\r
-                               \r
                                ++this._dispatching;\r
                                \r
                                // todo:\r
@@ -257,82 +320,101 @@ X.EventDispatcher =
                                \r
                                return ret;\r
                        },\r
-                       \r
-                       onKill : function(){\r
-                               if( this._dispatching ){\r
-                                       this._killReserved = true;\r
-                                       return false;\r
-                               };\r
-                               this._listeners && this.unlisten();\r
-                       },\r
-                       \r
+\r
+               /**\r
+                * delay(ミリ秒)後にイベントを dispatch する。戻り値は uid = X.Timer.add() のタイマーID(数値)。X.Timer.remove(uid) でタイマーを解除して dispatch を中止できる。\r
+                * @this {X.EventDispatcher}\r
+                * @return {number}\r
+                * @param {number=} delay\r
+                * @param {(eventHash|string|number)=} e\r
+                */                     \r
                        asyncDispatch : function( delay, e ){\r
                                return X.Timer.add( delay, 1, this, this.dispatch, [ e ] );\r
                        }\r
                }\r
        );\r
 \r
+// ------------------------------------------------------------------------- //\r
+// --- implements ---------------------------------------------------------- //\r
+// ------------------------------------------------------------------------- //\r
 \r
-// --- implements ------------------------------------------\r
-function x_eventdispatcher_on( type, arg1, arg2, arg3 ){\r
+/**\r
+ * \r
+ * @this {X.EventDispatcher}\r
+ * @return {X.EventDispatcher}\r
+ * @param {(string|number|Array.<(string,number)>)} type\r
+ * @param {(listener|function|Array)=} opt_arg1\r
+ * @param {(function|Array=} opt_arg2\r
+ * @param {Array=} opt_arg3\r
+ */\r
+function x_eventdispatcher_listen( type, opt_arg1, opt_arg2, opt_arg3 ){\r
        var list = this._listeners,\r
                i, r, f;\r
        \r
        if( this._dispatching ){\r
                if( !this._reserves ) this._reserves = [];\r
-               this._reserves[ this._reserves.length ] = [ type, arg1, arg2, arg3, x_eventdispatcher_once ];\r
+               this._reserves[ this._reserves.length ] = [ type, opt_arg1, opt_arg2, opt_arg3, x_eventdispatcher_once ];\r
                return this;\r
        };\r
        \r
        if( X.Type.isArray( type ) ){\r
                for( i = type.length; i; ){\r
-                       this.listen( type[ --i ], arg1, arg2, arg3 );\r
+                       this.listen( type[ --i ], opt_arg1, opt_arg2, opt_arg3 );\r
                };\r
                return this;\r
        };\r
        \r
        ( !list || !list[ type ] ) && X.Type.isString( type ) && x_eventdispatcher_actualAddEvent( this, type );\r
        \r
-       if( this.listening( type, arg1, arg2, arg3 ) ) return this;\r
+       if( this.listening( type, opt_arg1, opt_arg2, opt_arg3 ) ) return this;\r
 \r
        if( !list ) list = this._listeners = {};\r
        if( !( list = list[ type ] ) ) list = this._listeners[ type ] = [];\r
        \r
-       f = X.Callback._classifyCallbackArgs( arg1, arg2, arg3, this );\r
+       f = X.Callback._classifyCallbackArgs( opt_arg1, opt_arg2, opt_arg3, this );\r
        list[ list.length ] = f;\r
        f.once = x_eventdispatcher_once;\r
        \r
        return this;\r
 };\r
 \r
-function x_eventdispatcher_off( type, arg1, arg2, arg3 ){\r
+/**\r
+ * \r
+ * @this {X.EventDispatcher}\r
+ * @return {X.EventDispatcher}\r
+ * @param {(string|number|Array.<(string,number)>)=} opt_type\r
+ * @param {(listener|function|Array)=} opt_arg1\r
+ * @param {(function|Array=} opt_arg2\r
+ * @param {Array=} opt_arg3\r
+ */\r
+function x_eventdispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){\r
        var list = this._listeners,\r
                _list, reserves, unlistens, i, f;\r
        if( !list ) return this;\r
        \r
-       if( X.Type.isArray( type ) ){\r
-               for( i = type.length; i; ){\r
-                       this.unlisten( type[ --i ], arg1, arg2, arg3 );\r
+       if( X.Type.isArray( opt_type ) ){\r
+               for( i = opt_type.length; i; ){\r
+                       this.unlisten( opt_type[ --i ], opt_arg1, opt_arg2, opt_arg3 );\r
                };\r
                return this;\r
        };\r
        \r
-       if( type === undefined ){\r
+       if( opt_type === undefined ){\r
                // 全て削除\r
-               for( type in list ){\r
-                       _list = list[ type ];\r
+               for( opt_type in list ){\r
+                       _list = list[ opt_type ];\r
                        for( i = _list.length; i; ){\r
-                               this.unlisten( type, _list[ --i ] ); // override されていることがあるので、必ず unlisten を使用\r
+                               this.unlisten( opt_type, _list[ --i ] ); // override されていることがあるので、必ず unlisten を使用\r
                        };\r
-                       // this.unlisten( type ); これは無茶!\r
+                       // this.unlisten( opt_type ); これは無茶!\r
                };\r
                return this;\r
        } else\r
-       if( arg1 === undefined ){\r
+       if( opt_arg1 === undefined ){\r
                // 同一タイプを全て削除\r
-               if( _list = list[ type ] ){\r
+               if( _list = list[ opt_type ] ){\r
                        for( i = _list.length; i; ){\r
-                               this.unlisten( type, _list[ --i ] ); // override されていることがあるので、必ず unlisten を使用\r
+                               this.unlisten( opt_type, _list[ --i ] ); // override されていることがあるので、必ず unlisten を使用\r
                        };\r
                };\r
                return this;\r
@@ -340,7 +422,7 @@ function x_eventdispatcher_off( type, arg1, arg2, arg3 ){
        if( reserves = this._reserves ){\r
                for( i = reserves.length; i; ){\r
                        f = reserves[ --i ];\r
-                       if( f[ 0 ] === type && f[ 1 ] === arg1 && f[ 2 ] === arg2 && f[ 3 ] === arg3 ){\r
+                       if( f[ 0 ] === opt_type && f[ 1 ] === opt_arg1 && f[ 2 ] === opt_arg2 && f[ 3 ] === opt_arg3 ){\r
                                reserves.splice( i, 1 );\r
                                if( !reserves.legth ) delete this._reserves;\r
                                return this;\r
@@ -349,22 +431,22 @@ function x_eventdispatcher_off( type, arg1, arg2, arg3 ){
        };\r
        \r
        x_eventdispatcher_needsIndex = true;\r
-       i = this.listening( type, arg1, arg2, arg3 );\r
+       i = this.listening( opt_type, opt_arg1, opt_arg2, opt_arg3 );\r
        x_eventdispatcher_needsIndex = false;\r
        if( i === false ) return this;\r
 \r
-       f = ( _list = list[ type ] )[ i ];\r
+       f = ( _list = list[ opt_type ] )[ i ];\r
        if( unlistens = this._unlistens ){\r
-               ( unlistens = unlistens[ type ] ) ?\r
+               ( unlistens = unlistens[ opt_type ] ) ?\r
                        ( unlistens[ unlistens.length ] = f ) :\r
-                       ( this._unlistens[ type ] = [ f ] );\r
+                       ( this._unlistens[ opt_type ] = [ f ] );\r
        } else {\r
                delete f.once;\r
                // f.kill === X.Callback._kill && f.kill();\r
                _list.splice( i, 1 );\r
                if( !_list.length ){\r
-                       delete this._listeners[ type ];\r
-                       X.Type.isString( type ) && x_eventdispatcher_actualRemoveEvent( this, type );\r
+                       delete this._listeners[ opt_type ];\r
+                       X.Type.isString( opt_type ) && x_eventdispatcher_actualRemoveEvent( this, opt_type );\r
                        if( X.isEmptyObject( this._listeners ) ) delete this._listeners;\r
                };\r
        };\r
index d6f353b..63a799c 100644 (file)
@@ -223,7 +223,7 @@ X.Dom = X.Class._override(
                                 */\r
                                X.Dom.asyncDispatch( 0, { type : type, w : X.Dom.w, h : X.Dom.h } );\r
                        };\r
-                       return x_eventdispatcher_on.apply( X.Dom, arguments );\r
+                       return x_eventdispatcher_listen.apply( X.Dom, arguments );\r
                },\r
                \r
                getPointerPosition : function(){\r
index 8d8d309..f4acbf8 100644 (file)
@@ -1089,11 +1089,9 @@ Node.prototype._updateRawNode =
                                                        continue;\r
                                                };\r
                                        };\r
-\r
+                                       k === 'type' && alert( this._dirty + ' ' + elm.outerHTML );\r
                                        ( v = attrs[ k ] ) === undefined ?\r
                                                elm.removeAttribute( rename[ k ] || k ) :\r
-                                       X.UA.IE === 8 ?\r
-                                               elm.setAttribute( rename[ k ] || k, X.Dom.Attr.noValue[ k ] ? k : v ) :\r
                                                ( elm[ rename[ k ] || k ] = X.Dom.Attr.noValue[ k ] ? k : v );                          \r
 \r
                                };\r
@@ -1360,7 +1358,7 @@ Node.prototype._actualRemove =
                                this._attrs.value = elm.value;\r
                        };\r
                        elm.removeAttribute( 'id' ); // ?\r
-                       document.all[ this._id || ( 'ie4uid' + this._uid ) ] = null; // MacIE5 でエラー\r
+                       //document.all[ this._id || ( 'ie4uid' + this._uid ) ] = null; // MacIE5 でエラー\r
                        if( !isChild ) elm.outerHTML = '';\r
                        delete this._rawObject;\r
                }) :\r
index 86cd3f6..840bfa7 100644 (file)
@@ -147,6 +147,7 @@ X.Dom.Node.prototype.attr = function( nameOrObj /* v */ ){
 };\r
 X.Dom.Node.prototype._setAttr = function( attrs, newAttrs, name, v ){\r
        switch( name ){\r
+               // case 'type' : TODO IE は input, button に対して type の再設定が出来ない _state が要素生成済なら不可\r
                case 'UID' :\r
                case 'tag' :\r
                case 'tagName' :\r
index e5e0b94..bae6a2d 100644 (file)
@@ -1083,6 +1083,7 @@ X.Dom.Node.prototype._getCharSize =
                        if( this._fontSize ) return this._fontSize;
                        return this._fontSize = parseFloat( getComputedStyle( this._rawObject, null ).fontSize );
                }) :
+
        document.defaultView && document.defaultView.getComputedStyle ?
                (function(){
                        Node._body._updateTimerID && Node._body._startUpdate();
@@ -1090,7 +1091,16 @@ X.Dom.Node.prototype._getCharSize =
                        if( this._fontSize ) return this._fontSize;
                        return this._fontSize = parseFloat( document.defaultView.getComputedStyle( this._rawObject, null ).fontSize );
                }) :
-       X.UA.IE && 5.5 <= X.UA.IE ?
+
+
+
+
+
+
+
+
+
+       5.5 <= X.UA.IE ?
                (function(){
                        var font, vu, v, u, _v;
                        Node._body._updateTimerID && Node._body._startUpdate();
index e3ba959..d1d417f 100644 (file)
@@ -100,19 +100,20 @@ X.Dom.Image = {
                        abspath : null,\r
                        delay   : null,\r
                        timeout : 0,\r
+                       \r
                        Constructor : function( abspath, delay, timeout ){\r
                                var img;\r
-                               \r
+\r
                                this.abspath = abspath;\r
                                this.delay   = delay || 100;\r
                                this.timeout = timeout || 10000;\r
                                this.xnode =\r
                                        (\r
                                                window[ 'Image' ] ?\r
-                                                       X.Dom.Node( img = new Image() ) :\r
+                                                       X.EventDispatcher( img = new Image() ) :\r
                                                        X.Dom.Node._systemNode.create( 'img', { src : abspath } )\r
                                        )\r
-                                       .listen( [ 'load', 'error', 'abort', X.Event.SUCCESS, X.Event.ERROR ], this );\r
+                                       .listen( [ 'load', 'error', 'abort', X.Event.SUCCESS, X.Event.ERROR, X.Event.KILL_INSTANCE ], this );\r
                                img && ( img.src = abspath );\r
                                this._detect();\r
                        },\r
@@ -134,7 +135,7 @@ X.Dom.Image = {
                                                        this.timerID = this.asyncDispatch( 0, { type : X.Event.ERROR } );\r
                                                        return;\r
                                                };\r
-                                               size = X.Dom.Image.getActualDimension( X.UA.IE && X.UA.IE < 9 && window.Image ? this.abspath : this.xnode );\r
+                                               size = X.Dom.Image.getActualDimension( X.UA.IE < 9 ? this.abspath : this.xnode );\r
                                                this.timerID = this.asyncDispatch( 0, {\r
                                                        type : X.Event.SUCCESS,\r
                                                        src  : this.abspath,\r
@@ -147,6 +148,11 @@ X.Dom.Image = {
                                                delete this.timerID;\r
                                                X.Timer.once( 0, this, this.kill );\r
                                                break;\r
+                                       case X.Event.KILL_INSTANCE :\r
+                                               this.timerID && X.Timer.remove( this.timerID );\r
+                                               this.xnode.destroy && this.xnode.destroy();\r
+                                               this.unlisten();\r
+                                               break;\r
                                };\r
                        },      \r
                        _detect : function(){\r
@@ -169,11 +175,6 @@ X.Dom.Image = {
                                \r
                                // this.dispacth( { type : X.Event.CANCELED } );\r
                                this.kill();\r
-                       },\r
-                       onKill : function(){\r
-                               this.timerID && X.Timer.remove( this.timerID );\r
-                               this.xnode.destroy();\r
-                               this.unlisten();\r
                        }\r
                }\r
        )\r
index bf6cd4e..9a017e7 100644 (file)
@@ -355,8 +355,9 @@ X.Dom._bindElementToXnode =
                                                        if( tag.charAt( 0 ) === '/' ) tag = tag.slice( 1 );\r
                                                        xnode._tag = tag;\r
                                                //};\r
-                                               xnode._root = parent._root;\r
-                                               elm.UID     = xnode._uid;\r
+                                               xnode._root   = parent._root;\r
+                                               xnode._dirty  = 0;\r
+                                               elm.UID       = xnode._uid;\r
                                                current.xtext = null;\r
                                                \r
                                                if( tag === 'TEXTAREA' ){\r
@@ -406,8 +407,9 @@ X.Dom._bindElementToXnode =
                                \r
                                ++current.j;\r
                                xnode._rawObject = elm;\r
-                               xnode._text    = elm.data; // 正確\r
-                               xnode._root    = parent._root;\r
+                               xnode._dirty     = 0;\r
+                               xnode._text      = elm.data; // 正確\r
+                               xnode._root      = parent._root;\r
                                if( !skipCleanup ){\r
                                        if( !( text = xnode._text ) || ( text = X.Dom.cleanupWhiteSpace( text ) ) === ' ' ){\r
                                                console.log( '[' +parent._tag + '>' + xnode._uid + '] destroy ... ' );\r
@@ -487,7 +489,8 @@ X.Dom._bindElementToXnode =
                                        ++current.j;\r
                                        \r
                                        xnode._rawObject = elm;\r
-                                       xnode._root    = parent._root;\r
+                                       xnode._dirty     = 0;\r
+                                       xnode._root      = parent._root;\r
                                        //xnode._tag     = X.Dom.DTD.TAG_FIX[ tag ] || tag;\r
                                        if( X.Dom._isCleanupTarget( elm ) ){ //!xnode.hasClass( 'skip-cleanup' ) && ( X.Dom.cleanupTagNames[ tag ] || xnode.hasClass( 'cleanup-target' ) ) ){\r
                                                xnode.destroy();\r
index 1c29ab9..be7926f 100644 (file)
@@ -780,12 +780,12 @@ X.UI._AbstractUINode = X.EventDispatcher.inherits(
                        };\r
                        f = X.Callback._classifyCallbackArgs( arg1, arg2, arg3 );\r
                        if( !f.k ){\r
-                               return x_eventdispatcher_on.apply( this, [ type, this.User, f ] );\r
+                               return x_eventdispatcher_listen.call( this, type, this.User, f );\r
                        } else\r
                        if( f.k === X.Callback._FUNC_ONLY ){\r
-                               return x_eventdispatcher_on.apply( this, [ type, this.User, f.f, f.s ] );\r
+                               return x_eventdispatcher_listen.call( this, type, this.User, f.f, f.s );\r
                        };\r
-                       return x_eventdispatcher_on.apply( this, arguments );\r
+                       return x_eventdispatcher_listen.apply( this, arguments );\r
                },\r
                unlisten : function( type, arg1, arg2, arg3 ){\r
                        var root, events, i, ev, counter, f;\r