OSDN Git Service

Version 0.6.73, move ._rawNode from X.Dom.Event to X.EventDispatcher.
authoritozyun <itozyun@user.sourceforge.jp>
Wed, 3 Sep 2014 22:12:26 +0000 (07:12 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Wed, 3 Sep 2014 22:12:26 +0000 (07:12 +0900)
0.6.x/js/00_core/01_XUa.js
0.6.x/js/00_core/02_XType.js
0.6.x/js/00_core/04_XClass.js
0.6.x/js/00_core/06_XEventDispatcher.js
0.6.x/js/00_core/07_XNotification.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/12_XDomEvent.js
0.6.x/js/01_dom/15_XDomStyle.js
0.6.x/js/10_ui/06_AbstractUINode.js
0.6.x/js/10_ui/15_ScrollBox.js

index 04bf643..a9e659b 100644 (file)
@@ -184,9 +184,11 @@ X.UA = (function( n, undefined ){
                console.log( '>> Webkit : ' + acme.WebKit + ' Safari : ' + acme.Safari );\r
        };\r
        \r
+       // TODO 3DS, DSi, WiiU\r
+       \r
        // Mozilla/5.0 (Android; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/9.0 Fennec/9.0\r
        if( ( i = dua.toLowerCase().indexOf( 'android' ) ) !== -1 ){\r
-               acme.Android = parseFloat( dua.substr( i + 8 ) ) || 1.5;\r
+               acme.Android = parseFloat( dua.substr( i + 8 ) ) || 0;\r
                console.log( '>> Android : ' + acme.Android );\r
        } else\r
        if( dua.indexOf( 'iPhone;' ) !== -1 || dua.indexOf( 'iPad;' ) !== -1 || dua.indexOf( 'iPod;' ) !== -1 ){\r
index c8e1980..1861709 100644 (file)
@@ -35,7 +35,7 @@ X.Type = {
        },\r
        \r
        isNumber : function( v ){\r
-               return typeof v === 'number'; v !== v || v + 0 === v;\r
+               return typeof v === 'number'; // v !== v || v + 0 === v;\r
        },\r
        \r
        isFinite : function( v ){\r
index f4497b0..2de9d36 100644 (file)
@@ -17,8 +17,9 @@ X.Class = ( function(){
                CONSTRUCTOR        = 'Constructor',\r
                killPrivateFlag    = false,\r
                traits             = null,\r
+               useObjectCreate    = false, // !!Object.create, http://jsperf.com/prototype-vs-object-create-perf\r
                use__proto__       = !!X.emptyFunction.prototype.__proto__;\r
-       \r
+       _DEF_LIST = DEF_LIST;\r
        /* サブクラスを作るメソッド  \r
         * var subClass = superClass.inherits( ... ) \r
         * http://d.hatena.ne.jp/m-hiyama/20051018/1129605002\r
@@ -47,7 +48,8 @@ X.Class = ( function(){
                if( X.Type.isNumber( classSetting ) ){\r
                        args.shift();\r
                } else {\r
-                       classSetting = superDef.setting;\r
+                       // クラス設定がない場合、親からコピーして、Abstract flag は落とす??\r
+                       classSetting = superDef.setting;// &= ~X.Class.ABSTRACT;\r
                };\r
                if( superDef.isPrivate ) classSetting = classSetting | X.Class.PRIVATE_DATA;\r
                opt_super = !!( classSetting & X.Class.SUPER_ACCESS );\r
@@ -63,6 +65,9 @@ X.Class = ( function(){
                params.push( args[ 0 ] ); /* props サブクラスでは未定義でも可 */\r
                \r
                // 継承クラスの作成\r
+               if( useObjectCreate ){\r
+                       traits = Object.create( Super.prototype );\r
+               } else\r
                if( use__proto__ ){\r
                        traits = Super.prototype;\r
                } else {\r
@@ -84,7 +89,10 @@ X.Class = ( function(){
                return klass;\r
        };\r
        \r
-       /* X.Class.create で作られたクラスのインスタンスが共通で備えるメソッド */\r
+       /* X.Class.create で作られたクラスのインスタンスが共通で備えるメソッド \r
+        *\r
+        *\r
+        */\r
        var CommonProps = {\r
                kill : function(){\r
                        var instance = this,\r
@@ -155,7 +163,11 @@ X.Class = ( function(){
                        return;\r
                };\r
                klass.__new = null;\r
-               instance = def.pool && def.pool.length > 0 ? def.pool.pop() : new klass();\r
+               instance = def.pool && def.pool.length > 0 ?\r
+                                               def.pool.pop() :\r
+                                       useObjectCreate ?\r
+                                               Object.create( klass.prototype ) :\r
+                                               new klass();\r
                klass.__new = C;\r
                if( def.isPrivate === true ){\r
                        userDef = X.Class._getClassDef( dataUser );\r
@@ -175,7 +187,7 @@ X.Class = ( function(){
                                def[ CONSTRUCTOR ].apply( instance, args ) :\r
                        def.SuperConstructor &&\r
                                def.SuperConstructor.apply( instance, args );\r
-               if( X.Type.isObject( obj ) ){\r
+               if( X.Type.isObject( obj ) && obj !== instance ){\r
                        instance.kill();\r
                        return obj;\r
                };\r
@@ -257,6 +269,10 @@ X.Class = ( function(){
                        klass.superClassOf = X.Class._superClassOf;\r
                        klass.subClassOf   = X.Class._subClassOf;\r
                        \r
+                       if( useObjectCreate ){\r
+                               klass.prototype = X.Class._override( X.Class._override( traits || klass.prototype, props, true ), CommonProps, false );\r
+                               klass.prototype.constructor = klass;\r
+                       } else\r
                        if( use__proto__ ){\r
                                X.Class._override( klass.prototype, props, true );\r
                                if( traits ){\r
index 067e217..b1134d7 100644 (file)
@@ -1,4 +1,10 @@
 /**\r
+ * X.EventDispatcher\r
+ * \r
+ *  1. as3 の EventDispatcher ライクなクラス。そのまま使ったり、継承したり。コールバック中にイベントを追加したら?削除したら?にも対処している。\r
+ *  2. _rawObject メンバがいる場合、addEventListener, attachEvent, on 等で生のブラウザオブジェクトにリスナを登録する。\r
+ *     window, document, HTMLElement, Image, XHR などが _rawObject\r
+ * \r
  * use X.Callback\r
  * \r
  * https://developer.mozilla.org/ja/docs/Web/API/EventTarget.addEventListener\r
@@ -19,118 +25,118 @@ X.Event = {
        BEFORE_CANCEL : 5,\r
        CANCELED      : 6,\r
        TIMEOUT       : 7,\r
+       // INSTANCE_KILLED\r
+       // KILL_INSTANCE_CANCELED\r
        _LAST_EVENT   : 7\r
 };\r
 \r
+// --- define / local variables ----------------------------\r
+var x_eventdispatcher_once       = false,\r
+       x_eventdispatcher_needsIndex = false,\r
+       x_eventdispatcher_temp       = {};\r
+\r
+if( X.UA.MacIE ){\r
+       x_eventdispatcher_temp.DOM_W3C    = true;\r
+       x_eventdispatcher_temp.EVENT_DOM0 = true;\r
+} else\r
+if( X.UA.IE4 ){ // ie4 & iemobi4\r
+       x_eventdispatcher_temp.DOM_IE4    = true;\r
+       x_eventdispatcher_temp.EVENT_DOM0 = true;\r
+} else\r
+if( document.getElementById ){\r
+       x_eventdispatcher_temp.DOM_W3C = true;\r
+       if( document.addEventListener ){\r
+               x_eventdispatcher_temp.EVENT_W3C = true;\r
+       } else\r
+       if( document.attachEvent ){\r
+               x_eventdispatcher_temp.EVENT_IE = true;\r
+       } else {\r
+               x_eventdispatcher_temp.EVENT_DOM0 = true;\r
+       };\r
+} else\r
+if( document.all ){\r
+       x_eventdispatcher_temp.DOM_IE4    = true;\r
+       x_eventdispatcher_temp.EVENT_DOM0 = true;\r
+} else\r
+if( document.layers ){\r
+       \r
+} else {\r
+       \r
+};\r
 \r
+/**\r
+ * イベントターゲットをラップする場合(widnow, document, Image, XHR 等)、通常は new 時に渡します。参照:コンストラクタ実体 {@link X.EventDispatcher.Constructor}\r
+ * アプリケーション独自のイベントをやり取りしたいだけ、という場合、イベントターゲットは不要です。\r
+ * @constructor\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
+ */\r
 X.EventDispatcher =\r
        X.Class.create(\r
                'EventDispatcher',\r
                {\r
+\r
+           /**\r
+            * @namespace\r
+            * @memberof X.EventDispatcher\r
+            */\r
+\r
+               /**\r
+                * イベントリスナをイベント名(string)や数値(1~,フレームワーク内で定義)をキーとするArrayで記憶します。\r
+                * Arrayには、{k:種類,x:コンテキスト(thisObject),f:関数,s:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。\r
+                * @private\r
+                * @type {Object.<(number|string), Array.<(callbackDef|function)>>}\r
+                */\r
                        _listeners    : null,\r
-                       _dispatching  : 0, // dispatch 中の unlisten で使用\r
-                       _unlistens    : null, // dispatch 中の unlisten で使用\r
-                       _needsIndex   : false, // listening で index を返す\r
-                       _reserves     : null,\r
+\r
+               /**\r
+                * _rawObject には HTMLElement, window, document, XHR といったイベントターゲットオブジェクトを設定します。\r
+                * _rawObject が設定されていると on(), off() 時に addEventListener(DOM Level2) や detachEvent(ie5~8), on~(DOM0) 等を操作します。\r
+                * _rawObject は最初の on() 前に設定しておかないと addEventListener 等が意図したように行われません。\r
+                * X.Dom.Node では非同期に HTMLElement を生成していて、要素生成以前に on, off を呼び出すことができます。これは適宜に migrateEvent, restoreEvent を呼んで解決しているためです。\r
+                * @private\r
+                * @type {Object}\r
+                */\r
+                       _rawNode      : null,\r
+                       _handleEvent  : null,\r
+                       \r
+                       _dispatching  : 0,     // dispatch 中の unlisten で使用\r
+                       _unlistens    : null,  // dispatch 中の unlisten で使用\r
+                       _reserves     : null,  // dispatch中に unlisten されたイベントリスナ\r
                        _killReserved : false,\r
                        \r
-                       listen : function( type, arg1, arg2, arg3 ){\r
-                               var list = this._listeners,\r
-                                       i, r, f;\r
-                               if( this._dispatching ){\r
-                                       if( !this._reserves ) this._reserves = [];\r
-                                       this._reserves[ this._reserves.length ] = [ type, arg1, arg2, 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
-                                       };\r
-                                       return this;\r
+           /**\r
+            * X.EventDispatcher のコンストラクタの実体。\r
+            * @private\r
+            * @this {X.EventDispatcher}\r
+            */\r
+                       Constructor : function( rawObject ){\r
+                               if( rawObject ){\r
+                                       this._rawNode = rawObject;\r
                                };\r
-                               \r
-                               if( this.listening( type, arg1, arg2, 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
-                               list[ list.length ] = f;\r
-                               f.once = X.EventDispatcher._once;\r
-                               \r
-                               return this;\r
                        },\r
+\r
+           /**\r
+            * \r
+            * @this {X.EventDispatcher}\r
+            */\r
+                       on     : x_eventdispatcher_on,\r
+                       listen : x_eventdispatcher_on,\r
+                       \r
                        listenOnce : function( type, arg1, arg2, arg3 ){\r
-                               X.EventDispatcher._once = true;\r
+                               x_eventdispatcher_once = true;\r
                                this.listen( type, arg1, arg2, arg3 );\r
-                               X.EventDispatcher._once = false;\r
-                               return this;\r
-                       },\r
-                       unlisten : function( type, arg1, arg2, 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
-                                       };\r
-                                       return this;\r
-                               };\r
-                               \r
-                               if( type === undefined ){\r
-                                       // 全て削除\r
-                                       for( type in list ){\r
-                                               _list = list[ type ];\r
-                                               for( i = _list.length; i; ){\r
-                                                       this.unlisten( type, _list[ --i ] ); // override されていることがあるので、必ず unlisten を使用\r
-                                               };\r
-                                               // this.unlisten( type ); これは無茶!\r
-                                       };\r
-                                       return this;\r
-                               } else\r
-                               if( arg1 === undefined ){\r
-                                       // 同一タイプを全て削除\r
-                                       if( _list = list[ type ] ){\r
-                                               for( i = _list.length; i; ){\r
-                                                       this.unlisten( type, _list[ --i ] ); // override されていることがあるので、必ず unlisten を使用\r
-                                               };\r
-                                       };\r
-                                       return this;\r
-                               } else\r
-                               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
-                                                       reserves.splice( i, 1 );\r
-                                                       if( !reserves.legth ) delete this._reserves;\r
-                                                       return this;\r
-                                               };\r
-                                       };\r
-                               };\r
-                               \r
-                               this._needsIndex = true;\r
-                               i = this.listening( type, arg1, arg2, arg3 );\r
-                               delete this._needsIndex;\r
-                               if( i === false ) return this;\r
-\r
-                               f = ( _list = list[ type ] )[ i ];\r
-                               if( unlistens = this._unlistens ){\r
-                                       ( unlistens = unlistens[ type ] ) ?\r
-                                               ( unlistens[ unlistens.length ] = f ) :\r
-                                               ( this._unlistens[ 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
-                                               if( X.isEmptyObject( this._listeners ) ) delete this._listeners;\r
-                                       };\r
-                               };\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
                                var list = this._listeners, unlistens, i, f, hash;\r
                                if( type === undefined ) return !!list;\r
@@ -151,7 +157,7 @@ X.EventDispatcher =
                                };\r
                                for( i = list.length; i; ){\r
                                        f = list[ --i ];\r
-                                       if( f === hash || ( f.x === hash.x && f.f === hash.f && f.s === hash.s ) ) return this._needsIndex ? i : true;\r
+                                       if( f === hash || ( f.x === hash.x && f.f === hash.f && f.s === hash.s ) ) return x_eventdispatcher_needsIndex ? i : true;\r
                                };\r
                                return false;\r
                        },\r
@@ -233,9 +239,9 @@ X.EventDispatcher =
                                        if( list = this._reserves ){\r
                                                for( i = 0, l = list.length; i < l; ++i ){\r
                                                        f = list[ i ];\r
-                                                       X.EventDispatcher._once = f[ 4 ];\r
+                                                       x_eventdispatcher_once = f[ 4 ];\r
                                                        this.listen( f[ 0 ], f[ 1 ], f[ 2 ], f[ 3 ] );\r
-                                                       X.EventDispatcher._once = false;\r
+                                                       x_eventdispatcher_once = false;\r
                                                        f.length = 0;\r
                                                };\r
                                                list.length = 0;\r
@@ -260,9 +266,202 @@ X.EventDispatcher =
                }\r
        );\r
 \r
-X.EventDispatcher.prototype.on  = X.EventDispatcher.prototype.listen;\r
-X.EventDispatcher.prototype.off = X.EventDispatcher.prototype.unlisten;\r
 \r
-X.EventDispatcher._once = false;\r
+// --- implements ------------------------------------------\r
+function x_eventdispatcher_on( type, arg1, arg2, 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
+               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
+               };\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
+\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
+       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
+       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
+               };\r
+               return this;\r
+       };\r
+       \r
+       if( type === undefined ){\r
+               // 全て削除\r
+               for( type in list ){\r
+                       _list = list[ type ];\r
+                       for( i = _list.length; i; ){\r
+                               this.unlisten( type, _list[ --i ] ); // override されていることがあるので、必ず unlisten を使用\r
+                       };\r
+                       // this.unlisten( type ); これは無茶!\r
+               };\r
+               return this;\r
+       } else\r
+       if( arg1 === undefined ){\r
+               // 同一タイプを全て削除\r
+               if( _list = list[ type ] ){\r
+                       for( i = _list.length; i; ){\r
+                               this.unlisten( type, _list[ --i ] ); // override されていることがあるので、必ず unlisten を使用\r
+                       };\r
+               };\r
+               return this;\r
+       } else\r
+       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
+                               reserves.splice( i, 1 );\r
+                               if( !reserves.legth ) delete this._reserves;\r
+                               return this;\r
+                       };\r
+               };\r
+       };\r
+       \r
+       x_eventdispatcher_needsIndex = true;\r
+       i = this.listening( type, arg1, arg2, arg3 );\r
+       x_eventdispatcher_needsIndex = false;\r
+       if( i === false ) return this;\r
+\r
+       f = ( _list = list[ type ] )[ i ];\r
+       if( unlistens = this._unlistens ){\r
+               ( unlistens = unlistens[ type ] ) ?\r
+                       ( unlistens[ unlistens.length ] = f ) :\r
+                       ( this._unlistens[ 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
+                       if( X.isEmptyObject( this._listeners ) ) delete this._listeners;\r
+               };\r
+       };\r
+       return this;\r
+};\r
+\r
+\r
+x_eventdispatcher_actualAddEvent =\r
+       // Days on the Moon DOM Events とブラウザの実装 \r
+       // http://nanto.asablo.jp/blog/2007/03/23/1339502\r
+       // Safari 2 では関数オブジェクトしか EventListener として使えませんが、Safari のナイトリービルドでは handleEvent メソッドを持つオブジェクトも EventListener として使えるようです。\r
+       x_eventdispatcher_temp.EVENT_W3C && ( X.UA.WebKit < 525.13 || X.UA.Opera7 || X.UA.NetFront < 4 ) ? // Safari3-\r
+               (function( that, type ){\r
+                       var raw = that._rawNode;\r
+                       if( !raw ) return;\r
+                       that._handleEvent = that._handleEvent || X.Callback.create( that );\r
+                       type = X.Dom.Event.Rename[ type ] || type;\r
+                       if( raw.addEventListener ){\r
+                               raw.addEventListener( type, that._handleEvent, false );\r
+                       } else {\r
+                               // Safari は Image, Opera7 は window\r
+                               raw[ 'on' + type ] = that._handleEvent;\r
+                       };\r
+               }) :\r
+       x_eventdispatcher_temp.EVENT_W3C ?\r
+               (function( that, type ){\r
+                       that._rawNode && that._rawNode.addEventListener( X.Dom.Event.Rename[ type ] || type, that, false );\r
+               }) :\r
+       x_eventdispatcher_temp.EVENT_IE ?\r
+               (function( that, type ){\r
+                       var raw = that._rawNode;\r
+                       if( !raw ) return;\r
+                       type = X.Dom.Event.Rename[ type ] || type;\r
+                       //if( type === 'load' && that._tag && X.Dom.Event._LOAD_FIX_TAGS[ that._tag ] ){\r
+                       //      type = 'readystatechange';\r
+                       //};\r
+                       that._handleEvent = that._handleEvent || X.Callback.create( that );\r
+                       if( raw.attachEvent ){\r
+                               raw.attachEvent( 'on' + type, that._handleEvent );\r
+                       } else {\r
+                               raw[ 'on' + type ] = that._handleEvent;\r
+                       };\r
+               }) :\r
+               (function( that, type ){\r
+                       var raw = that._rawNode || ( that._ie4getRawNode && that._ie4getRawNode() );\r
+                       if( !raw ) return;\r
+                       raw[ 'on' + ( X.Dom.Event.Rename[ type ] || type ) ] = that._handleEvent = that._handleEvent || X.Callback.create( that );\r
+               });\r
+\r
+\r
+x_eventdispatcher_actualRemoveEvent =\r
+       x_eventdispatcher_temp.EVENT_W3C && ( X.UA.WebKit < 525.13 || X.UA.Opera7 || X.UA.NetFront < 4 ) ? // Safari3-\r
+               (function( that, type ){\r
+                       var raw = that._rawNode;\r
+                       if( !raw ) return;\r
+                       type = X.Dom.Event.Rename[ type ] || type;\r
+                       \r
+                       if( raw.addEventListener ){ // Image\r
+                               raw.removeEventListener( type, that._handleEvent, false );\r
+                       } else {\r
+                               raw[ 'on' + type ] = null;\r
+                       };\r
+                       if( !that._listeners ){\r
+                               X.Callback._correct( that._handleEvent );\r
+                               delete that._handleEvent;\r
+                       };\r
+               }) :\r
+       x_eventdispatcher_temp.EVENT_W3C ?\r
+               (function( that, type ){\r
+                       var raw = that._rawNode;\r
+                       if( !raw ) return;\r
+                       raw.removeEventListener( X.Dom.Event.Rename[ type ] || type, that, false );\r
+               }) :\r
+       x_eventdispatcher_temp.EVENT_IE ?\r
+               (function( that, type ){\r
+                       var raw = that._rawNode;\r
+                       if( !raw ) return;\r
+                       type = X.Dom.Event.Rename[ type ] || type;\r
+                       //if( type === 'load' && that._tag && X.Dom.Event._LOAD_FIX_TAGS[ that._tag ] ){\r
+                       //      type = 'readystatechange';\r
+                       //};\r
+                       if( raw.attachEvent ){\r
+                               raw.detachEvent( 'on' + type, that._handleEvent );\r
+                       } else {\r
+                               raw[ 'on' + type ] = X.emptyFunction;\r
+                               raw[ 'on' + type ] = '';\r
+                       };\r
+                       if( !that._listeners ){\r
+                               X.Callback._correct( that._handleEvent );\r
+                               delete that._handleEvent;\r
+                       };\r
+               }) :\r
+               (function( that, type ){\r
+                       var raw = that._rawNode || ( that._ie4getRawNode && that._ie4getRawNode() );\r
+                       if( !raw ) return;\r
+                       type = X.Dom.Event.Rename[ type ] || type;\r
+                       raw[ 'on' + type ] = X.emptyFunction;\r
+                       raw[ 'on' + type ] = '';\r
+                       if( !that._listeners ){\r
+                               X.Callback._correct( that._handleEvent );\r
+                               delete that._handleEvent;\r
+                       };\r
+               });\r
+\r
 \r
 console.log( 'X.Core.EventDispatcher' );\r
index 3653850..e566f95 100644 (file)
@@ -32,7 +32,7 @@ X.Notification = {
                        level === 0 ? console.debug( msg ) :\r
                        level === 1 ? console.info( msg ) :\r
                        level === 2 ? console.warn( msg ) :\r
-                       level === 3 ? console.critical( msg ) : console.warn( msg );\r
+                       level === 3 ? console.warn( msg ) : console.warn( msg );\r
                } else {\r
                        1 < level && alert( msg );\r
                };\r
index 51443ea..9ab72de 100644 (file)
@@ -19,6 +19,18 @@ X.Dom = X.Class._override(
  *  https://w3g.jp/blog/studies/ios7_1_minimal-ui_warning\r
  *  iOS7.0からあったiPad Safariの高さ100%コンテンツでlandscape(横向き)時に起きる不具合\r
  * \r
+ *  http://tenderfeel.xsrv.jp/javascript/1182/\r
+ *  アドレスバーの高さの算出\r
+ * \r
+ * http://sssslide.com/www.slideshare.net/hiroakiwakamatsu/javascript-14514208\r
+ * 1. 傾き時の画面サイズ取得ー 対処方法の例\r
+ * (1)ー• タイマーを使って、画面サイズ取得の タイミングを少しだけ遅延させる\r
+ * window.onorientationchange = function() { setTimeout(function() { alert("W: " + window.innerWidth + ", H: " + window.innerHeight); }, 200); }\r
+ * 横に傾けた時、正常に横向け時の 幅と高さが取得できている ただし、端末によってはうまく取得できな い場合がある(Galaxy S IIIとか・・・) 7 \r
+ * \r
+ * http://sssslide.com/www.slideshare.net/hiroakiwakamatsu/ss-12718639\r
+ * \r
+ * \r
  * getBoundingClientRect で fontsize の調査\r
  */\r
                _resize :\r
@@ -205,7 +217,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.prototype.listen.apply( X.Dom, arguments );\r
+                       return x_eventdispatcher_on.apply( X.Dom, arguments );\r
                },\r
                \r
                getPointerPosition : function(){\r
index ec7a949..e40d14f 100644 (file)
@@ -6,7 +6,7 @@ X.Dom.Dirty = {
        CLASSNAME        :  8, // _getCharSize, width, height, x, y\r
        ATTR             : 16, // _getCharSize, width, height, x, y\r
        CSS              : 32, // _getCharSize, width, height, x, y\r
-       IE_FILTER        : X.UA.IE && X.UA.IE < 9 && !X.UA.MacIE ? 64 : 0,\r
+       IE_FILTER        : X.UA.IE < 9 && !X.UA.MacIE ? 64 : 0,\r
        UNKNOWN_TAG_FIX  : 128,\r
        IE4_TEXTNODE_FIX : 256\r
 };\r
index d0f93ac..591c479 100644 (file)
@@ -46,9 +46,9 @@ if( !X.UA.IE || 9 <= X.UA.IE ){
                // axis\r
                // https://w3g.jp/blog/tools/wheelevent_crossbrowser\r
                // ホイール系イベント2014年版クロスブラウザ\r
-               if( e.deltaY ){\r
-                       this.deltaX = e.deltaX;\r
-                       this.deltaY = e.deltaY;\r
+               if( e.deltaY !== undefined ){\r
+                       this.deltaX = e.deltaX / 100;\r
+                       this.deltaY = e.deltaY / 100;\r
                } else\r
                if( e.wheelDeltaY !== undefined ){\r
                        this.deltaX = e.wheelDeltaX / 120;\r
@@ -56,11 +56,11 @@ if( !X.UA.IE || 9 <= X.UA.IE ){
                } else\r
                if( e.wheelDelta !== undefined ){\r
                        this.deltaX = 0;\r
-                       this.deltaY = -e.wheelDelta / 120;\r
+                       this.deltaY = e.wheelDelta / -120;\r
                } else\r
                if( e.detail !== undefined ){\r
                        this.deltaX = 0;\r
-                       this.deltaY = e.type === 'MozMousePixelScroll' ? e.detail / 15 : e.detail; // 3\r
+                       this.deltaY = e.type === 'MozMousePixelScroll' ? e.detail / 45 : e.detail / 3; // 3\r
                } else {\r
                        this.deltaX = this.deltaY = 0;\r
                };\r
@@ -163,7 +163,7 @@ if( !X.UA.IE || 9 <= X.UA.IE ){
                };\r
                this.button      = this.which - 1;\r
                this.deltaX      = 0;\r
-               this.deltaY      = e.wheelDelta / -12;\r
+               this.deltaY      = e.wheelDelta / -120;\r
                \r
                if( this.type === 'wheel' ) console.log( e.wheelDelta );\r
        };\r
@@ -218,12 +218,16 @@ if( document.onwheel === undefined ){
                        console.log( 'wheel <= DOMMouseScroll' );\r
                        X.Dom.Event.Rename[ 'wheel' ] = 'DOMMouseScroll';\r
                };\r
-       } else\r
-       if( document.onmousewheel !== undefined ){\r
+       } else {\r
+               X.Dom.Event.Rename[ 'wheel' ] = 'mousewheel';\r
+       };\r
+       if( document.onmousewheel !== undefined ){ // Opera で判定失敗\r
                X.Dom.Event.Rename[ 'wheel' ] = 'mousewheel';\r
-       };      \r
+       };\r
 };\r
 \r
+\r
+\r
 if( window.onwebkitanimationend !== undefined && window.onanimationend === undefined ){\r
        console.log( 'animationend <= webkitAnimationEnd' );\r
        X.Dom.Event.Rename[ 'animationend' ]        = 'webkitAnimationEnd';\r
@@ -288,131 +292,7 @@ if( navigator.msPointerEnabled && !navigator.pointerEnabled ){
 \r
 \r
 \r
-X.Dom.Node.prototype.listen = function( type, arg1, arg2, arg3 /* [ listener || ( context + function ) || function ][ arguments ] */ ){\r
-       if( this._xnodeType === 0 || this._xnodeType === 3 ) return this;\r
-       \r
-       if( X.Type.isArray( type ) ){\r
-               return X.EventDispatcher.prototype.listen.apply( this, arguments );\r
-       };\r
-       \r
-       ( !this._listeners || !this._listeners[ type ] ) && X.Type.isString( type ) && this._addEvent( type );\r
-       \r
-       return X.EventDispatcher.prototype.listen.apply( this, arguments );\r
-};\r
-\r
-X.Dom.Node.prototype._addEvent =\r
-       // Days on the Moon DOM Events とブラウザの実装 \r
-       // http://nanto.asablo.jp/blog/2007/03/23/1339502\r
-       // Safari 2 では関数オブジェクトしか EventListener として使えませんが、Safari のナイトリービルドでは handleEvent メソッドを持つオブジェクトも EventListener として使えるようです。\r
-       X.Dom.EVENT_W3C && ( X.UA.WebKit < 525.13 || X.UA.Opera7 || X.UA.NetFront < 4 ) ? // Safari3-\r
-               (function( type ){\r
-                       var raw = this._rawNode;\r
-                       if( !raw ) return;\r
-                       this._handleEvent = this._handleEvent || X.Callback.create( this );\r
-                       type = X.Dom.Event.Rename[ type ] || type;\r
-                       if( raw.addEventListener ){\r
-                               raw.addEventListener( type, this._handleEvent, false );\r
-                       } else {\r
-                               // Safari は Image, Opera7 は window\r
-                               raw[ 'on' + type ] = this._handleEvent;\r
-                       };\r
-               }) :\r
-       X.Dom.EVENT_W3C ?\r
-               (function( type ){\r
-                       this._rawNode && this._rawNode.addEventListener( X.Dom.Event.Rename[ type ] || type, this, false );\r
-               }) :\r
-       X.Dom.EVENT_IE ?\r
-               (function( type ){\r
-                       var raw = this._rawNode;\r
-                       if( !raw ) return;\r
-                       type = X.Dom.Event.Rename[ type ] || type;\r
-                       //if( type === 'load' && this._tag && X.Dom.Event._LOAD_FIX_TAGS[ this._tag ] ){\r
-                       //      type = 'readystatechange';\r
-                       //};\r
-                       this._handleEvent = this._handleEvent || X.Callback.create( this );\r
-                       if( raw.attachEvent ){\r
-                               raw.attachEvent( 'on' + type, this._handleEvent );\r
-                       } else {\r
-                               raw[ 'on' + type ] = this._handleEvent;\r
-                       };\r
-               }) :\r
-               (function( type ){\r
-                       var raw = this._rawNode || ( this._ie4getRawNode && this._ie4getRawNode() );\r
-                       if( !raw ) return;\r
-                       raw[ 'on' + ( X.Dom.Event.Rename[ type ] || type ) ] = this._handleEvent = this._handleEvent || X.Callback.create( this );\r
-               });\r
-\r
-\r
-X.Dom.Node.prototype.unlisten = function( type, arg1, arg2, arg3 ){\r
-       var list = this._listeners, l;\r
-       \r
-       if( X.Type.isArray( type ) ){\r
-               return list ? X.EventDispatcher.prototype.unlisten.apply( this, arguments ) : this;\r
-       };\r
-\r
-       l = !this._dispatching && list && type !== undefined && list[ type ] && list[ type ].length;\r
-       \r
-       X.EventDispatcher.prototype.unlisten.apply( this, arguments );\r
-       \r
-       l && !list[ type ] && X.Type.isString( type ) && this._removeEvent( type );\r
-       \r
-       return this;\r
-};\r
-\r
-X.Dom.Node.prototype._removeEvent =\r
-       X.Dom.EVENT_W3C && ( X.UA.WebKit < 525.13 || X.UA.Opera7 || X.UA.NetFront < 4 ) ? // Safari3-\r
-               (function( type ){\r
-                       var raw = this._rawNode;\r
-                       if( !raw ) return;\r
-                       type = X.Dom.Event.Rename[ type ] || type;\r
-                       \r
-                       if( raw.addEventListener ){ // Image\r
-                               raw.removeEventListener( type, this._handleEvent, false );\r
-                       } else {\r
-                               raw[ 'on' + type ] = null;\r
-                       };\r
-                       if( !this._listeners ){\r
-                               X.Callback._correct( this._handleEvent );\r
-                               delete this._handleEvent;\r
-                       };\r
-               }) :\r
-       X.Dom.EVENT_W3C ?\r
-               (function( type ){\r
-                       var raw = this._rawNode;\r
-                       if( !raw ) return;\r
-                       raw.removeEventListener( X.Dom.Event.Rename[ type ] || type, this, false );\r
-               }) :\r
-       X.Dom.EVENT_IE ?\r
-               (function( type ){\r
-                       var raw = this._rawNode;\r
-                       if( !raw ) return;\r
-                       type = X.Dom.Event.Rename[ type ] || type;\r
-                       //if( type === 'load' && this._tag && X.Dom.Event._LOAD_FIX_TAGS[ this._tag ] ){\r
-                       //      type = 'readystatechange';\r
-                       //};\r
-                       if( raw.attachEvent ){\r
-                               raw.detachEvent( 'on' + type, this._handleEvent );\r
-                       } else {\r
-                               raw[ 'on' + type ] = X.emptyFunction;\r
-                               raw[ 'on' + type ] = '';\r
-                       };\r
-                       if( !this._listeners ){\r
-                               X.Callback._correct( this._handleEvent );\r
-                               delete this._handleEvent;\r
-                       };\r
-               }) :\r
-               (function( type ){\r
-                       var raw = this._rawNode || ( this._ie4getRawNode && this._ie4getRawNode() );\r
-                       if( !raw ) return;\r
-                       type = X.Dom.Event.Rename[ type ] || type;\r
-                       raw[ 'on' + type ] = X.emptyFunction;\r
-                       raw[ 'on' + type ] = '';\r
-                       if( !this._listeners ){\r
-                               X.Callback._correct( this._handleEvent );\r
-                               delete this._handleEvent;\r
-                       };\r
-               });\r
-\r
+// TODO handleEvent を拡張可能にするために、クロージャに移動する\r
 // Is this in regard to the Safari 1.x preventDefault bug on click/dblclick?\r
 // https://groups.google.com/forum/#!msg/comp.lang.javascript/uYEuCHjHxnw/yKoHtZJPa1QJ\r
 X.Dom.Node.prototype.handleEvent =\r
@@ -461,7 +341,7 @@ X.Dom.Node.prototype._migrateEvent = function(){
        if( !hash ) return;\r
        for( type in hash ){\r
                // 数字イベントの除外\r
-               /*'' + parseFloat( type ) !== type && */this._removeEvent( type );\r
+               /*'' + parseFloat( type ) !== type && */x_eventdispatcher_actualRemoveEvent( this, type );\r
        };\r
 };\r
 \r
@@ -472,7 +352,7 @@ X.Dom.Node.prototype._restoreEvent = function(){
        if( !hash ) return;\r
        for( type in hash ){\r
                // 数字イベントの除外\r
-               /*'' + parseFloat( type ) !== type && */ this._addEvent( type );\r
+               /*'' + parseFloat( type ) !== type && */ x_eventdispatcher_actualAddEvent( this, type );\r
        };\r
 };\r
 \r
index 198598f..968557b 100644 (file)
@@ -119,9 +119,10 @@ _GRNERAL
                        FIX_PROP      = me.SPECIAL_FIX_PROP,
                        SPECIAL_FIX   = me.SPECIAL_FIX,
                        n             = -1,
-                       p, name, sp;
+                       p, v, name, sp;
                if( !obj ) return ''; // Opera7.5 未満?
                for( p in obj ){
+                       // TODO Object が拡張されていると error...
                        name = uncamelize( VENDER_PREFIX[ p ] || p );
                        if( FIX_PROP[ name ] ){
                                sp = true;
@@ -1183,16 +1184,17 @@ X.Dom.Node.prototype._getCharSize =
 
 
 X.Dom.listenOnce( X.Dom.Event.DOM_PRE_INIT, function(){
-       var testStyle = X.Dom._root.style;
+       var testStyle = X.Dom._root.style,
+               temp      = testStyle.cssText;
        
        X.Dom.Style.VENDER_PREFIX = (function(){
                var ret       = {},
-                       vendors   = 'webkit,Webkit,Moz,moz,ms,Ms,O,o,khtml,Khtml'.split( ',' ),
+                       vendors   = 'webkit,Webkit,Moz,moz,Ms,ms,O,o,khtml,Khtml'.split( ',' ),
                        searches  = (
                                'opacity,boxSizing,' +
                                'transform,transformOrigin,perspective,' +
                                'transisiton,transitionDelay,transitionProperty,transitionDuration,transitionTimingFunction,' +
-                               'userSelect,touchAction,touchCallout,contentZooming,userDrag,tapHighlightColor' ).split( ',' ),
+                               'userSelect,touchSelect,touchAction,touchCallout,contentZooming,userDrag,tapHighlightColor' ).split( ',' ),
                        vendor, i, search, prop, j, v;
 
                for( i = searches.length; i; ){
@@ -1203,6 +1205,8 @@ X.Dom.listenOnce( X.Dom.Event.DOM_PRE_INIT, function(){
                                for( j = vendors.length; j; ){
                                        v = vendors[ --j ];
                                        if( testStyle[ v + prop ] !== undefined ){
+                                               if( v === 'ms' ) v = 'Ms';// for ie9
+                                               if( v === 'o' ) v = 'O';//for opera12
                                                ret[ search ] = v + prop;
                                                break;
                                        };
@@ -1214,6 +1218,14 @@ X.Dom.listenOnce( X.Dom.Event.DOM_PRE_INIT, function(){
                return ret;
        })();
        
+       testStyle.cssText = 'background:rgba(0,0,0,0.5)';
+       
+       X.Dom.Style.Support = {
+               rgba : !!testStyle.background
+       };
+       
+       testStyle.cssText = temp;
+       
        X.Dom.Style.SPECIAL_FIX_PROP =
                // ~IE8
                X.UA.IE < 9 && !X.UA.MacIE ?
index 7ccbeb6..1c29ab9 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.prototype.listen.apply( this, [ type, this.User, f ] );\r
+                               return x_eventdispatcher_on.apply( this, [ type, this.User, f ] );\r
                        } else\r
                        if( f.k === X.Callback._FUNC_ONLY ){\r
-                               return X.EventDispatcher.prototype.listen.apply( this, [ type, this.User, f.f, f.s ] );\r
+                               return x_eventdispatcher_on.apply( this, [ type, this.User, f.f, f.s ] );\r
                        };\r
-                       return X.EventDispatcher.prototype.listen.apply( this, arguments );\r
+                       return x_eventdispatcher_on.apply( this, arguments );\r
                },\r
                unlisten : function( type, arg1, arg2, arg3 ){\r
                        var root, events, i, ev, counter, f;\r
index 9febc45..f7dac75 100644 (file)
@@ -757,8 +757,7 @@ X.Class._override( iScroll.prototype, {
                //this._unbind(CANCEL_EV, window);\r
                \r
                if (!this.options.hasTouch) {\r
-                       //this._unbind('DOMMouseScroll');\r
-                       //this._unbind('mousewheel');\r
+                       //this._unbind('wheel');\r
                }\r
                \r
                // if (this.options.useTransition) this._unbind(TRNEND_EV);\r