From 42e0982b02a99c71702ce8cd8740645aefdc8097 Mon Sep 17 00:00:00 2001 From: itozyun Date: Tue, 24 Mar 2015 17:06:27 +0900 Subject: [PATCH] Version 0.6.134, add comments for closure compiler. --- 0.6.x/js/01_core/00_builtin.js | 44 +- 0.6.x/js/01_core/01_X.js | 16 +- 0.6.x/js/01_core/02_XUA.js | 411 +++++++++---- 0.6.x/js/01_core/04_XObject.js | 22 +- 0.6.x/js/01_core/05_XString.js | 14 +- 0.6.x/js/01_core/06_XURL.js | 18 +- 0.6.x/js/01_core/10_XCallback.js | 97 +-- 0.6.x/js/01_core/11_XClass.js | 102 ++-- 0.6.x/js/01_core/12_XEvent.js | 241 +++++--- 0.6.x/js/01_core/13_XEventDispatcher.js | 156 +++-- 0.6.x/js/01_core/14_XTimer.js | 211 ++++--- 0.6.x/js/01_core/15_XSystem.js | 4 +- 0.6.x/js/01_core/16_XViewPort.js | 162 ++--- 0.6.x/js/01_core/17_XLogger.js | 6 +- 0.6.x/js/02_dom/00_XDoc.js | 26 +- 0.6.x/js/02_dom/01_XDTD.js | 114 ++-- 0.6.x/js/02_dom/02_XNode.js | 964 +++++++++++++++++------------- 0.6.x/js/02_dom/03_XDomEvent.js | 333 +++++------ 0.6.x/js/02_dom/04_XBoxModel.js | 162 ++--- 0.6.x/js/02_dom/05_XNodeAttr.js | 196 +++--- 0.6.x/js/02_dom/06_XNodeCSS.js | 342 +++++------ 0.6.x/js/02_dom/07_XNodeList.js | 4 +- 0.6.x/js/02_dom/08_XNodeSelector.js | 107 ++-- 0.6.x/js/02_dom/09_XHTMLParser.js | 20 +- 0.6.x/js/02_dom/10_XNodeAnime.js | 158 ++--- 0.6.x/js/02_dom/22_XTreeBuilder.js | 163 ++--- 0.6.x/js/03_plugin/00_XPlugin.js | 5 +- 0.6.x/js/05_util/00_XUtil.js | 2 +- 0.6.x/js/05_util/01_XNinjaIframe.js | 36 +- 0.6.x/js/05_util/03_XUtilImage.js | 14 +- 0.6.x/js/06_net/00_XNet.js | 74 ++- 0.6.x/js/06_net/01_XNetXHR.js | 64 +- 0.6.x/js/06_net/02_XNetJSONP.js | 20 +- 0.6.x/js/06_net/04_XNetImage.js | 56 +- 0.6.x/js/07_audio/00_XAudio.js | 94 +-- 0.6.x/js/07_audio/01_XWebAudio.js | 64 +- 0.6.x/js/07_audio/02_XHTMLAudio.js | 179 +++--- 0.6.x/js/07_audio/03_XSilverlightAudio.js | 102 ++-- 0.6.x/js/07_audio/10_XAudioSprite.js | 90 +-- 0.6.x/js/20_ui/00_XUI.js | 4 +- 0.6.x/js/20_ui/02_XUI_Attr.js | 2 +- 0.6.x/js/20_ui/05_XUI_Gesture.js | 16 +- 0.6.x/js/20_ui/06_AbstractUINode.js | 84 +-- 0.6.x/js/20_ui/08_Box.js | 24 +- 0.6.x/js/20_ui/14_ChromeBox.js | 6 +- 0.6.x/js/20_ui/15_ScrollBox.js | 42 +- 0.6.x/js/20_ui/17_Text.js | 6 +- 0.6.x/js/20_ui/20_PageRoot.js | 46 +- 48 files changed, 2792 insertions(+), 2331 deletions(-) diff --git a/0.6.x/js/01_core/00_builtin.js b/0.6.x/js/01_core/00_builtin.js index ba646f8..8a8f073 100644 --- a/0.6.x/js/01_core/00_builtin.js +++ b/0.6.x/js/01_core/00_builtin.js @@ -10,34 +10,36 @@ */ Function.prototype.apply || (Function.prototype.apply = function (x, y) { - var a, i, r, j; + var apply = '__apply', + a, i, r, j; + x = x || window; y = y || []; // apply 内で apply を呼んだ場合に備える if( x === window ){ - x.__apply = void 0; + x[ apply ] = void 0; } else { - if( x.constructor && x.constructor.prototype.__apply ){ - delete x.constructor.prototype.__apply; + if( x.constructor && x.constructor.prototype[ apply ] ){ + delete x.constructor.prototype[ apply ]; } else - if( x.__apply ) delete x.__apply; + if( x[ apply ] ) delete x[ apply ]; }; - x.__apply = this; - if (!x.__apply) x.constructor.prototype.__apply = this; + x[ apply ] = this; + if (!x[ apply ]) x.constructor.prototype[ apply ] = this; j = y.length; switch (j) { - case 0: r = x.__apply(); break; - case 1: r = x.__apply(y[0]); break; - case 2: r = x.__apply(y[0], y[1]); break; - case 3: r = x.__apply(y[0], y[1], y[2]); break; - case 4: r = x.__apply(y[0], y[1], y[2], y[3]); break; - case 5: r = x.__apply(y[0], y[1], y[2], y[3], y[4]); break; - case 6: r = x.__apply(y[0], y[1], y[2], y[3], y[4], y[5]); break; - case 7: r = x.__apply(y[0], y[1], y[2], y[3], y[4], y[5], y[6]); break; - case 8: r = x.__apply(y[0], y[1], y[2], y[3], y[4], y[5], y[6], y[7]); break; - case 9: r = x.__apply(y[0], y[1], y[2], y[3], y[4], y[5], y[6], y[7], y[8]); break; + case 0: r = x[ apply ](); break; + case 1: r = x[ apply ](y[0]); break; + case 2: r = x[ apply ](y[0], y[1]); break; + case 3: r = x[ apply ](y[0], y[1], y[2]); break; + case 4: r = x[ apply ](y[0], y[1], y[2], y[3]); break; + case 5: r = x[ apply ](y[0], y[1], y[2], y[3], y[4]); break; + case 6: r = x[ apply ](y[0], y[1], y[2], y[3], y[4], y[5]); break; + case 7: r = x[ apply ](y[0], y[1], y[2], y[3], y[4], y[5], y[6]); break; + case 8: r = x[ apply ](y[0], y[1], y[2], y[3], y[4], y[5], y[6], y[7]); break; + case 9: r = x[ apply ](y[0], y[1], y[2], y[3], y[4], y[5], y[6], y[7], y[8]); break; default: a = []; for (i = 0; i < j; ++i) @@ -49,13 +51,13 @@ Function.prototype.apply || (Function.prototype.apply = function (x, y) { }; // ie5 if( x === window ){ - x.__apply = void 0; + x[ apply ] = void 0; } else { //alert( typeof x ); - if( x.constructor && x.constructor.prototype.__apply ){ - delete x.constructor.prototype.__apply; + if( x.constructor && x.constructor.prototype[ apply ] ){ + delete x.constructor.prototype[ apply ]; } else - if( x.__apply ) delete x.__apply; + if( x[ apply ] ) delete x[ apply ]; }; return r; }); diff --git a/0.6.x/js/01_core/01_X.js b/0.6.x/js/01_core/01_X.js index 28c783c..5b76024 100644 --- a/0.6.x/js/01_core/01_X.js +++ b/0.6.x/js/01_core/01_X.js @@ -1,3 +1,4 @@ + /** *

はじめに:Web 開発の世界へようこそ!

* DHTML と XHR 等を活用した Ajax によってその真価を発揮した javascript は、現在では RIA に SPA や 3D ゲームなど、あらゆるアプリケーションがブラウザ上で動きつつあります。 @@ -45,13 +46,13 @@ * * @example // ライブラリは X という名前空間を使用します。 * //ショートハンド - * X( func ) == X.ViewPort.listenOnce(X.Event.XDOM_READY, func); + * X( func ) == X.ViewPort[ 'listenOnce' ](X.Event.XDOM_READY, func); * X('#mydiv') == X.Doc.find('#mydiv'); * @namespace X - */ + */ function X( v ){ if( X_Type_isFunction( v ) ){ - X.ViewPort.listenOnce( X_Event[ 'XDOM_READY' ], v ); + X[ 'ViewPort' ][ 'listenOnce' ]( X_EVENT_XDOM_READY, v ); } else if( X_shortcutFunction ){ return X_shortcutFunction.apply( X_shortcutContext || X, arguments ); @@ -76,30 +77,31 @@ if( !window['console'] || ( window.parent && window.parent.log ) ) var undefined, X_EMPTY_OBJECT = {}, X_TEMP = { onSystemReady : [] }, + X_emptyFunction = new Function, X_shortcutFunction, X_shortcutContext; /** * バージョン文字列:"0.6.123" * @type {string} */ -X.VERSION = '0.6.127'; +X[ 'VERSION' ] = '0.6.127'; /** * ブートタイム ms * @type {number} */ -X.bootTime = + new Date; +X[ 'bootTime' ] = + new Date; /** * 空の関数 * @type {Function} */ -X.emptyFunction = new Function; +X[ 'emptyFunction' ] = X_emptyFunction; /** * このscriptはheadタグの中にあるか? * @type {boolean} */ // TODO defer の場合もあるので、document.readyState を見る // MacIE で false -X.inHead = (function( s ){ +X[ 'inHead' ] = (function( s ){ if( !s ) return false; if( !s.length ) return false; // Safari1.3 312.8 でerror s = s[ s.length - 1 ]; diff --git a/0.6.x/js/01_core/02_XUA.js b/0.6.x/js/01_core/02_XUA.js index 7ccefca..ecdbe23 100644 --- a/0.6.x/js/01_core/02_XUA.js +++ b/0.6.x/js/01_core/02_XUA.js @@ -11,11 +11,11 @@ */ var X_UA = X[ 'UA' ] = {}; -(function( n ){ - var dua = n.userAgent, - dav = n.appVersion, +(function(){ + var dua = navigator.userAgent, + dav = navigator.appVersion, tv = parseFloat(dav), - sys = n.platform, + sys = navigator.platform, tridentToVer, i, j, v; console.log( ' userAgent : ' + dua ); @@ -63,43 +63,58 @@ var X_UA = X[ 'UA' ] = {}; */ X_UA[ 'iPhone' ] = true; if( v ){ - /** iPhone4s以下 - * @memberof X.UA */ + /** + * iPhone4s以下 + * @alias X.UA.iPhone_4s + * @type {boolean} + */ X_UA[ 'iPhone_4s' ] = true; }; if( v && i ){ - /** - * iPhone3GS以下 - * @alias X.UA.iPhone_3GS - * @type {boolean} - */ + /** + * iPhone3GS以下 + * @alias X.UA.iPhone_3GS + * @type {boolean} + */ X_UA[ 'iPhone_3GS' ] = true; }; //alert( 'iPhone ' + ( X_UA[ 'iPhone_3GS' ] ? '3GS以下' : X_UA[ 'iPhone_4s' ] ? '4s以下' : '5以上' ) ); }; if( sys === 'iPad' ){ - /** @memberof X.UA */ + /** + * @alias X.UA.iPad + * @type {boolean} + */ X_UA[ 'iPad' ] = true; if( i ){ /** * iPad2以下または初代iPad mini 以下 - * @memberof X.UA */ + * @alias X.UA.iPad_2Mini1 + * @type {boolean} + */ X_UA[ 'iPad_2Mini1' ] = true; }; }; if( sys === 'iPod' ){ - /** @memberof X.UA */ + /** + * @alias X.UA.iPod + * @type {boolean} + */ X_UA[ 'iPod' ] = true; if( v && i ){ /** * iPod3以下 - * @memberof X.UA */ + * @alias X.UA.iPod_3 + * @type {boolean} + */ X_UA[ 'iPod_3' ] = true; }; if( v ){ /** * iPod4以下 - * @memberof X.UA */ + * @alias X.UA.iPod_4 + * @type {boolean} + */ X_UA[ 'iPod_4' ] = true; }; //alert( 'iPod touch ' + ( X_UA[ 'iPod_3' ] ? '3以下' : X_UA[ 'iPod_4' ] ? '4以下' : '5以上' ) ); @@ -108,82 +123,135 @@ var X_UA = X[ 'UA' ] = {}; console.log( '>> iOS : ' + X_UA[ 'iOS' ] ); } else if( dua.indexOf( 'hp-tablet' ) !== -1 || dua.indexOf( 'webOS' ) !== -1 ){ - // http://user-agent-string.info/list-of-ua/os-detail?os=webOS - /** @memberof X.UA */ + /** + * http://user-agent-string.info/list-of-ua/os-detail?os=webOS + * @alias X.UA.webOS + * @type {boolean} + */ X_UA[ 'webOS' ] = true; // webOS } else if( sys.indexOf( 'Win' ) + 1 ){ console.log( 'Win' ); - /** @memberof X.UA */ + /** + * @alias X.UA.Windows + * @type {boolean} + */ X_UA[ 'Windows' ] = true; switch( sys ){ case 'Win16' : case 'Win32' : case 'Win64' : case 'WinCE' : + /** + * @alias X.UA.Win16 + * @alias X.UA.Win32 + * @alias X.UA.Win64 + * @alias X.UA.WinCE + * @type {boolean} + */ X_UA[ sys ] = true; }; // winRT } else if( sys.indexOf( 'Mac' ) + 1 ){ console.log( 'Mac' ); - /** @memberof X.UA */ + /** + * @alias X.UA.Mac + * @type {boolean} + */ X_UA[ 'Mac' ] = true; switch( sys ){ case 'MacPowerPC' : - /** @memberof X.UA */ + /** + * @alias X.UA.MacPPC + * @type {boolean} + */ X_UA[ 'MacPPC' ] = true; break; case 'MacPPC' : case 'Mac68K' : case 'MacIntel' : + /** + * @alias X.UA.MacPPC + * @alias X.UA.Mac68K + * @alias X.UA.MacIntel + * @type {boolean} + */ X_UA[ sys ] = true; }; } else if( ( sys.indexOf( 'Linux' ) + 1 ) || ( sys.indexOf( 'Android' ) + 1 ) ){ console.log( 'Linux' ); - /** @memberof X.UA */ + /** + * @alias X.UA.Linux + * @type {boolean} + */ X_UA[ 'Linux' ] = true; if( ( i = dua.indexOf( 'Android' ) ) !== -1 ){ - /** @memberof X.UA */ - X_UA[ 'Android' ] = parseFloat( dua.substr( i + 8 ) ) || 0.1; // Firefox で Version が取れない! + /** + * Firefox で Version が取れない! + * http://bizmakoto.jp/bizid/articles/1207/31/news004.html + * Chrome Android 4.0以上 Google + * Dolphin Browser HD Android 2.0.1以上 Mobotap + * Firefox Android 2.2以上 Mozilla + * Opera Mobile Android 1.6以上 Opera Software ASA + * Sleipnir Mobile Android 2.1以上 Fenrir + * @alias X.UA.Android + * @type {number} + */ + X_UA[ 'Android' ] = parseFloat( dua.substr( i + 8 ) ) || 0.1; console.log( '>> Android : ' + X_UA[ 'Android' ] ); }; }; - -/* - * http://bizmakoto.jp/bizid/articles/1207/31/news004.html -Chrome Android 4.0以上 Google -Dolphin Browser HD Android 2.0.1以上 Mobotap -Firefox Android 2.2以上 Mozilla -Opera Mobile Android 1.6以上 Opera Software ASA -Sleipnir Mobile Android 2.1以上 Fenrir - */ if( window.opera ){ i = dua.indexOf( 'Opera' ); // Opera/ j = dua.indexOf( 'Version/' ); - /** @memberof X.UA */ + /** + * @alias X.UA.Opera + * @type {number} + */ X_UA[ 'Opera' ] = v = Math.max( i !== -1 ? parseFloat( dua.substr( i + 6 ) ) : 0, j !== -1 ? parseFloat( dua.substr( j + 8 ) ) : 0, tv ); - // closure compiler で minify するとOpera7で動かない - // --compilation_level WHITESPACE_ONLY --formatting pretty_print <- 動く - /** @memberof X.UA */ + /** + * memo:closure compiler で minify するとOpera7で動かない + * --compilation_level WHITESPACE_ONLY --formatting pretty_print <- 動く + * @alias X.UA.Opera7 + * @type {boolean} + */ X_UA[ 'Opera7' ] = v < 8; - /** @memberof X.UA */ + /** + * @alias X.UA.Opera78 + * @type {boolean} + */ X_UA[ 'Opera78' ] = v < 9; - /** @memberof X.UA */ + /** + * @alias X.UA.OperaMini + * @type {boolean} + */ X_UA[ 'OperaMini' ] = 0 < dua.indexOf('Opera Mini'); - /** @memberof X.UA */ + /** + * @alias X.UA.OperaMobile + * @type {boolean} + */ X_UA[ 'OperaMobile' ] = 0 < dua.indexOf('Opera Mobi'); - /** @memberof X.UA */ + /** + * @alias X.UA.OperaTablet + * @type {boolean} + */ X_UA[ 'OperaTablet' ] = 0 < dua.indexOf('Opera Tablet'); - /** @memberof X.UA */ + /** + * @alias X.UA.Wii + * @type {boolean} + */ X_UA[ 'Wii' ] = dua.indexOf( 'Nintendo Wii' ) !== -1; - /** @memberof X.UA */ + /** + * @alias X.UA.NDS + * @type {boolean} + */ X_UA[ 'NDS' ] = dua.indexOf( 'Nitro' ) !== -1; console.log( '>> Opera : ' + v ); return; @@ -191,58 +259,104 @@ Sleipnir Mobile Android 2.1以上 Fenrir // Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko if( document.all || dav.indexOf( 'Trident/' ) !== -1 ){ - /** @memberof X.UA */ + /** + * @alias X.UA.ActiveX + * @type {boolean} + */ X_UA[ 'ActiveX' ] = !!window[ 'ActiveXObject' ]; /** * documentモードを考慮しないIEのバージョン - * @memberof X.UA - * @type {number}*/ + * @alias X.UA._IE + * @type {number} + */ X_UA[ '_IE' ] = parseFloat(dua.split('MSIE ')[1]) || parseFloat(dua.split('rv:')[1]) || parseFloat(dav.split('MSIE ')[1]) || 0; - // IE11 の互換モードの dav にも Trident/7.0 が書かれているため互換モードか?判定ができる - // 互換モードでは Silverlight でエラーが出る? - /** @memberof X.UA */ + /** + * IE11 の互換モードの navigator.appVersion にも Trident/7.0 が書かれているため互換モードか?判定ができる + * 互換モードでは Silverlight でエラーが出る? + * @alias X.UA.Trident + * @type {number} + */ X_UA[ 'Trident' ] = parseFloat(dav.split('Trident/')[1]) || 0; /** * documentモードを考慮したIEのバージョン - * @memberof X.UA */ + * @alias X.UA.IE + * @type {number} + */ X_UA[ 'IE' ] = v = document.documentMode || X_UA[ '_IE' ]; - tridentToVer = X_UA[ 'Trident' ] ? ( X_UA[ 'Trident' ] + 4 | 0 ) : X_UA[ '_IE' ]; + tridentToVer = X_UA[ 'Trident' ] ? ( X_UA[ 'Trident' ] + 4 | 0 ) : X_UA[ '_IE' ]; /** - * IE11 の互換モードを使用しているか? - * @memberof X.UA */ + * IE10 以上の互換モードを使用している場合、そのバージョン + * @alias X.UA.IECompat + * @type {number} + */ X_UA[ 'IECompat' ] = /* v !== X_UA[ '_IE' ] || */ tridentToVer !== X_UA[ '_IE' ] && tridentToVer; - /** @memberof X.UA */ + /** + * @alias X.UA.IE4 + * @type {boolean} + */ X_UA[ 'IE4' ] = v && v < 5; - /** @memberof X.UA */ - X_UA[ 'IE5678' ] = 5 <= v && v < 9; - /** @memberof X.UA */ + /** + * @alias X.UA.IE5 + * @type {boolean} + */ X_UA[ 'IE5' ] = 5 <= v && v < 5.5; - /** @memberof X.UA */ + /** + * @alias X.UA.IE55 + * @type {boolean} + */ X_UA[ 'IE55' ] = 5.5 <= v && v < 6; - /** @memberof X.UA */ + /** + * @alias X.UA.IE5x + * @type {boolean} + */ X_UA[ 'IE5x' ] = X_UA[ 'IE5' ] || X_UA[ 'IE55' ]; - /** @memberof X.UA */ + /** + * @alias X.UA.IE6 + * @type {boolean} + */ X_UA[ 'IE6' ] = 6 <= v && v < 7; - /** @memberof X.UA */ + /** + * @alias X.UA.IE7 + * @type {boolean} + */ X_UA[ 'IE7' ] = 7 <= v && v < 8; - /** @memberof X.UA */ + /** + * @alias X.UA.IE8 + * @type {boolean} + */ X_UA[ 'IE8' ] = 8 <= v && v < 9; - /** @memberof X.UA */ + /** + * @alias X.UA.IE9 + * @type {boolean} + */ X_UA[ 'IE9' ] = 9 <= v && v < 10; - /** @memberof X.UA */ + /** + * @alias X.UA.MacIE + * @type {boolean} + */ X_UA[ 'MacIE' ] = X_UA[ 'Mac' ]; - /** @memberof X.UA */ + /** + * @alias X.UA.IEMobile + * @type {boolean} + */ X_UA[ 'IEMobile' ] = dua.toLowerCase().indexOf( 'iemobile' ) !== -1 || X_UA[ 'WinCE' ]; - /** @memberof X.UA */ - X_UA[ 'WinPhone' ] = dua.toLowerCase().indexOf( 'windows phone' ) !== -1 || 0 < dav.indexOf( 'ZuneWP' ); // ZuneWP は IEM のデスクトップモードで使用 + /** + * @alias X.UA.WinPhone + * @type {boolean} + */ + X_UA[ 'WinPhone' ] = dua.toLowerCase().indexOf( 'windows phone' ) !== -1 || 0 < dav.indexOf( 'ZuneWP' ); // ZuneWP は IEM のデスクトップモードで登場する console.log( '>> IE : ' + v + ' ActiveX : ' + X_UA[ 'ActiveX' ] ); // TODO XBox360, XBox1, Modern or Desktop, Standalone return; }; - // http://qa.support.sony.jp/solution/S0812181056444/common/nfb34_dom_200jp/dom_dom0_JP.html + // if( ( i = dua.indexOf( 'NetFront\/' ) !== -1 ) ){ - /** @memberof X.UA */ + /** + * http://qa.support.sony.jp/solution/S0812181056444/common/nfb34_dom_200jp/dom_dom0_JP.html + * @alias X.UA.NetFront + * @type {number} + */ X_UA[ 'NetFront' ] = parseFloat( dua.substr( i + 9 ) ) || 0.1; console.log( '>> NetFront : ' + X_UA[ 'NetFront' ] ); return; @@ -254,25 +368,30 @@ Sleipnir Mobile Android 2.1以上 Fenrir return; }; - // http://www.useragentstring.com/pages/Playstation%203/ - // Mozilla/5.0 (PLAYSTATION 3; 3.55) - // Mozilla/4.0 (PS3 (PlayStation 3); 1.00) - // https://github.com/Famous/famous/blob/1a02c8084587d80519ea4bd3b55649ab32ee2e65/examples/assets/lib/require.js - // PS3 ブラウザのロードイベントについて if( ( i = dua.toUpperCase().indexOf( 'PLAYSTATION 3' ) !== -1 ) ){ /** * PlayStation 3 システムバージョン 4.10 未満の SONY 独自ブラウザ - * @memberof X.UA */ + * http://www.useragentstring.com/pages/Playstation%203/ + * Mozilla/5.0 (PLAYSTATION 3; 3.55) + * Mozilla/4.0 (PS3 (PlayStation 3); 1.00) + * https://github.com/Famous/famous/blob/1a02c8084587d80519ea4bd3b55649ab32ee2e65/examples/assets/lib/require.js + * PS3 ブラウザのロードイベントについて + * @alias X.UA.PS3 + * @type {number} + */ X_UA[ 'PS3' ] = parseFloat( dua.substr( i + 15 ) ) || 0.1; console.log( '>> PS3 : ' + X_UA[ 'PS3' ] ); return; }; - // http://www.useragentstring.com/pages/iCab/ - // iCab/3.0.2 (Macintosh; U; PPC Mac OS X) - // Mozilla/5.0 (Macintosh; U; PPC Mac OS; en) iCab 3 if( ( i = dua.indexOf( 'iCab' ) !== -1 ) ){ - /** @memberof X.UA */ + /** + * http://www.useragentstring.com/pages/iCab/ + * iCab/3.0.2 (Macintosh; U; PPC Mac OS X) + * Mozilla/5.0 (Macintosh; U; PPC Mac OS; en) iCab 3 + * @alias X.UA.iCab + * @type {number} + */ X_UA[ 'iCab' ] = parseFloat( dua.substr( i + 5 ) ) || 0.1; console.log( '>> iCab : ' + X_UA[ 'iCab' ] ); return; @@ -280,21 +399,37 @@ Sleipnir Mobile Android 2.1以上 Fenrir if( 0 < dua.indexOf( 'Gecko\/' ) && ( i = dua.indexOf( 'rv:' ) ) ){ v = dua.substr( i + 3 ).split( '.' ); - /** @memberof X.UA */ + /** + * メジャーバージョン + マイナーバージョン + * @alias X.UA.Gecko + * @type {number} + */ X_UA[ 'Gecko' ] = parseFloat( v[ 0 ] ) || 0 + ( parseFloat( v[ 1 ] ) || 0 ) / 10 + ( parseFloat( v[ 2 ] ) || 0 ) / 100; - /** @memberof X.UA */ + /** + * @alias X.UA.GeckoMajor + * @type {number} + */ X_UA[ 'GeckoMajor' ] = parseFloat( v[ 0 ] ) || 0; - /** @memberof X.UA */ + /** + * @alias X.UA.GeckoMinor + * @type {number} + */ X_UA[ 'GeckoMinor' ] = parseFloat( v[ 1 ] ) || 0; - /** @memberof X.UA */ + /** + * @alias X.UA.GeckoPatch + * @type {number} + */ X_UA[ 'GeckoPatch' ] = parseFloat( v[ 2 ] ) || 0; //Fennec - // Mozilla/5.0 (Android; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/9.0 Fennec/9.0 if( ( i = dua.indexOf( 'Fennec/' ) ) !== -1 ){ - /** @memberof X.UA */ + /** + * Mozilla/5.0 (Android; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/9.0 Fennec/9.0 + * @alias X.UA.Fennec + * @type {number} + */ X_UA[ 'Fennec' ] = parseFloat( dua.substr( i + 7 ) ); console.log( '>> Fennec : ' + X_UA[ 'Fennec' ] + ', Gecko : ' + X_UA[ 'Gecko' ] ); return; @@ -304,9 +439,15 @@ Sleipnir Mobile Android 2.1以上 Fenrir //Netscape //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 if( ( i = dua.indexOf( 'Netscape6/' ) ) !== -1 ){ - /** @memberof X.UA */ + /** + * @alias X.UA.NN + * @type {number} + */ X_UA[ 'NN' ] = parseFloat( dua.substr( i + 10 ) ) || 6; - /** @memberof X.UA */ + /** + * @alias X.UA.NN6 + * @type {boolean} + */ X_UA[ 'NN6' ] = true; console.log( '>> NN : ' + X_UA[ 'NN' ] + ', Gecko : ' + X_UA[ 'Gecko' ] ); return; @@ -330,44 +471,78 @@ Sleipnir Mobile Android 2.1以上 Fenrir // TODO Blink if( window.chrome ){ - /** @memberof X.UA */ + /** + * @alias X.UA.Blink + * @type {number} + */ X_UA[ 'Blink' ] = tv; console.log( '>>Blink : ' + X_UA[ 'Blink' ] ); } else if( dav.indexOf( 'Konqueror' ) !== -1 ){ - /** @memberof X.UA */ + /** + * @alias X.UA.Khtml + * @type {number} + */ X_UA[ 'Khtml' ] = tv; console.log( '>>Khtml : ' + X_UA[ 'Khtml' ] ); } else if( ( i = dua.indexOf( 'Android ' ) ) !== -1 ){ - /** @memberof X.UA */ - X_UA[ 'AndroidBrowser' ] = i = parseFloat( dua.substr( i + 8 ) ) || 0.1; - /** @memberof X.UA */ + /** + * Android 標準ブラウザ + * @alias X.UA.AndroidBrowser + * @type {number} + */ + X_UA[ 'AndroidBrowser' ] = i = parseFloat( dua.substr( i + 8 ) ) || 0.1; + /** + * @alias X.UA.AndroidBrowser1 + * @type {boolean} + */ X_UA[ 'AndroidBrowser1' ] = 1 <= i && i < 2; - /** @memberof X.UA */ + /** + * @alias X.UA.AndroidBrowser2 + * @type {boolean} + */ X_UA[ 'AndroidBrowser2' ] = 2 <= i && i < 3; - /** @memberof X.UA */ + /** + * @alias X.UA.AndroidBrowser3 + * @type {boolean} + */ X_UA[ 'AndroidBrowser3' ] = 3 <= i && i < 4; - /** @memberof X.UA */ + /** + * @alias X.UA.AndroidBrowser4 + * @type {boolean} + */ X_UA[ 'AndroidBrowser4' ] = 4 <= i && i < 5; - /** @memberof X.UA */ + /** + * @alias X.UA.AndroidBrowser5 + * @type {boolean} + */ X_UA[ 'AndroidBrowser5' ] = 5 <= i && i < 6; console.log( '>> AndroidBrowser : ' + X_UA[ 'Android' ] ); i = parseFloat(dua.split('WebKit\/')[1]); - /** @memberof X.UA */ + /** + * @alias X.UA.AndroidBrowserWebkit + * @type {number} + */ X_UA[ 'AndroidBrowserWebkit' ] = i; alert( 'AudioSprite調査:Android標準ブラウザ Webkit Version ' + i ); } else if( i = parseFloat(dua.split('WebKit\/')[1]) ){ - /** @memberof X.UA */ + /** + * @alias X.UA.WebKit + * @type {number} + */ X_UA[ 'WebKit' ] = i; if( v = parseFloat(dua.split('Chrome\/')[1]) ){ - /** @memberof X.UA */ + /** + * @alias X.UA.Chrome + * @type {number} + */ X_UA[ 'Chrome' ] = v; }; @@ -377,16 +552,19 @@ Sleipnir Mobile Android 2.1以上 Fenrir if( i && !X_UA[ 'Chrome' ] && dua.indexOf( 'Safari' ) !== -1 ){ if( dav.indexOf( 'Version/' ) !== -1 ){ - /** @memberof X.UA */ + /** + * @alias X.UA.Safari + * @type {number} + */ X_UA[ 'Safari' ] = parseFloat( dav.split('Version/')[1] ); } else { if( i <= 528.16 ){ - X_UA[ 'Safari' ] = i < 73 ? 0.8 : - i < 85 ? 0.9 : - i < 100 ? 1 : - i < 125 ? 1.1 : - i < 312 ? 1.2 : - i < 412 ? 1.3 : + X_UA[ 'Safari' ] = i < 73 ? 0.8 : + i < 85 ? 0.9 : + i < 100 ? 1 : + i < 125 ? 1.1 : + i < 312 ? 1.2 : + i < 412 ? 1.3 : i <= 419.3 ? 2 : i <= 525.13 ? 3 : i <= 525.25 ? 3.1 : 3.2; @@ -397,8 +575,14 @@ Sleipnir Mobile Android 2.1以上 Fenrir console.log( '>> Webkit : ' + X_UA[ 'WebKit' ] + ' Safari : ' + X_UA[ 'Safari' ] ); }; - //http://www.useragentstring.com/pages/Iris/ - if( dua.toLowerCase().indexOf( 'iris' ) !== -1 ) X_UA[ 'Iris' ] = true; + if( dua.toLowerCase().indexOf( 'iris' ) !== -1 ){ + /** + * http://www.useragentstring.com/pages/Iris/ + * @alias X.UA.Iris + * @type {boolean} + */ + X_UA[ 'Iris' ] = true; + }; if( // Kobo Mozilla/5.0 (Linux; U; Android 2.0; en-us;) AppleWebKit/533.1 (KHTML, like Gecko) Verson/4.0 Mobile Safari/533.1 (Kobo Touch) dua.indexOf( 'Kobo' ) !== -1 || @@ -407,15 +591,18 @@ Sleipnir Mobile Android 2.1以上 Fenrir // Sony Reader Mozilla/5.0 (Linux; U; ja-jp; EBRD1101; EXT) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 dua.indexOf( 'EBRD' ) !== -1 ){ - /** @memberof X.UA */ + /** + * Kobo, Kindle, Sony Reader + * @alias X.UA.EInk + * @type {boolean} + */ X_UA[ 'EInk' ] = true; }; -})( navigator ); +})(); var X_UA_DOM = {}, X_UA_EVENT = {}, X_UA_HID = {}; -//X_UA[ 'IECompat' ] && alert( X_UA[ 'IE' ] + ' ' + X_UA[ '_IE' ] + ' Tri:' + X_UA[ 'Trident' ] ); /* * http://d.hatena.ne.jp/t-uchima/20051003/p1 @@ -472,7 +659,7 @@ if( X_UA[ 'IE' ] < 7 ){ // error @ NN7.2 * ie7 以下で実行する document.execCommand( 'BackgroundImageCache', false, true ) の失敗。 * bonus: hotfix for IE6 SP1 (bug KB823727) * multipleIEs IE6 standalone 版では不可, IE5.5 は可,,, - * @memberof X.UA */ + * @alias X.UA.ieExeComError */ X_UA[ 'ieExeComError' ] = eval( 'var a=1;try{document.execCommand&&document.execCommand("BackgroundImageCache",!1,!0)}catch(e){a=0}!a' ); })(); diff --git a/0.6.x/js/01_core/04_XObject.js b/0.6.x/js/01_core/04_XObject.js index 574b1e4..1dcde48 100644 --- a/0.6.x/js/01_core/04_XObject.js +++ b/0.6.x/js/01_core/04_XObject.js @@ -19,29 +19,37 @@ var X_Object_inObject = X_UA[ 'IE' ] < 5.5 ? // TODO JScript で判定 }) : new Function( 'a,b', 'return a in b' );// なぜか ie5 でもerror + +// ------------------------------------------------------------------------- // +// --- interface ----------------------------------------------------------- // +// ------------------------------------------------------------------------- // + /** * Object に関するメソッドを集めたものです。 * @namespace X.Object * @alias X.Object */ -X.Object = { +X[ 'Object' ] = { // TODO rename to copy - clone : X_Object_clone, + 'clone' : X_Object_clone, - override : X_Object_override, + 'override' : X_Object_override, - deepCopy : X_Object_deepCopy, + 'deepCopy' : X_Object_deepCopy, // TODO rename to X.Array.copy - cloneArray : X_Object_cloneArray, + 'cloneArray' : X_Object_cloneArray, - isEmpty : X_Object_isEmpty, + 'isEmpty' : X_Object_isEmpty, - inObject : X_Object_inObject + 'inObject' : X_Object_inObject // TODO hasOwnProperty }; +// ------------------------------------------------------------------------- // +// --- implements ---------------------------------------------------------- // +// ------------------------------------------------------------------------- // /** * 単純なクローンでメンバーをコピーしたオブジェクトを返します。 * @alias X.Object.clone diff --git a/0.6.x/js/01_core/05_XString.js b/0.6.x/js/01_core/05_XString.js index 1ba48aa..a3ff287 100644 --- a/0.6.x/js/01_core/05_XString.js +++ b/0.6.x/js/01_core/05_XString.js @@ -12,19 +12,19 @@ var X_String_CRLF = String.fromCharCode( 13 ) + String.fromCharCode( 10 ); * @namespace X.String * @alias X.String */ -X.String = { +X[ 'String' ] = { - parse : X_String_parse, + 'parse' : X_String_parse, - cleanupWhiteSpace : X_String_cleanupWhiteSpace, + 'cleanupWhiteSpace' : X_String_cleanupWhiteSpace, - whiteSpaceToTag : X_String_whiteSpaceToTag, + 'whiteSpaceToTag' : X_String_whiteSpaceToTag, - chrReferanceTo : X_String_chrReferanceTo, + 'chrReferanceTo' : X_String_chrReferanceTo, - toChrReferance : X_String_toChrReferance, + 'toChrReferance' : X_String_toChrReferance, - isNumberString : X_String_isNumberString + 'isNumberString' : X_String_isNumberString }; // ------------------------------------------------------------------------- // diff --git a/0.6.x/js/01_core/06_XURL.js b/0.6.x/js/01_core/06_XURL.js index 091e3cf..9d2dd87 100644 --- a/0.6.x/js/01_core/06_XURL.js +++ b/0.6.x/js/01_core/06_XURL.js @@ -46,23 +46,23 @@ var X_URL_BASE_URL = ( function( parts ){ * @namespace X.URL * @alias X.URL */ -X.URL = { +X[ 'URL' ] = { - BASE_URL : X_URL_BASE_URL, + 'BASE_URL' : X_URL_BASE_URL, - IS_FILE : X_URL_IS_FILE, + 'IS_FILE' : X_URL_IS_FILE, - IS_LOCAL : X_URL_IS_LOCAL, + 'IS_LOCAL' : X_URL_IS_LOCAL, - PARAMS : X_URL_PARAMS, + 'PARAMS' : X_URL_PARAMS, - toAbsolutePath : X_URL_toAbsolutePath, + 'toAbsolutePath' : X_URL_toAbsolutePath, - isSameDomain : X_URL_isSameDomain, + 'isSameDomain' : X_URL_isSameDomain, - cleanup : X_URL_cleanup, + 'cleanup' : X_URL_cleanup, - getEXT : X_URL_getEXT + 'getEXT' : X_URL_getEXT }; // ------------------------------------------------------------------------- // diff --git a/0.6.x/js/01_core/10_XCallback.js b/0.6.x/js/01_core/10_XCallback.js index 189ba59..964b2ca 100644 --- a/0.6.x/js/01_core/10_XCallback.js +++ b/0.6.x/js/01_core/10_XCallback.js @@ -3,21 +3,35 @@ // ------------ local variables -------------------------------------------- // // ------------------------------------------------------------------------- // -var X_Callback_LIVE_LIST = [], +var /** @const */ + X_Callback_LIVE_LIST = [], + /** @const */ X_Callback_POOL_LIST = [], + /** @const */ X_Closure_COMMAND_BACK = X_Callback_LIVE_LIST, + /** @const */ X_Closure_COMMAND_DROP = X_Callback_POOL_LIST, + /** @const */ X_Callback_THIS_FUNC = 1, + /** @const */ X_Callback_HANDLEEVENT = 2, + /** @const */ X_Callback_FUNC_ONLY = 3, + /** @const */ X_Callback_NONE = 0, + /** @const */ X_Callback_UN_LISTEN = 1, - X_Callback_STOP_PROPAGATION = 2, // 上位階層への伝播のキャンセル + /** @const */ + X_Callback_STOP_PROPAGATION = 2, + /** @const */ X_Callback_STOP_NOW = 4 | 2, // 同一階層のリスナーのキャンセル(上位へもキャンセル) + /** @const */ X_Callback_PREVENT_DEFAULT = 8, // 結果動作のキャンセル, + /** @const */ X_Callback_MONOPOLY = 16, // move event を独占する + /** @const */ X_Callback_SYS_CANCEL = 32 | 4 | 2; /* @@ -116,28 +130,28 @@ X.Callback = { /** * このコールバックでは返り値による操作は無い。 */ - NONE : X_Callback_NONE, + 'NONE' : X_Callback_NONE, /** - * X.Timer.add, X.EventDispatcher.listen のコールバックでタイマーやイベントリスナの解除に使用。 + * X.Timer, X.EventDispatcher のコールバックでタイマーやイベントリスナの解除に使用。 */ - UN_LISTEN : X_Callback_UN_LISTEN, + 'UN_LISTEN' : X_Callback_UN_LISTEN, /** - * イベントのバブルアップを中止する。DOM イベントのコールバックの戻り値に指定すると e.stopPropagation() が呼ばれる。 + * 上位階層へのイベント伝播のキャンセル。DOM イベントのコールバックの戻り値に指定すると e.stopPropagation() が呼ばれる。 */ - STOP_PROPAGATION : X_Callback_STOP_PROPAGATION, + 'STOP_PROPAGATION' : X_Callback_STOP_PROPAGATION, /** - * 以降のイベントのディスパッチを中断する。 + * 以降のイベントのディスパッチを中断する。STOP_PROPAGATION との違いは、次に控えているコールバックもキャンセルされる点。但し system によって追加されたイベントはキャンセルされない。 */ - STOP_NOW : X_Callback_STOP_NOW, + 'STOP_NOW' : X_Callback_STOP_NOW, /** * DOM イベントのコールバックの戻り値に指定すると e.preventDefault() が呼ばれる。 * またフレームワーク内で定義されたデフォルト動作の回避にも使用される。 */ - PREVENT_DEFAULT : X_Callback_PREVENT_DEFAULT, + 'PREVENT_DEFAULT' : X_Callback_PREVENT_DEFAULT, /** * X.UI に於いて、ポインターイベントの戻り値に指定すると、以降のポインターベントを独占する。 */ - MONOPOLY : X_Callback_MONOPOLY + 'MONOPOLY' : X_Callback_MONOPOLY }; // ------------------------------------------------------------------------- // @@ -147,18 +161,21 @@ X.Callback = { function X_Callback_create( thisObject, opt_callback, opt_args /* [ listener || ( context + function ) || function ][ args... ] */ ){ var obj = X_Callback_classifyCallbackArgs( thisObject, opt_callback, opt_args ), l, ret, _obj; - if( !obj.k ) return obj; + + if( !obj.kind ) return obj; + if( l = X_Callback_POOL_LIST.length ){ - ret = X_Callback_POOL_LIST[ l - 1 ]; --X_Callback_POOL_LIST.length; // ret = X_Callback_POOL_LIST.pop(); - _obj = ret( X_Closure_COMMAND_BACK ); - _obj.k = obj.k; - _obj.f = obj.f; - _obj.x = obj.x; - _obj.s = obj.s; - _obj._ = X_Callback_proxyCallback; + ret = X_Callback_POOL_LIST[ l - 1 ]; --X_Callback_POOL_LIST.length; // ret = X_Callback_POOL_LIST.pop(); + _obj = ret( X_Closure_COMMAND_BACK ); + + _obj.kind = obj.kind; + _obj.func = obj.func; + _obj.context = obj.context; + _obj.supplement = obj.supplement; + _obj.proxy = X_Callback_proxyCallback; } else { - ret = X_Callback_actualClosure( obj ); - obj._ = X_Callback_proxyCallback; + ret = X_Callback_actualClosure( obj ); + obj.proxy = X_Callback_proxyCallback; }; X_Callback_LIVE_LIST[ X_Callback_LIVE_LIST.length ] = ret; return ret; @@ -169,30 +186,30 @@ function X_Callback_classifyCallbackArgs( arg1, arg2, arg3, alt_context ){ var obj; if( arg1 && X_Type_isFunction( arg2 ) ){ - obj = { x : arg1, f : arg2, k : X_Callback_THIS_FUNC }; + obj = { context : arg1, func : arg2, kind : X_Callback_THIS_FUNC }; } else if( arg1 && X_Type_isFunction( arg1[ 'handleEvent' ] ) ){ - obj = { x : arg1, k : X_Callback_HANDLEEVENT }; + obj = { context : arg1, kind : X_Callback_HANDLEEVENT }; arg3 = arg2; } else if( X_Type_isFunction( arg1 ) ){ arg3 = arg2; if( alt_context ){ - obj = { x : alt_context, f : arg1, k : X_Callback_THIS_FUNC }; + obj = { context : alt_context, func : arg1, kind : X_Callback_THIS_FUNC }; } else { - obj = { f : arg1, k : X_Callback_FUNC_ONLY }; + obj = { func : arg1, kind : X_Callback_FUNC_ONLY }; }; } else if( X_Type_isFunction( arg2 ) ){ //console.log( 'X_Callback_classifyCallbackArgs : arg1 が ' + arg1 + 'です' ); ie4 で error if( alt_context ){ - obj = { x : alt_context, f : arg2, k : X_Callback_THIS_FUNC }; + obj = { context : alt_context, func : arg2, kind : X_Callback_THIS_FUNC }; } else { - obj = { f : arg2, k : X_Callback_FUNC_ONLY }; + obj = { func : arg2, kind : X_Callback_FUNC_ONLY }; }; } else if( alt_context ){ - obj = { x : alt_context, k : X_Callback_HANDLEEVENT }; + obj = { context : alt_context, kind : X_Callback_HANDLEEVENT }; arg3 = arg1; } else { console.log( '不正 ' + arg1 ); @@ -201,23 +218,23 @@ function X_Callback_classifyCallbackArgs( arg1, arg2, arg3, alt_context ){ }; if( X_Type_isArray( arg3 )){ - obj.s = arg3; + obj.supplement = arg3; }; - return ( obj.x || obj.s ) ? obj : arg1; + return ( obj.context || obj.supplement ) ? obj : arg1; }; function X_Callback_actualClosure( obj ){ return function(){ if( arguments[ 0 ] === X_Closure_COMMAND_BACK ) return obj; - if( arguments[ 0 ] !== X_Closure_COMMAND_DROP ) return obj._( obj, arguments ); + if( arguments[ 0 ] !== X_Closure_COMMAND_DROP ) return obj.proxy( obj, arguments ); }; }; function X_Callback_proxyCallback( xfunc, _args ){ var args = _args || [], - thisObj = xfunc.x, - func = xfunc.f, - supp = xfunc.s, + thisObj = xfunc.context, + func = xfunc.func, + supp = xfunc.supplement, temp, ret; if( supp && supp.length ){ @@ -234,7 +251,7 @@ function X_Callback_proxyCallback( xfunc, _args ){ args = temp; }; - switch( xfunc.k ){ + switch( xfunc.kind ){ case X_Callback_THIS_FUNC : return args.length === 0 ? func.call( thisObj ) : func.apply( thisObj, args ); @@ -272,11 +289,11 @@ function X_Callback_correct( f ){ X_Callback_LIVE_LIST.splice( i, 1 ); X_Callback_POOL_LIST[ X_Callback_POOL_LIST.length ] = f; obj = f( X_Closure_COMMAND_BACK ); - delete obj.k; - if( obj.f ) delete obj.f; - if( obj.x ) delete obj.x; - if( obj.s ) delete obj.s; - delete obj._; + delete obj.kind; + if( obj.func ) delete obj.func; + if( obj.context ) delete obj.context; + if( obj.supplement ) delete obj.supplement; + delete obj.proxy; return true; }; return false; diff --git a/0.6.x/js/01_core/11_XClass.js b/0.6.x/js/01_core/11_XClass.js index 815e4c1..52207a5 100644 --- a/0.6.x/js/01_core/11_XClass.js +++ b/0.6.x/js/01_core/11_XClass.js @@ -27,7 +27,7 @@ var X_Class_killPrivateFlag = false, X_Class_traits = null, X_Class_useObjectCreate = false, // !!Object.create, http://jsperf.com/prototype-vs-object-create-perf - X_Class_use_proto_ = !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] && !!X.emptyFunction.prototype.__proto__, + X_Class_use_proto_ = !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] && !!X_emptyFunction.prototype.__proto__, // Opera Mobile 12.10 Android11 IS01 でクラスのメンバが欠落する問題に遭遇。__proto__ を使わないと動作,,, X_Class_CommonMethods = @@ -37,13 +37,13 @@ X_Class_CommonMethods = * 全ての動的メンバを削除して、インスタンスを破棄する。
* インスタンスが X.EventDispatcher とそのサブクラスの場合、次の動作をする。 *
    - *
  1. X.Event.BEFORE_KILL_INSTANCE を発火する。戻り値のビットフラグに X.Callback.PREVENT_DEFAULT が立つ場合、破棄をキャンセルし X.Event.KILL_INSTANCE_CANCELED を発火する。 + *
  2. X.Event.BEFORE_KILL_INSTANCE を発火する。戻り値のビットフラグに X_Callback_PREVENT_DEFAULT が立つ場合、破棄をキャンセルし X.Event.KILL_INSTANCE_CANCELED を発火する。 *
  3. 破棄に進む場合は、X.Event.KILL_INSTANCE を発火する。 *
  4. dispatch 中は、インスタンスの全ての dispatch が終了するまで実際の破棄を待つ。 *
  5. 実際の破棄では、インスタンスのメンバの削除に加えて全てのイベントリスナを解除する。 */ // TODO kill したインスタンスのイベントが残っていないか?これは開発用のみ - kill : function(){ + 'kill' : function(){ var instance = this, klass = X_Class_getClass( instance ), def = X_Class_getClassDef( klass ), @@ -54,10 +54,10 @@ X_Class_CommonMethods = }; X_Class_killPrivateFlag = false; // instance.kill() 内で PrivateInstance.kill() を防ぐため - if( this.instanceOf( X.EventDispatcher ) ){ + if( this[ 'instanceOf' ]( X_EventDispatcher ) ){ if( !def.isPrivate ){ - if( this.dispatch( X_Event.BEFORE_KILL_INSTANCE ) & X.Callback.PREVENT_DEFAULT ){ - this.dispatch( X_Event.KILL_INSTANCE_CANCELED ); + if( this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE ) & X_Callback_PREVENT_DEFAULT ){ + this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE_CANCELED ); return; }; if( this[ '_listeners' ] && this[ '_listeners' ][ X_Listeners_.DISPATCHING ] ){ @@ -65,18 +65,18 @@ X_Class_CommonMethods = return; }; } else { - this.dispatch( X_Event.BEFORE_KILL_INSTANCE ); + this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE ); }; // asyncDispatch の削除 for( p in X_EventDispatcher_LAZY_TIMERS ){ if( X_EventDispatcher_LAZY_TIMERS[ p ] === this ){ delete X_EventDispatcher_LAZY_TIMERS[ p ]; // 削除が先!理由は X.Timer.removeを確認。 - X.Timer.remove( parseFloat( p ) ); + X_Timer_remove( parseFloat( p ) ); }; }; - this.dispatch( X_Event.KILL_INSTANCE ); + this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE ); this._listeners && X_EventDispatcher_systemUnlisten( this ); }; @@ -92,11 +92,11 @@ X_Class_CommonMethods = i = def.userList.indexOf( instance ); if( i !== -1 ){ data = X_Class_getPrivate( instance ); - if( data[ '_listeners' ] && data[ '_listeners' ][ X_Listeners_.DISPATCHING ] && data.instanceOf( X.EventDispatcher ) ){ + if( data[ '_listeners' ] && data[ '_listeners' ][ X_Listeners_.DISPATCHING ] && data[ 'instanceOf' ]( X.EventDispatcher ) ){ data[ '_listeners' ][ X_Listeners_.KILL_RESERVED ] = true; } else { X_Class_killPrivateFlag = true; - data.kill(); + data[ 'kill' ](); }; def.dataList.splice( i, 1 ); def.userList.splice( i, 1 ); @@ -114,7 +114,7 @@ X_Class_CommonMethods = * @return {*} */ // TODO 現在 new しているインスタンスを保持してチェックする - Super : function( var_args ){ + 'Super' : function( var_args ){ var sClass = this, i = X_Class_CALLING_SUPER.indexOf( sClass ), n = -1, @@ -154,7 +154,7 @@ X_Class_CommonMethods = * @example return this.superCall( arguments.callee, param0, param1, ... ); * @return {*} オーバーライド元の関数を呼び出した戻り値。 */ - superCall : function( funcNameOrFunc, var_args ){ + 'superCall' : function( funcNameOrFunc, var_args ){ var sClass = this, args = arguments, name, p, sFunc, hit = false; @@ -191,7 +191,7 @@ X_Class_CommonMethods = case 4 : return sFunc.call( this, args[ 1 ], args[ 2 ], args[ 3 ] ); default : - args = X.Object.cloneArray( args ); + args = X_Object_cloneArray( args ); args.shift(); return sFunc.apply( this, args ); }; @@ -209,7 +209,7 @@ X_Class_CommonMethods = * @return {boolean} */ // TODO instanceof に対応したブラウザはそちらを使用 - instanceOf : function( klass ){ + 'instanceOf' : function( klass ){ var Super = this; if( this.constructor === klass ) return true; while( Super = X_Class_getClassDef( Super ).SuperClass ){ @@ -243,54 +243,77 @@ X_Class_CommonMethods = * @namespace X.Class * @alias X.Class */ -X.Class = { +X[ 'Class' ] = { /** * 設定なし。 + * @const */ - NONE : 0, + 'NONE' : 0, /** * インスタンスは破棄時(this.kill())に回収され、次回の new MyClass() 時に再利用されます。 + * @const */ - POOL_OBJECT : 1, + 'POOL_OBJECT' : 1, /** * 定義するクラスは抽象クラスになります。new AbstractClass() とするとエラーになります。 + * @const */ - ABSTRACT : 2, + 'ABSTRACT' : 2, /** * クラスの継承を禁止する。 + * @const */ - FINAL : 4, + 'FINAL' : 4, /** * 使用を中止。petanR ライブラリ使用プロジェクトから SUPER_ACCESS を消したらここも削除。 + * @const */ - SUPER_ACCESS : 8, + 'SUPER_ACCESS' : 8, /** * 内部コード、主に X.UI フレームワークに対して、フレーム外に露出するインスタンスとペアで動作する、シャドウなインスタンスの使用を宣言する。 * Javascript はインスタンス毎のカプセル化がとてもコスト高。微妙なコスト増で隠蔽されたインスタンスを使う。 + * @const */ - PRIVATE_DATA : 16, + 'PRIVATE_DATA' : 16, /** * 未実装。でも目印になるので付けておきましょう。 + * @const */ - SINGLETON : 32, + 'SINGLETON' : 32, + 'create' : X_Class_create, + + // TODO collect + + '_newPrivate' : X_Class_newPrivate, + + '_getPrivate' : X_Class_getPrivate + +}; + + + +// ------------------------------------------------------------------------- // +// --- implements ---------------------------------------------------------- // +// ------------------------------------------------------------------------- // /** * クラスを定義する。
    * X.Class.create() によるクラス定義は必ずしもコンストラクタを必要としません。クラス定義時にコンストラクタが未設定の場合、スーパークラスがあればそのコンストラクタを使用します。 + * @alias X.Class.create * @param {string} [displayName] クラスの名前 * @param {number} [classSetting=0] X.Class.POOL_OBJECT | X.Class.FINAL など * @param {__ClassBase__=} [privateClass] このクラスとペアで動作するシャドウクラス * @param {object} [props={}] このクラスのメンバと関数。コンストラクタは Constructor と書くこと * @return {__ClassBase__} */ - create : function( /* displayName, classSetting, privateClass, props */ ){ + function X_Class_create( /* displayName, classSetting, privateClass, props */ ){ var args = X_Object_cloneArray( arguments ), displayName = args[ 0 ], classSetting, @@ -340,14 +363,14 @@ X.Class = { // クラスメンバ用オブジェクトが無しでもクラスは作成可能 props = {}; } else - if( props.Constructor && X_Type_isFunction( props.Constructor ) ){ - classDef.Constructor = props.Constructor; + if( props[ 'Constructor' ] && X_Type_isFunction( props[ 'Constructor' ] ) ){ + classDef.Constructor = props[ 'Constructor' ]; }; - klass = X_Callback_actualClosure( hash = { _ : X_Class_actualConstructor } ); // TODO hash = classDef - hash.c = klass; - klass.superClassOf = X_Class_superClassOf; - klass.subClassOf = X_Class_subClassOf; + klass = X_Callback_actualClosure( hash = { proxy : X_Class_actualConstructor } ); // TODO hash = classDef + hash.klass = klass; + klass[ 'superClassOf' ] = X_Class_superClassOf; + klass[ 'subClassOf' ] = X_Class_subClassOf; if( X_Class_useObjectCreate ){ klass.prototype = X_Class_override( X_Class_override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonMethods, false ); @@ -365,7 +388,7 @@ X.Class = { klass.prototype.constructor = klass; }; - klass.name = displayName; + klass[ 'name' ] = displayName; if( opt_abstract ){ classDef.Abstract = true; @@ -377,7 +400,7 @@ X.Class = { if( opt_final ){ classDef.Final = true; } else { - klass.inherits = X_Class_inherits; + klass[ 'inherits' ] = X_Class_inherits; }; if( opt_private ){ if( classDef.privateClass ){ @@ -392,19 +415,10 @@ X.Class = { X_Class_DEF_LIST.push( classDef ); }; return klass; - }, - - _newPrivate : X_Class_newPrivate, - - _getPrivate : X_Class_getPrivate - -}; + }; -// ------------------------------------------------------------------------- // -// --- implements ---------------------------------------------------------- // -// ------------------------------------------------------------------------- // function X_Class_getClass( instance ){ var cList = X_Class_CLASS_LIST, i = cList.length, @@ -593,7 +607,7 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props * これにより pool された オブジェクト(破棄されたインスタンス) を再利用できる */ function X_Class_actualConstructor( f, args ){ - var klass = f.c, + var klass = f.klass, def = X_Class_getClassDef( klass ), dataUser = def._tempUser, instance, obj, @@ -628,7 +642,7 @@ function X_Class_actualConstructor( f, args ){ def.SuperConstructor && def.SuperConstructor.apply( instance, args ); if( ( X_Type_isObject( obj ) && obj !== instance ) || X_Type_isFunction( obj ) ){ // Class - instance.kill(); + instance[ 'kill' ](); return obj; }; return instance; diff --git a/0.6.x/js/01_core/12_XEvent.js b/0.6.x/js/01_core/12_XEvent.js index 733d9e9..5074db7 100644 --- a/0.6.x/js/01_core/12_XEvent.js +++ b/0.6.x/js/01_core/12_XEvent.js @@ -1,60 +1,119 @@ -var X_Event_last = 0, - X_Event_Rename = {}, +var X_Event_Rename = {}, X_Event_RenameTo = {}, + // TODO IFRAMEload, SCRIPTload, LINKload raw.readyState !== 'complete' && raw.readyState !== 'loaded' && this.dispatch( 'load' ) X_Event_proxy = { - load : X_UA[ 'IE' ] < 9 && { - check : function( eventDispatcher ){ - return eventDispatcher._tag === 'IFRAME' || eventDispatcher._tag === 'SCRIPT'; - }, + 'IFRAMEload' : function( eventDispatcher ){ + eventDispatcher[ 'listen' ]( 'readystatechange', X_Event_proxy.IFRAMEload_proxy ); + }, + + IFRAMEload_proxy : function( e ){ + var raw = this[ '_rawObject' ]; - f : function( e ){ - var raw = this._rawObject; - return raw.readyState !== 'complete' && raw.readyState !== 'loaded'; - } + return raw.readyState === 'complete' || raw.readyState === 'loaded' ? + this[ 'dispatch' ]( 'load' ) : X_Callback_PREVENT_DEFAULT, X_Callback_STOP_PROPAGATION; }, - contextmenu : X_UA[ 'Opera' ] && { - - rename : 'mousedown', - - f : function( e ){ - return e.button === 2; - } - - } + // X_UA[ 'Opera' ] + 'contextmenu' : function( eventDispatcher ){ + eventDispatcher[ 'listen' ]( 'mousedown', contextmenu_proxy ); + }, + contextmenu_proxy : function( e ){ + return e.button === 2 ? this[ 'dispatch' ]( 'contextmenu' ) : X_Callback_NONE; + } }, X_Event_toPointer = !X_UA_HID.POINTER && ( X_UA_HID.TOUCH ? { - touchstart : 'pointerdown', - mousedown : 'pointerdown', - touchend : 'pointerup', - mouseup : 'pointerup', - touchmove : 'pointermove', - mousemove : 'pointermove', - touchcancel : 'pointercancel', - contextmenu : 'contextmenu', - dbclick : 'dbclick', - click : 'click', - tap : 'click' + 'touchstart' : 'pointerdown', + 'mousedown' : 'pointerdown', + 'touchend' : 'pointerup', + 'mouseup' : 'pointerup', + 'touchmove' : 'pointermove', + 'mousemove' : 'pointermove', + 'touchcancel' : 'pointercancel', + 'contextmenu' : 'contextmenu', + 'dbclick' : 'dbclick', + 'click' : 'click', + 'tap' : 'click' } : { - mousedown : 'pointerdown', - mouseup : 'pointerup', - mousemove : 'pointermove', - contextmenu : 'contextmenu', - dbclick : 'dbclick', - click : 'click' + 'mousedown' : 'pointerdown', + 'mouseup' : 'pointerup', + 'mousemove' : 'pointermove', + 'contextmenu' : 'contextmenu', + 'dbclick' : 'dbclick', + 'click' : 'click' }); -// 内部イベント -X_TEMP.SYSTEM_EVENT_PRE_INIT = 5; // X_Listeners_.KILL_RESERVED に +1 した値から開始。 -X_TEMP.SYSTEM_EVENT_XTREE = 6; -X_TEMP.SYSTEM_EVENT_INIT = 7; +var // 内部イベント + X_EVENT_PRE_INIT = 5, // X_Listeners_.KILL_RESERVED に +1 した値から開始。 + X_EVENT_XTREE_READY = 6, + X_EVENT_INIT = 7, + + // 公開イベント + /* @const */ + X_EVENT_XDOM_READY = 8, + + X_EVENT_COMPLETE = 9, + X_EVENT_READY = 10, + X_EVENT_SUCCESS = 11, + X_EVENT_ERROR = 12, + X_EVENT_PROGRESS = 13, + X_EVENT_BEFORE_CANCEL = 14, + X_EVENT_CANCELED = 15, + X_EVENT_TIMEOUT = 16, + + /* @const */ + X_EVENT_BEFORE_KILL_INSTANCE = 17, + /* @const */ + X_EVENT_KILL_INSTANCE_CANCELED = 18, + /* @const */ + X_EVENT_KILL_INSTANCE = 19, + + X_EVENT_VIEW_ACTIVATE = 20, + X_EVENT_VIEW_DEACTIVATE = 21, + X_EVENT_VIEW_RESIZED = 22, + X_EVENT_VIEW_TURNED = 23, + + X_EVENT_BASE_FONT_RESIZED = 24, + + X_EVENT_BEFORE_UPDATE = 25, + X_EVENT_UPDATED = 26, + X_EVENT_AFTER_UPDATE = 27, + + X_EVENT_HASH_CHANGED = 28, + + + X_EVENT_BEFORE_UNLOAD = 29, + X_EVENT_UNLOAD = 30, + + X_EVENT_BACKEND_READY = 31, + X_EVENT_BACKEND_NONE = 32, + X_EVENT_BACKEND_RESEARCH = 33, + X_EVENT_BACKEND_CHANGED = 34, + + X_EVENT_ANIME_BEFORE_START = 35, + X_EVENT_ANIME_START = 36, + X_EVENT_ANIME = 37, + X_EVENT_ANIME_END = 38, + X_EVENT_ANIME_BEFORE_STOP = 39, + X_EVENT_ANIME_STOP = 40, + + X_EVENT_GPU_RELEASED = 41, + + X_EVENT_MEDIA_PLAYING = 42, + X_EVENT_MEDIA_BEFORE_LOOP = 43, + X_EVENT_MEDIA_LOOPED = 44, + X_EVENT_MEDIA_PAUSED = 45, + X_EVENT_MEDIA_ENDED = 46, + X_EVENT_MEDIA_WAITING = 47, + X_EVENT_MEDIA_SEEKING = 48, + + X_Event_last = 48; /** * フレームワーク内で定義されたイベント。 @@ -62,100 +121,110 @@ X_TEMP.SYSTEM_EVENT_INIT = 7; * @alias X.Event * @enum {number} */ -var X_Event = X[ 'Event' ] = { +X[ 'Event' ] = { /** * X.ViewPort で発生する。DomContentLoaded に相当。document.body.innerHTML の内容から X.Node ツリーの作成が完了した。 * このイベント以降、X.Doc.create(), X.Doc.find() 等が可能になる。 - * @const */ - 'XDOM_READY' : 8, + 'XDOM_READY' : X_EVENT_XDOM_READY, - 'COMPLETE' : 9, - 'READY' : 10, - 'SUCCESS' : 11, - 'ERROR' : 12, - 'PROGRESS' : 13, - 'BEFORE_CANCEL' : 14, - 'CANCELED' : 15, - 'TIMEOUT' : 16, + 'COMPLETE' : X_EVENT_COMPLETE, + 'READY' : X_EVENT_READY, + 'SUCCESS' : X_EVENT_SUCCESS, + 'ERROR' : X_EVENT_ERROR, + 'PROGRESS' : X_EVENT_PROGRESS, + 'BEFORE_CANCEL' : X_EVENT_BEFORE_CANCEL, + 'CANCELED' : X_EVENT_CANCELED, + 'TIMEOUT' : X_EVENT_TIMEOUT, /** * X.EventDispatcher インスタンスを kill() すると発生。キャンセル可能。 */ - 'BEFORE_KILL_INSTANCE' : 17, + 'BEFORE_KILL_INSTANCE' : X_EVENT_BEFORE_KILL_INSTANCE, /** * X.EventDispatcher インスタンスの kill() がキャンセルされた場合に発生。 */ - 'KILL_INSTANCE_CANCELED' : 18, + 'KILL_INSTANCE_CANCELED' : X_EVENT_KILL_INSTANCE_CANCELED, /** * X.EventDispatcher インスタンスの kill が確定し、kill プロセスの前に発生。 */ - 'KILL_INSTANCE' : 19, + 'KILL_INSTANCE' : X_EVENT_KILL_INSTANCE, /** * X.ViewPort で発生する。'visibilitychange', 'pageshow', window.onfocus を検出している。 */ - 'VIEW_ACTIVATE' : 20, + 'VIEW_ACTIVATE' : X_EVENT_VIEW_ACTIVATE, /** * X.ViewPort で発生する。'visibilitychange', 'pagehide', window.onblur を検出している。 */ - 'VIEW_DEACTIVATE' : 21, + 'VIEW_DEACTIVATE' : X_EVENT_VIEW_DEACTIVATE, /** * X.ViewPort で発生する。 */ - 'VIEW_RESIZED' : 22, + 'VIEW_RESIZED' : X_EVENT_VIEW_RESIZED, /** * X.ViewPort で発生する。 */ - 'VIEW_TURNED' : 23, + 'VIEW_TURNED' : X_EVENT_VIEW_TURNED, /** * X.ViewPort で発生する。ベースフォントサイズが変化すると発生する。body 直下の隠し要素のテキストサイズの変化で検出している。 */ - 'BASE_FONT_RESIZED' : 24, + 'BASE_FONT_RESIZED' : X_EVENT_BASE_FONT_RESIZED, // in_page_jump // on_screen_keyboard_show // on_screen_keyboard_hide - 'BEFORE_UPDATE' : 25,// X_System このイベントで要素のサイズを取得すると無限ループに! - 'UPDATED' : 26,// X_System - 'AFTER_UPDATE' : 27, + /** + * X_System で発生する。このイベントで要素のサイズを取得すると無限ループに! + */ + 'BEFORE_UPDATE' : X_EVENT_BEFORE_UPDATE, + /** + * X_System で発生する。X.Node ツリーへの変更を Real DOM に反映した。 + */ + 'UPDATED' : X_EVENT_UPDATED, + + /** + * X.ViewPort で発生する。X.Node ツリーへの変更を Real DOM に反映した。このイベントは lazyDispatch している。 + */ + 'AFTER_UPDATE' : X_EVENT_AFTER_UPDATE, - 'HASH_CHANGED' : 28, + 'HASH_CHANGED' : X_EVENT_HASH_CHANGED, /** * X.ViewPort で発生する。 */ - 'BEFORE_UNLOAD' : 29, + 'BEFORE_UNLOAD' : X_EVENT_BEFORE_UNLOAD, /** * X.ViewPort で発生する。 */ - 'UNLOAD' : 30, + 'UNLOAD' : X_EVENT_UNLOAD, - 'BACKEND_READY' : 31, - 'BACKEND_NONE' : 32, - 'BACKEND_RESEARCH' : 33, - 'BACKEND_CHANGED' : 34, + 'BACKEND_READY' : X_EVENT_BACKEND_READY, + 'BACKEND_NONE' : X_EVENT_BACKEND_NONE, + 'BACKEND_RESEARCH' : X_EVENT_BACKEND_RESEARCH, + 'BACKEND_CHANGED' : X_EVENT_BACKEND_CHANGED, - 'ANIME_BEFORE_START' : 35, - 'ANIME_START' : 36, - 'ANIME' : 37, - 'ANIME_END' : 38, - 'ANIME_BEFORE_STOP' : 39, // xnode.stop() のみ、指定時間による停止では呼ばれない - 'ANIME_STOP' : 40, + 'ANIME_BEFORE_START' : X_EVENT_ANIME_BEFORE_START, + 'ANIME_START' : X_EVENT_ANIME_START, + 'ANIME' : X_EVENT_ANIME, + 'ANIME_END' : X_EVENT_ANIME_END, + /** + * xnode.stop() のみ、指定時間による停止では呼ばれない + */ + 'ANIME_BEFORE_STOP' : X_EVENT_ANIME_BEFORE_STOP, + 'ANIME_STOP' : X_EVENT_ANIME_STOP, - 'GPU_RELEASED' : 41, - - 'MEDIA_PLAYING' : 42, - 'MEDIA_BEFORE_LOOP' : 43, // cancelable - 'MEDIA_LOOPED' : 44, - 'MEDIA_PAUSED' : 45, - 'MEDIA_ENDED' : 46, - 'MEDIA_WAITING' : 47, - 'MEDIA_SEEKING' : 48 -}; + 'GPU_RELEASED' : X_EVENT_GPU_RELEASED, -X_Event_last = 48; + 'MEDIA_PLAYING' : X_EVENT_MEDIA_PLAYING, + 'MEDIA_BEFORE_LOOP' : X_EVENT_MEDIA_BEFORE_LOOP, // cancelable + 'MEDIA_LOOPED' : X_EVENT_MEDIA_LOOPED, + 'MEDIA_PAUSED' : X_EVENT_MEDIA_PAUSED, + 'MEDIA_ENDED' : X_EVENT_MEDIA_ENDED, + 'MEDIA_WAITING' : X_EVENT_MEDIA_WAITING, + 'MEDIA_SEEKING' : X_EVENT_MEDIA_SEEKING +}; X_TEMP.onSystemReady.push( function(){ diff --git a/0.6.x/js/01_core/13_XEventDispatcher.js b/0.6.x/js/01_core/13_XEventDispatcher.js index 8741a0f..121525b 100644 --- a/0.6.x/js/01_core/13_XEventDispatcher.js +++ b/0.6.x/js/01_core/13_XEventDispatcher.js @@ -4,7 +4,7 @@ * *

    Arrayには、__CallbackHash__ というハッシュ、または関数が蓄えられています。 * - *

    また、イベントターゲット(EventDispatcher._rawObject)に渡された再利用可能クロージャの控えを _listeners[0] に記憶します。(ACTUAL_HANDLER) + *

    また、イベントターゲット(EventDispatcher[ '_rawObject' ])に渡された再利用可能クロージャの控えを _listeners[0] に記憶します。(ACTUAL_HANDLER) * *

    dispatch 中の状態と操作を記録し不整合が起きないようにするためのプロパティ(_listeners[1]~_listeners[4])を持ちます。イベントID が 5 から始まるのはこのためです。 * @@ -50,6 +50,9 @@ var X_EventDispatcher_once = false, X_EventDispatcher_safariPreventDefault = false, // Safari3- + /** + * @enum {number} + */ X_EventDispatcher_EVENT_TARGET_TYPE = { OTHER : 0, XHR : 1, @@ -87,7 +90,7 @@ var X_EventDispatcher_once = false, *

    listen, unlisten, dispatch という addEventListener, removeEventListener, dispatchEvent に対応する関数を持ちます。 * また listening という ActionScript3 の hasEventListener に相当する関数を持ちます。 * - *

    イベントターゲットオブジェクト(widnow, document, HTMLElement, XHR, Silverlight 等)が this._rawObject に設定されていた場合に、それらへ実際のイベント登録・解除も行います。 + *

    イベントターゲットオブジェクト(widnow, document, HTMLElement, XHR, Silverlight 等)が this[ '_rawObject' ] に設定されていた場合に、それらへ実際のイベント登録・解除も行います。 * このイベントの登録・解除はクロスブラウザで、IE5~8 の独自イベントの差異を吸収し、DOM0 に対しても複数のコールバックを登録することができます。 * *

    またコールバックに対して、this コンテキストや、追加の引数を指定もできます。 this コンテキストを指定しなかった場合、EventDispatcher インスタンスがコールバックの this になります。 @@ -102,8 +105,8 @@ var X_EventDispatcher_once = false, * @constructs EventDispatcher * @extends {__ClassBase__} */ -var EventDispatcher = X.EventDispatcher = - X.Class.create( +var X_EventDispatcher = X.EventDispatcher = + X_Class_create( 'EventDispatcher', /** @lends EventDispatcher.prototype */ @@ -141,15 +144,15 @@ var EventDispatcher = X.EventDispatcher = * アプリケーション独自のイベントをやり取りしたいだけ、という場合イベントターゲットは指定しません。 * @param {object=} opt_rawObject */ - Constructor : function( opt_rawObject ){ + 'Constructor' : function( opt_rawObject ){ if( opt_rawObject ){ - this._rawObject = opt_rawObject; + this[ '_rawObject' ] = opt_rawObject; }; }, - dispatch : X_EventDispatcher_dispatch, + 'dispatch' : X_EventDispatcher_dispatch, - listen : X_EventDispatcher_listen, + 'listen' : X_EventDispatcher_listen, /** * dispatch 時に自動で unlisten されるフラグを立てて listen する。 @@ -159,24 +162,24 @@ var EventDispatcher = X.EventDispatcher = * @param {Array} [opt_arg3=] コールバック時の引数を配列に入れる。引数がひとつでも配列を使用する。省略した場合引数なし。unlisten() に使用するので、配列も適宜に保持しておくこと。 * @return {EventDispatcher} チェインメソッド */ - listenOnce : function( type, opt_arg1, opt_arg2, opt_arg3 ){ + 'listenOnce' : function( type, opt_arg1, opt_arg2, opt_arg3 ){ X_EventDispatcher_once = true; - this.listen( type, opt_arg1, opt_arg2, opt_arg3 ); + this[ 'listen' ]( type, opt_arg1, opt_arg2, opt_arg3 ); X_EventDispatcher_once = false; return this; }, - unlisten : X_EventDispatcher_unlisten, + 'unlisten' : X_EventDispatcher_unlisten, /** *

    イベントリスナの登録状況を真偽値で返す。戻り値が数値(index)の場合もあるが、これは内部のみで使用。 - *

    this.listening(); のように type を省略した場合、一つでも登録があれば true を返す。 - *

    this.listening( 'myevent' ); と type だけを与えた場合、その type に登録があれば true を返す。 + *

    this[ 'listening' ](); のように type を省略した場合、一つでも登録があれば true を返す。 + *

    this[ 'listening' ]( 'myevent' ); と type だけを与えた場合、その type に登録があれば true を返す。 *

    type と イベントリスナの組み合わせが登録されているかを調べる場合は、listen 時の thisObject や args(Array) も一致させて渡す必要がある。 * * @example - * this.listen( [ 'myevent', 'yourevent' ], this, onMyEvent, args = [ 1, 'a' ] ); - * this.listening( 'myevent', this, onMyEvent, args ) === true; + * this[ 'listen' ]( [ 'myevent', 'yourevent' ], this, onMyEvent, args = [ 1, 'a' ] ); + * this[ 'listening' ]( 'myevent', this, onMyEvent, args ) === true; * * @return {number|boolean} * @param {string|number} opt_type @@ -184,7 +187,7 @@ var EventDispatcher = X.EventDispatcher = * @param {function|Array} opt_arg2 * @param {Array} opt_arg3 */ - listening : function( opt_type, opt_arg1, opt_arg2, opt_arg3 ){ + 'listening' : function( opt_type, opt_arg1, opt_arg2, opt_arg3 ){ var listeners = this[ '_listeners' ], lock = X_EventDispatcher_lock || X_EventDispatcher_unlock, list, cbHash, unlistens, i, f; @@ -193,7 +196,7 @@ var EventDispatcher = X.EventDispatcher = if( !listeners || !( list = listeners[ opt_type ] ) ) return false; if( opt_arg1 === undefined ) return true; - if( opt_arg1.k ){ + if( opt_arg1.kind ){ cbHash = opt_arg1; } else { cbHash = X_Callback_classifyCallbackArgs( opt_arg1, opt_arg2, opt_arg3, this ); @@ -202,12 +205,12 @@ var EventDispatcher = X.EventDispatcher = if( ( unlistens = listeners[ X_Listeners_.UNLISTENS ] ) && ( unlistens = unlistens[ opt_type ] ) ){ for( i = unlistens.length; i; ){ f = unlistens[ --i ]; - if( f === cbHash || ( f.x === cbHash.x && f.f === cbHash.f && f.s === cbHash.s && f.lock === lock ) ) return false; + if( f === cbHash || ( f.context === cbHash.context && f.func === cbHash.func && f.supplement === cbHash.supplement && f.lock === lock ) ) return false; }; }; for( i = list.length; i; ){ f = list[ --i ]; - if( f === cbHash || ( f.x === cbHash.x && f.f === cbHash.f && f.s === cbHash.s && f.lock === lock ) ){ + if( f === cbHash || ( f.context === cbHash.context && f.func === cbHash.func && f.supplement === cbHash.supplement && f.lock === lock ) ){ // index を要求された場合、lock されていない、または unlock なら index を返す return X_EventDispatcher_needsIndex ? i : true; }; @@ -218,20 +221,20 @@ var EventDispatcher = X.EventDispatcher = /** * delay(ミリ秒)後にイベントを dispatch する。戻り値は uid = X.Timer.once() のタイマーID(数値)。X.Timer.remove(uid) でタイマーを解除して dispatch を中止できる。 * kill() 時には内部でまだ呼ばれていないタイマーの X.Timer.remove() が行われる。インスタンスが破棄された後にタイマーが呼ばれることがないので神経質にならなくても安全に使える。 - * @example this.asyncDispatch( 'myevent' ); + * @example this[ 'asyncDispatch' ]( 'myevent' ); * // どちらのコードも同じ動作をする。 - * this.asyncDispatch( 0, 'myevent' ); + * this[ 'asyncDispatch' ]( 0, 'myevent' ); * @param {number|eventHash|string} delay ms 省略した場合は 0 として扱う asyncDispatch( 'myevent' ) -> asyncDispatch( 0, 'myevent' ) * @param {eventHash|string|number} e イベントを表す数値、文字列、{ type : XXX, ... } なオブジェクト * @return {number} X.Timer.add() の戻り値 */ - asyncDispatch : function( delay, e ){ + 'asyncDispatch' : function( delay, e ){ var timerID; if( delay && e === undefined ){ e = delay; delay = 0; }; - timerID = X.Timer.add( delay, 1, this, X_EventDispatcher_dispatch, [ e ] ); + timerID = X_Timer_add( delay, 1, this, X_EventDispatcher_dispatch, [ e ] ); X_EventDispatcher_LAZY_TIMERS[ timerID ] = this; return timerID; } @@ -261,10 +264,10 @@ function X_EventDispatcher_dispatch( e ){ // 数値, 文字が渡された場合 if( !type ){ - e = { type : type = e }; + e = { 'type' : type = e }; }; - e.target = e.target || this; - e.currentTarget = e.currentTarget || this; + e[ 'target' ] = e[ 'target' ] || this; + e[ 'currentTarget' ] = e[ 'currentTarget' ] || this; if( listeners[ X_Listeners_.DISPATCHING ] ){ ++listeners[ X_Listeners_.DISPATCHING ]; @@ -295,7 +298,7 @@ function X_EventDispatcher_dispatch( e ){ unlistens.indexOf( f ) === -1 && ( unlistens[ unlistens.length ] = f ); }; - if( r & X.Callback.STOP_NOW ){ + if( r & X_Callback_STOP_NOW ){ sysOnly = true; }; ret |= X_Type_isFinite( r ) ? r : 0; @@ -311,12 +314,11 @@ function X_EventDispatcher_dispatch( e ){ f = list[ i ]; X_EventDispatcher_once = f[ 4 ]; X_EventDispatcher_lock = f[ 5 ]; - this.listen( f[ 0 ], f[ 1 ], f[ 2 ], f[ 3 ] ); - X_EventDispatcher_once = false; - X_EventDispatcher_lock = false; + this[ 'listen' ]( f[ 0 ], f[ 1 ], f[ 2 ], f[ 3 ] ); f.length = 0; }; list.length = 0; + X_EventDispatcher_once = X_EventDispatcher_lock = false; delete listeners[ X_Listeners_.RESERVES ]; }; @@ -330,7 +332,7 @@ function X_EventDispatcher_dispatch( e ){ //if( X_EMPTY_OBJECT[ type ] ) continue; list = unlistens[ type ]; for( i = list.length; i; ){ - this.unlisten( type, list[ --i ] ); + this[ 'unlisten' ]( type, list[ --i ] ); }; list.length = 0; delete unlistens[ type ]; @@ -347,7 +349,7 @@ function X_EventDispatcher_dispatch( e ){ for( timerID in X_EventDispatcher_LAZY_TIMERS ){ if( X_EventDispatcher_LAZY_TIMERS[ timerID ] === this ) return ret; }; */ - this.kill(); + this[ 'kill' ](); }; }; @@ -359,25 +361,25 @@ function X_EventDispatcher_dispatch( e ){ * ユーザーが触ることは無いが、システム内部でロックフラグを立てたリスナは、立てられていないフラグとは区別される。 * この仕組みによってシステムの登録したリスナを、システム外から不用意に削除されることを回避する。 * @example // 'myEvent' に対して、 this コンテキストを指定して 、コールバック関数を渡す。 - * this.listen( 'myEvent', context, func ); + * this[ 'listen' ]( 'myEvent', context, func ); * // 'myEvent' に対して、 this コンテキストを指定して 、コールバック関数と追加の引数を渡す。 * args = [ 'arg1', 'arg2', 3 ]; // unlisten( 'myEvent', context, func, args ) で使用するので Array も控えておく。 - * this.listen( 'myEvent', context, func, args ); + * this[ 'listen' ]( 'myEvent', context, func, args ); * // 'myEvent' に対して、 listener オブジェクトを渡す。listener は handleEvent という関数を持つオブジェクトのこと。 * listener.handleEvent = function( e ){}; - * this.listen( 'myEvent', listener ); + * this[ 'listen' ]( 'myEvent', listener ); * // 'myEvent' に対して、 listener オブジェクトと追加の引数を渡す。 * listener.handleEvent = function( e, arg1, arg2, arg3 ){}; - * this.listen( 'myEvent', listener, [ arg1, arg2, arg3 ] ); + * this[ 'listen' ]( 'myEvent', listener, [ arg1, arg2, arg3 ] ); * // 'myEvent' に対して、 function を渡す。 - * this.listen( 'myEvent', onMyEvent ); + * this[ 'listen' ]( 'myEvent', onMyEvent ); * // 'myEvent' に対して、 function と追加の引数を渡す。 - * this.listen( 'myEvent', onMyEvent, args ); + * this[ 'listen' ]( 'myEvent', onMyEvent, args ); * // 次の二つは同じ動作です。 this コンテキストが与えられなかった場合、コールバックの this は発火元インスタンスになります。 - * this.listen( 'myEvent', this [, func [, args ] ] ); - * this.listen( 'myEvent' [, func [, args ] ] ); + * this[ 'listen' ]( 'myEvent', this [, func [, args ] ] ); + * this[ 'listen' ]( 'myEvent' [, func [, args ] ] ); * // 複数のイベントタイプを同時に登録。コールバックは同じ指定が使われる。 - * this.listen( [ 'open', 'close', 'ready' ], onUpdate ); + * this[ 'listen' ]( [ 'open', 'close', 'ready' ], onUpdate ); * * @alias EventDispatcher.prototype.listen * @param {string|number|Array.} type 配列を指定した場合、複数のイベントタイプに対して同じコールバックを登録する。 @@ -400,15 +402,15 @@ function X_EventDispatcher_listen( type, opt_arg1, opt_arg2, opt_arg3 ){ if( X_Type_isArray( type ) ){ for( i = type.length; i; ){ - this.listen( type[ --i ], opt_arg1, opt_arg2, opt_arg3 ); + this[ 'listen' ]( type[ --i ], opt_arg1, opt_arg2, opt_arg3 ); }; return this; }; - raw = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ); + raw = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ); add = raw && ( !listeners || !listeners[ type ] ) && X_Type_isString( type ); - if( this.listening( type, opt_arg1 || this, opt_arg2, opt_arg3 ) ) return this; + if( this[ 'listening' ]( type, opt_arg1 || this, opt_arg2, opt_arg3 ) ) return this; if( !listeners ) listeners = this[ '_listeners' ] = {}; list = listeners[ type ] || ( listeners[ type ] = [] ); @@ -428,11 +430,11 @@ function X_EventDispatcher_listen( type, opt_arg1, opt_arg2, opt_arg3 ){ */ function X_EventDispatcher_systemListen( that, type, opt_arg1, opt_arg2, opt_arg3 ){ X_EventDispatcher_lock = true; - that.listen( type, opt_arg1, opt_arg2, opt_arg3 ); + that[ 'listen' ]( type, opt_arg1, opt_arg2, opt_arg3 ); X_EventDispatcher_lock = false; }; -// TODO this.listen(type) は this リスナの登録なのに、this.unlisten(type)は全てのtypeの削除、と不一致 +// TODO this[ 'listen' ](type) は this リスナの登録なのに、this[ 'unlisten' ](type)は全てのtypeの削除、と不一致 /** * イベントリスナの解除を行う。登録時と同じ引数を与える必要がある。kill() ですべてのイベントが解除されるので、途中で解除されるイベント以外は kill() に任せてしまってよい。 @@ -450,7 +452,7 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){ if( X_Type_isArray( opt_type ) ){ for( i = opt_type.length; i; ){ - this.unlisten( opt_type[ --i ], opt_arg1, opt_arg2, opt_arg3 ); + this[ 'unlisten' ]( opt_type[ --i ], opt_arg1, opt_arg2, opt_arg3 ); if( !opt_type[ i ] ){ alert( '不正な unlisten Array' ); }; @@ -465,9 +467,9 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){ if( opt_type < X_Listeners_.KILL_RESERVED ) continue; list = listeners[ opt_type ]; for( i = list.length; i; ){ - this.unlisten( opt_type, list[ --i ] ); // override されていることがあるので、必ず unlisten を使用 + this[ 'unlisten' ]( opt_type, list[ --i ] ); // override されていることがあるので、必ず unlisten を使用 }; - // this.unlisten( opt_type ); これは無茶! + // this[ 'unlisten' ]( opt_type ); これは無茶! }; return this; } else @@ -475,7 +477,7 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){ // 同一タイプを全て削除 if( list = listeners[ opt_type ] ){ for( i = list.length; i; ){ - this.unlisten( opt_type, list[ --i ] ); // override されていることがあるので、必ず unlisten を使用 + this[ 'unlisten' ]( opt_type, list[ --i ] ); // override されていることがあるので、必ず unlisten を使用 }; }; return this; @@ -492,7 +494,7 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){ }; X_EventDispatcher_needsIndex = true; - i = this.listening( opt_type, opt_arg1, opt_arg2, opt_arg3 ); + i = this[ 'listening' ]( opt_type, opt_arg1, opt_arg2, opt_arg3 ); X_EventDispatcher_needsIndex = false; if( i === false ) return this; @@ -507,7 +509,7 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){ delete f.once; list.splice( i, 1 ); if( !list.length ){ - raw = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ); + raw = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ); delete listeners[ opt_type ]; //empty = X_Object_isEmpty( listeners ); // TODO カウンター @@ -531,7 +533,7 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){ */ function X_EventDispatcher_systemUnlisten( that, type, opt_arg1, opt_arg2, opt_arg3 ){ X_EventDispatcher_unlock = true; - that.unlisten( type, opt_arg1, opt_arg2, opt_arg3 ); + that[ 'unlisten' ]( type, opt_arg1, opt_arg2, opt_arg3 ); X_EventDispatcher_unlock = false; }; @@ -541,7 +543,7 @@ function X_EventDispatcher_addEvent( that, type, raw, list ){ if( X_Type_isArray( type ) ){ for( i = type.length; i; ){ - X_EventDispatcher_systemListen( that, type[ --i ], X.emptyFunction ); + X_EventDispatcher_systemListen( that, type[ --i ], X_emptyFunction ); console.log( 'events fix > ' + type[ i ] ); }; } else { @@ -641,7 +643,7 @@ var X_EventDispatcher_actualAddEvent = * animation も怪しい、、、 */ function X_EventDispatcher_iOSTransitionEndDispatch( e ){ - return X_Node_getXNode( this ).dispatch( X_Event_RenameTo[ e.type ] || e.type ); + return X_Node_getXNode( this )[ 'dispatch' ]( X_Event_RenameTo[ e.type ] || e.type ); }; /* @@ -649,7 +651,7 @@ function X_EventDispatcher_iOSTransitionEndDispatch( e ){ * http://msdn.microsoft.com/ja-jp/library/cc189018%28v=vs.95%29.aspx#the_sender_parameter_and_event_data */ function X_EventDispatcher_sliverLightDispatch( sender, e, type ){ - return this.dispatch( type ); + return this[ 'dispatch' ]( type ); }; function X_EventDispatcher_removeEvent( that, type, raw, list, skip ){ @@ -658,7 +660,7 @@ function X_EventDispatcher_removeEvent( that, type, raw, list, skip ){ if( X_Type_isArray( type ) ){ for( i = type.length; i; ){ - X_EventDispatcher_systemUnlisten( that, type[ --i ], X.emptyFunction ); + X_EventDispatcher_systemUnlisten( that, type[ --i ], X_emptyFunction ); }; } else { X_EventDispatcher_actualRemoveEvent( that, type, raw, list, skip ); @@ -716,7 +718,7 @@ var X_EventDispatcher_actualRemoveEvent = case X_EventDispatcher_EVENT_TARGET_TYPE.XHR : X_Callback_correct( raw[ 'on' + type ] ); - raw[ 'on' + type ] = X.emptyFunction; + raw[ 'on' + type ] = X_emptyFunction; raw[ 'on' + type ] = ''; break; @@ -724,7 +726,7 @@ var X_EventDispatcher_actualRemoveEvent = if( raw.attachEvent ){ raw.detachEvent( 'on' + type, that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ] ); } else { - raw[ 'on' + type ] = X.emptyFunction; + raw[ 'on' + type ] = X_emptyFunction; raw[ 'on' + type ] = ''; }; @@ -745,12 +747,12 @@ var X_EventDispatcher_actualRemoveEvent = case X_EventDispatcher_EVENT_TARGET_TYPE.XHR : X_Callback_correct( raw[ 'on' + type ] ); - raw[ 'on' + type ] = X.emptyFunction; + raw[ 'on' + type ] = X_emptyFunction; raw[ 'on' + type ] = ''; break; default : - raw[ 'on' + type ] = X.emptyFunction; + raw[ 'on' + type ] = X_emptyFunction; raw[ 'on' + type ] = ''; if( !skip ){ @@ -771,23 +773,19 @@ var X_EventDispatcher_actualHandleEvent = (function(){ var ret; - //if( event.type === 'readystatechange' && this._tag && X.Dom.Event._LOAD_FIX_TAGS[ this._tag ] ){ - //type = 'readystatechange'; - //}; - - ret = this.dispatch( new X.Dom.Event( event, this, this._rawObject ) ); + ret = this[ 'dispatch' ]( new X_DomEvent( event, this, this[ '_rawObject' ] ) ); - if( ret & X.Callback.STOP_PROPAGATION ){ + if( ret & X_Callback_STOP_PROPAGATION ){ event.cancelBubble = true; }; - if( ret & X.Callback.PREVENT_DEFAULT ){ - this._tag === 'A' && this._rawObject.blur(); + if( ret & X_Callback_PREVENT_DEFAULT ){ + this[ '_tag' ] === 'A' && this[ '_rawObject' ].blur(); return event.returnValue = false; }; }) : //X_UA_EVENT.W3C || X_UA_EVENT.DOM0 (function( e ){ - var ev = new X.Dom.Event( e, this ), + var ev = new X_DomEvent( e, this ), ret = X_Callback_NONE, i, l; //console.log( '>>>>>>>>>> ' + e.type ); @@ -795,22 +793,22 @@ var X_EventDispatcher_actualHandleEvent = if( X_Type_isArray( ev ) ){ if( ev.length === 0 ){ // TouchEvent の後に発生した MouseEvent のキャンセル - ret = X.Callback.STOP_PROPAGATION | X.Callback.PREVENT_DEFAULT; + ret = X_Callback_STOP_PROPAGATION | X_Callback_PREVENT_DEFAULT; } else { for( i = 0, l = ev.length; i < l; ++i ){ //console.log( 'handleEvent ' + ev[ i ].type ); - ret |= this.dispatch( ev[ i ] ) || 0; - }; + ret |= this[ 'dispatch' ]( ev[ i ] ) || 0; + }; }; } else { - ret = this.dispatch( ev ); + ret = this[ 'dispatch' ]( ev ); }; - if( ret & X.Callback.STOP_PROPAGATION ){ + if( ret & X_Callback_STOP_PROPAGATION ){ e.stopPropagation(); }; - if( ret & X.Callback.PREVENT_DEFAULT ){ - this._tag === 'A' && this._rawObject.blur(); + if( ret & X_Callback_PREVENT_DEFAULT ){ + this[ '_tag' ] === 'A' && this[ '_rawObject' ].blur(); e.preventDefault(); if( X_UA[ 'WebKit' ] < 525.13 ){ // Safari3- if( e.type === 'click' || e.type === 'dbclick' ){ @@ -823,7 +821,7 @@ var X_EventDispatcher_actualHandleEvent = if( X_UA[ 'WebKit' ] < 525.13 ){ // Safari3- document.documentElement.onclick = - document.documentElement.ondbclick = function( e ){ + document.documentElement[ 'ondbclick' ] = function( e ){ if( X_EventDispatcher_safariPreventDefault ){ X_EventDispatcher_safariPreventDefault = false; e.preventDefault(); @@ -836,7 +834,7 @@ if( X_UA[ 'WebKit' ] < 525.13 ){ // Safari3- // 退避したイベントの復帰 function X_EventDispatcher_toggleAllEvents( that, add ){ var list = that[ '_listeners' ], - raw = that._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( that ), + raw = that[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( that ), func = add ? X_EventDispatcher_addEvent : X_EventDispatcher_removeEvent, type; if( !list || !raw ) return; diff --git a/0.6.x/js/01_core/14_XTimer.js b/0.6.x/js/01_core/14_XTimer.js index d2dbd8f..41b4fcf 100644 --- a/0.6.x/js/01_core/14_XTimer.js +++ b/0.6.x/js/01_core/14_XTimer.js @@ -42,7 +42,7 @@ var * @function * @return {number} ミリ秒 */ - X_Timer_now = Date.now || function(){ return +new Date; }, + X_Timer_now = Date.now || ( function(){ return +new Date; } ), X_Timer_SET_TIMEOUT = window.setTimeout, X_Timer_CLEAR_TIMEOUT = window.clearTimeout, @@ -79,7 +79,82 @@ var X_Timer_REQ_FRAME_LIST = [], X_Timer_requestID = 0, - X_Timer_busyOnFrame = false; + X_Timer_busyOnFrame = false, + + /** + * requestAnimationFrame をセットします。 + * @alias X.Timer.requestFrame + * @function + * @param {*} args1 コールバックのための最大で 3 つの引数を指定します。参考:__CallbackHash__ + * @param {*} args2 + * @param {*} args3 + * @return {number} タイマーID。1 以上の数値。タイマーの解除に使用。 + */ + X_Timer_requestFrame = X_Timer_REQ_ANIME_FRAME ? + (function( args1, args2, args3 ){ + var i = X_Timer_REQ_FRAME_LIST.length, + f; + i === 0 && ( X_Timer_requestID = X_Timer_REQ_ANIME_FRAME( X_Timer_onEnterFrame ) ); + f = X_Timer_REQ_FRAME_LIST[ i ] = X_Callback_classifyCallbackArgs( args1, args2, args3 ); + return f.uid = ++X_Timer_uid; + }) : + (function( args1, args2, args3 ){ + var i = X_Timer_REQ_FRAME_LIST.length, + f; + i === 0 && ( X_Timer_requestID = X_Timer_add( 0, 1, X_Timer_onEnterFrame ) ); + f = X_Timer_REQ_FRAME_LIST[ i ] = X_Callback_classifyCallbackArgs( args1, args2, args3 ); + return f.uid = ++X_Timer_uid; + }), + + /** + * requestAnimationFrame を解除します。登録時に受け取ったタイマーIDを使用します。 + * @alias X.Timer.cancelFrame + * @function + * @param {number} タイマーID + */ + X_Timer_cancelFrame = X_Timer_CANCEL_ANIME_FRAME ? + (function( uid ){ + var list = X_Timer_REQ_FRAME_LIST, + l = list.length, + i = l, + f; + // fire 中の cancel + if( X_Timer_busyOnFrame ){ + if( !X_Timer_removal ) X_Timer_removal = {}; + X_Timer_removal[ uid ] = true; + } else { + for( ; i; ){ + if( ( f = list[ --i ] ).uid < uid ) break; + if( f.uid === uid ){ + list.splice( i, 1 ); + // gecko では無い場合がある + l === 1 && X_Timer_CANCEL_ANIME_FRAME && X_Timer_CANCEL_ANIME_FRAME( X_Timer_requestID ); + break; + }; + }; + }; + }) : + (function( uid ){ + var list = X_Timer_REQ_FRAME_LIST, + l = list.length, + i = l, + f; + // fire 中の cancel + if( X_Timer_busyOnFrame ){ + if( !X_Timer_removal ) X_Timer_removal = {}; + X_Timer_removal[ uid ] = true; + } else { + for( ; i; ){ + if( ( f = list[ --i ] ).uid < uid ) break; + if( f.uid === uid ){ + list.splice( i, 1 ); + l === 1 && X_Timer_remove( X_Timer_requestID ); + break; + }; + }; + }; + }); + // ------------------------------------------------------------------------- // // --- interface ----------------------------------------------------------- // @@ -93,25 +168,41 @@ var *

    setTimeout のコールバックに文字列しか指定できないブラウザがあり対策しています。 *

    requestAnimationFrame をラップします。ベンダープレフィックス付の requestAnimationFrame もない場合、setTimeout にフォールバックします。 * - * @example X.Timer.add( 1000, 5, thisContext, onTimer ); - * * @namespace X.Timer * @alias X.Timer */ -X.Timer = { +X[ 'Timer' ] = { - now : X_Timer_now, + 'now' : X_Timer_now, + + 'add' : X_Timer_add, + 'once' : X_Timer_once, + + 'remove' : X_Timer_remove, + + 'requestFrame' : X_Timer_requestFrame, + + 'cancelFrame' : X_Timer_cancelFrame + +}; + +// ------------------------------------------------------------------------- // +// --- implements ---------------------------------------------------------- // +// ------------------------------------------------------------------------- // + /** * タイマーをセットします。 + * @alias X.Timer.add * @param {number} time ミリ秒 * @param {number} opt_count 回数。省略可能。指定回数で自動でタイマーを破棄します。0 を指定した場合無限にタイマーが呼ばれます。省略した場合 0 と同じです。 * @param {*} args1 コールバックのための最大で 3 つの引数を指定します。参考:__CallbackHash__ * @param {*} args2 * @param {*} args3 * @return {number} タイマーID。1 以上の数値。タイマーの解除に使用。 + * @example X.Timer.add( 1000, 5, thisContext, onTimer ); */ - add : function( time, opt_count, args1, args2, args3 ){ + function X_Timer_add( time, opt_count, args1, args2, args3 ){ var list = X_Timer_TICKET_LIST, hash, obj; time = time < X_Timer_INTERVAL_TIME ? 1 : time / X_Timer_INTERVAL_TIME | 0; // 正の数で使える「Math.floor(x)」を「(x | 0)」に; @@ -126,7 +217,7 @@ X.Timer = { hash = X_Callback_classifyCallbackArgs( args1, args2, args3 ); if( !hash ) return -1; // dev only - if( !hash.k ) hash = { f : hash }; + if( !hash.kind ) hash = { func : hash }; hash.time = time; hash.last = time; hash.count = opt_count; @@ -135,25 +226,27 @@ X.Timer = { !X_Timer_busyTimeout && X_Timer_update(); return X_Timer_uid; - }, + }; /** * 1 回呼ばれたら解除されるタイマーをセットします。 + * @alias X.Timer.once * @param {number} time ミリ秒 * @param {*} args1 コールバックのための最大で 3 つの引数を指定します。参考:__CallbackHash__ * @param {*} args2 * @param {*} args3 * @return {number} タイマーID。1 以上の数値。タイマーの解除に使用。 */ - once : function( time, args1, args2, args3 ){ - return X.Timer.add( time, 1, args1, args2, args3 ); - }, + function X_Timer_once( time, args1, args2, args3 ){ + return X_Timer_add( time, 1, args1, args2, args3 ); + }; /** * タイマーを解除します。登録時に受け取ったタイマーIDを使用します。 + * @alias X.Timer.remove * @param {number} タイマーID */ - remove : function( uid ){ + function X_Timer_remove( uid ){ var list = X_Timer_TICKET_LIST, i = list.length, l = i, @@ -182,7 +275,7 @@ X.Timer = { break; }; }; - !lazy && eventDispatcher.kill(); + !lazy && eventDispatcher[ 'kill' ](); }; */ }; @@ -191,85 +284,7 @@ X.Timer = { }; }; }; - }, - - /** - * requestAnimationFrame をセットします。 - * @function - * @param {*} args1 コールバックのための最大で 3 つの引数を指定します。参考:__CallbackHash__ - * @param {*} args2 - * @param {*} args3 - * @return {number} タイマーID。1 以上の数値。タイマーの解除に使用。 - */ - requestFrame : X_Timer_REQ_ANIME_FRAME ? - (function( args1, args2, args3 ){ - var i = X_Timer_REQ_FRAME_LIST.length, - f; - i === 0 && ( X_Timer_requestID = X_Timer_REQ_ANIME_FRAME( X_Timer_onEnterFrame ) ); - f = X_Timer_REQ_FRAME_LIST[ i ] = X_Callback_classifyCallbackArgs( args1, args2, args3 ); - return f.uid = ++X_Timer_uid; - }) : - (function( args1, args2, args3 ){ - var i = X_Timer_REQ_FRAME_LIST.length, - f; - i === 0 && ( X_Timer_requestID = X.Timer.add( 0, 1, X_Timer_onEnterFrame ) ); - f = X_Timer_REQ_FRAME_LIST[ i ] = X_Callback_classifyCallbackArgs( args1, args2, args3 ); - return f.uid = ++X_Timer_uid; - }), - - /** - * requestAnimationFrame を解除します。登録時に受け取ったタイマーIDを使用します。 - * @function - * @param {number} タイマーID - */ - cancelFrame : X_Timer_CANCEL_ANIME_FRAME ? - (function( uid ){ - var list = X_Timer_REQ_FRAME_LIST, - l = list.length, - i = l, - f; - // fire 中の cancel - if( X_Timer_busyOnFrame ){ - if( !X_Timer_removal ) X_Timer_removal = {}; - X_Timer_removal[ uid ] = true; - } else { - for( ; i; ){ - if( ( f = list[ --i ] ).uid < uid ) break; - if( f.uid === uid ){ - list.splice( i, 1 ); - // gecko では無い場合がある - l === 1 && X_Timer_CANCEL_ANIME_FRAME && X_Timer_CANCEL_ANIME_FRAME( X_Timer_requestID ); - break; - }; - }; - }; - }) : - (function( uid ){ - var list = X_Timer_REQ_FRAME_LIST, - l = list.length, - i = l, - f; - // fire 中の cancel - if( X_Timer_busyOnFrame ){ - if( !X_Timer_removal ) X_Timer_removal = {}; - X_Timer_removal[ uid ] = true; - } else { - for( ; i; ){ - if( ( f = list[ --i ] ).uid < uid ) break; - if( f.uid === uid ){ - list.splice( i, 1 ); - l === 1 && X.Timer.remove( X_Timer_requestID ); - break; - }; - }; - }; - }) - -}; - -// ------------------------------------------------------------------------- // -// --- implements ---------------------------------------------------------- // -// ------------------------------------------------------------------------- // + }; if( X_UA[ 'IE4' ] || X_UA[ 'MacIE' ] ){ X.Timer[ '_' ] = X_Timer_onTimeout; @@ -307,10 +322,10 @@ function X_Timer_onTimeout(){ X_Timer_currentUID = q.uid; - if( q.k ){ + if( q.kind ){ r = X_Callback_proxyCallback( q, [] ); } else { - r = q.f(); + r = q.func(); }; //console.log( 'fire....' ); @@ -337,7 +352,7 @@ function X_Timer_onTimeout(){ X_Timer_skipUpdate = true; for( uid in X_Timer_removal ){ //if( X_EMPTY_OBJECT[ uid ] ) continue; - X.Timer.remove( uid ); + X_Timer_remove( uid ); }; X_Timer_skipUpdate = false; X_Timer_removal = null; @@ -417,14 +432,14 @@ function X_Timer_onEnterFrame( time ){ list.splice( 0, l ); if( list.length ){ - X_Timer_requestID = X_Timer_REQ_ANIME_FRAME ? X_Timer_REQ_ANIME_FRAME( X_Timer_onEnterFrame ) : X.Timer.add( 0, 1, X_Timer_onEnterFrame ); + X_Timer_requestID = X_Timer_REQ_ANIME_FRAME ? X_Timer_REQ_ANIME_FRAME( X_Timer_onEnterFrame ) : X_Timer_add( 0, 1, X_Timer_onEnterFrame ); }; X_Timer_busyOnFrame = false; if( X_Timer_removal ){ for( uid in X_Timer_removal ){ //if( X_EMPTY_OBJECT[ uid ] ) continue; - X.Timer.cancelFrame( X_Timer_removal[ uid ] ); + X_Timer_cancelFrame( X_Timer_removal[ uid ] ); }; X_Timer_removal = null; }; diff --git a/0.6.x/js/01_core/15_XSystem.js b/0.6.x/js/01_core/15_XSystem.js index 3345d1b..3b0e9df 100644 --- a/0.6.x/js/01_core/15_XSystem.js +++ b/0.6.x/js/01_core/15_XSystem.js @@ -5,7 +5,7 @@ var X_System_MESSAGE_RECIVERS = X_System_postMessageAccessKey && {}, X_System = X_Class_override( - new X.EventDispatcher(), + X_EventDispatcher(), { monitor : function(){ @@ -20,7 +20,7 @@ var if( !X_System_postMessageAccessKey ) return; // name にスペースは含まない X_System_MESSAGE_RECIVERS[ name + key ] = callback; - X_ViewPort.listen( 'message', X_System ); + X_ViewPort[ 'listen' ]( 'message', X_System ); return X_System_postMessageAccessKey + '-' + name + key; }, diff --git a/0.6.x/js/01_core/16_XViewPort.js b/0.6.x/js/01_core/16_XViewPort.js index 21a3547..d31a5fe 100644 --- a/0.6.x/js/01_core/16_XViewPort.js +++ b/0.6.x/js/01_core/16_XViewPort.js @@ -10,9 +10,9 @@ var X_ViewPort_readyState, X_ViewPort_hScrollbarSize, X_Dom_detectFontSize = !( X_UA[ 'IE' ] < 9 || X_UA[ 'iOS' ] ) && function(){ - var size = X_Node_fontSizeNode._rawObject.offsetHeight; + var size = X_Node_fontSizeNode[ '_rawObject' ].offsetHeight; if( X_ViewPort_baseFontSize !== size ){ - X_ViewPort_baseFontSize && X_ViewPort.asyncDispatch( X_Event.BASE_FONT_RESIZED ); + X_ViewPort_baseFontSize && X_ViewPort[ 'asyncDispatch' ]( X_EVENT_BASE_FONT_RESIZED ); X_ViewPort_baseFontSize = size; }; }, @@ -24,47 +24,47 @@ var X_ViewPort_readyState, //console.log( '-- orientationchange : ' + X.ViewPort.getSize[ 0 ] + ' ' + X.ViewPort.getSize[ 1 ] ); }, - X_ViewPort_document = new X.EventDispatcher( document ), + X_ViewPort_document = X_EventDispatcher( document ), X_ViewPort = X_Class_override( - new X.EventDispatcher( window ), + X_EventDispatcher( window ), { - handleEvent : function( e ){ + 'handleEvent' : function( e ){ var href, i, name; switch( e.type ){ case 'beforeunload' : // ie では a href="javascript" な要素でも beforeunload が起こる - href = e.target && e.target.attr && e.target.attr( 'href' ); - if( href && href.indexOf && href.indexOf( 'javascript:' ) === 0 ) return X.Callback.PREVENT_DEFAULT | X.Callback.STOP_PROPAGATION; + href = e.target && e.target[ 'attr' ] && e.target[ 'attr' ]( 'href' ); + if( href && href.indexOf && href.indexOf( 'javascript:' ) === 0 ) return X_Callback_PREVENT_DEFAULT | X_Callback_STOP_PROPAGATION; - return X_ViewPort.dispatch( X_Event.BEFORE_UNLOAD ); + return X_ViewPort[ 'dispatch' ]( X_EVENT_BEFORE_UNLOAD ); case 'unload' : - X_ViewPort.dispatch( X_Event.UNLOAD ); + X_ViewPort[ 'dispatch' ]( X_EVENT_UNLOAD ); //alert('unload'); - X_ViewPort_document.kill(); - this.kill(); + X_ViewPort_document[ 'kill' ](); + this[ 'kill' ](); - //X_System.dispatch( X_Event.SHUT_DOWN ); + //X_System[ 'dispatch' ]( X_EVENT_SHUT_DOWN ); break; case 'visibilitychange' : - X_ViewPort.dispatch( ( X_ViewPort_active = document[ 'hidden' ] ) ? X_Event.VIEW_DEACTIVATE : X_Event.VIEW_ACTIVATE ); + X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = document[ 'hidden' ] ) ? X_EVENT_VIEW_DEACTIVATE : X_EVENT_VIEW_ACTIVATE ); break; case 'mozvisibilitychange' : - X_ViewPort.dispatch( ( X_ViewPort_active = document[ 'mozHidden' ] ) ? X_Event.VIEW_DEACTIVATE : X_Event.VIEW_ACTIVATE ); + X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = document[ 'mozHidden' ] ) ? X_EVENT_VIEW_DEACTIVATE : X_EVENT_VIEW_ACTIVATE ); break; case 'webkitvisibilitychange' : - X_ViewPort.dispatch( ( X_ViewPort_active = document[ 'webkitHidden' ] ) ? X_Event.VIEW_DEACTIVATE : X_Event.VIEW_ACTIVATE ); + X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = document[ 'webkitHidden' ] ) ? X_EVENT_VIEW_DEACTIVATE : X_EVENT_VIEW_ACTIVATE ); break; case 'pageshow' : case 'focus' : if( !X_ViewPort_active ){ X_ViewPort_active = true; - X_ViewPort.dispatch( X_Event.VIEW_ACTIVATE ); + X_ViewPort[ 'dispatch' ]( X_EVENT_VIEW_ACTIVATE ); }; break; @@ -72,7 +72,7 @@ X_ViewPort = X_Class_override( case 'blur' : if( X_ViewPort_active ){ X_ViewPort_active = false; - X_ViewPort.dispatch( X_Event.VIEW_DEACTIVATE ); + X_ViewPort[ 'dispatch' ]( X_EVENT_VIEW_DEACTIVATE ); }; break; }; @@ -89,56 +89,56 @@ X_ViewPort = X_Class_override( */ X.ViewPort = { - listen : function( type, arg1, arg2, arg3 ){ + 'listen' : function( type, arg1, arg2, arg3 ){ if( type <= X_ViewPort_readyState ){ /* - * X_Event.XDOM_READY 以後に listen した場合の対策 + * X_EVENT_XDOM_READY 以後に listen した場合の対策 */ - X_ViewPort.asyncDispatch( type ); + X_ViewPort[ 'asyncDispatch' ]( type ); }; // ie8-では keydown -> documentへ - type && arg1 && X_ViewPort.listen( type, arg1, arg2, arg3 ); + type && arg1 && X_ViewPort[ 'listen' ]( type, arg1, arg2, arg3 ); return X.ViewPort; }, - listenOnce : function( type, arg1, arg2, arg3 ){ + 'listenOnce' : function( type, arg1, arg2, arg3 ){ if( type <= X_ViewPort_readyState ){ /* * X.Event.XDOM_READY 以後に listen した場合の対策 */ - X_ViewPort.asyncDispatch( type ); + X_ViewPort[ 'asyncDispatch' ]( type ); }; - type && arg1 && X_ViewPort.listenOnce( type, arg1, arg2, arg3 ); + type && arg1 && X_ViewPort[ 'listenOnce' ]( type, arg1, arg2, arg3 ); return X.ViewPort; }, - unlisten : function( type, arg1, arg2, arg3 ){ - type && arg1 && X_ViewPort.unlisten( type, arg1, arg2, arg3 ); + 'unlisten' : function( type, arg1, arg2, arg3 ){ + type && arg1 && X_ViewPort[ 'unlisten' ]( type, arg1, arg2, arg3 ); return X.ViewPort; }, - listening : function( type, arg1, arg2, arg3 ){ - return X_ViewPort.listening( type, arg1, arg2, arg3 ); + 'listening' : function( type, arg1, arg2, arg3 ){ + return X_ViewPort[ 'listening' ]( type, arg1, arg2, arg3 ); }, // hammer のテストファイルだけが使用 - asyncDispatch : function(){ - return X_ViewPort.asyncDispatch.apply( X_ViewPort, arguments ); + 'asyncDispatch' : function(){ + return X_ViewPort[ 'asyncDispatch' ].apply( X_ViewPort, arguments ); }, - getPointerPosition : function(){ + 'getPointerPosition' : function(){ }, /* 要素が視界に入った http://remysharp.com/2009/01/26/element-in-view-event-plugin/ * TODO -> Node.call('inView') */ - inView : function( elm ){ + 'inView' : function( elm ){ }, - getSize : function(){ + 'getSize' : function(){ return [ X_ViewPort_width, X_ViewPort_height ]; }, //https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect @@ -146,7 +146,7 @@ X.ViewPort = { //(((t = document.documentElement) || (t = document.body.parentNode)) && typeof t.ScrollLeft == 'number' ? t : document.body).ScrollLeft; //(((t = document.documentElement) || (t = document.body.parentNode)) && typeof t.ScrollTop == 'number' ? t : document.body).ScrollTop - getDocumentSize : function(){ + 'getDocumentSize' : function(){ // Opera は互換モードでは document.body.scrollHeight、標準モードでは document.documentElement.scrollHeight でページの高さが取れる。と思ってたんだけど、例外があった。 // http://orera.g.hatena.ne.jp/edvakf/20100515/1273908051 //http://onozaty.hatenablog.com/entry/20060803/p1 @@ -164,7 +164,7 @@ X.ViewPort = { ]; }, - getScrollPosition : + 'getScrollPosition' : window.pageXOffset !== undefined ? ( function(){ X_Node_updateTimerID && X_Node_startUpdate(); @@ -181,14 +181,14 @@ X.ViewPort = { return[ X_ViewPort_rootElement.scrollLeft || document.body.scrollLeft, X_ViewPort_rootElement.scrollTop || document.body.scrollTop ]; } ), - getScrollbarSize : function(){ + 'getScrollbarSize' : function(){ return [ X_ViewPort_vScrollbarSize, X_ViewPort_hScrollbarSize ]; }, - getBaseFontSize : function(){ + 'getBaseFontSize' : function(){ if( X_Node_updateTimerID ){ X_Node_startUpdate(); - return X_ViewPort_baseFontSize = X_Node_fontSizeNode._rawObject.offsetHeight; + return X_ViewPort_baseFontSize = X_Node_fontSizeNode[ '_rawObject' ].offsetHeight; }; return X_ViewPort_baseFontSize; } @@ -232,14 +232,14 @@ X.ViewPort = { if( X_ViewPort_width !== size[ 0 ] || X_ViewPort_height !== size[ 1 ] ){ X_ViewPort_width = size[ 0 ]; X_ViewPort_height = size[ 1 ]; - X.Timer.once( 100, X_Dom_detectFinishResizing ); + X_Timer_once( 100, X_Dom_detectFinishResizing ); X_ViewPort_lock = true; }; }; - size = X_Node_fontSizeNode._rawObject.offsetHeight; + size = X_Node_fontSizeNode[ '_rawObject' ].offsetHeight; if( X_ViewPort_baseFontSize !== size ){ - X_ViewPort_baseFontSize && X_ViewPort.asyncDispatch( X_Event.BASE_FONT_RESIZED ); + X_ViewPort_baseFontSize && X_ViewPort[ 'asyncDispatch' ]( X_EVENT_BASE_FONT_RESIZED ); X_ViewPort_baseFontSize = size; }; @@ -247,8 +247,8 @@ X.ViewPort = { (function( e ){ console.log( '-- resize : ' + X_Timer_now() ); - !X_ViewPort_lock && ( X_ViewPort_lock = true ) && X.Timer.once( 100, X_Dom_detectFinishResizing ); - return X.Callback.PREVENT_DEFAULT | X.Callback.STOP_PROPAGATION; + !X_ViewPort_lock && ( X_ViewPort_lock = true ) && X_Timer_once( 100, X_Dom_detectFinishResizing ); + return X_Callback_PREVENT_DEFAULT | X_Callback_STOP_PROPAGATION; }); function X_Dom_detectFinishResizing(){ @@ -256,15 +256,15 @@ X.ViewPort = { if( X_ViewPort_width !== size[ 0 ] || X_ViewPort_height !== size[ 1 ] ){ X_ViewPort_width = size[ 0 ]; X_ViewPort_height = size[ 1 ]; - X.Timer.once( 100, X_Dom_detectFinishResizing ); + X_Timer_once( 100, X_Dom_detectFinishResizing ); } else { console.log( '-- detectFinishResizing : ' + X_Timer_now() ); - X_ViewPort.asyncDispatch( X_Event.VIEW_RESIZED ); + X_ViewPort[ 'asyncDispatch' ]( X_EVENT_VIEW_RESIZED ); X_ViewPort_lock = false; if( X_ViewPort_orientationFlag ){ X_ViewPort_orientationFlag = false; - X_ViewPort.asyncDispatch( 100, { type : X_Event.VIEW_TURNED, orientation : window.orientation } ); + X_ViewPort[ 'asyncDispatch' ]( 100, { type : X_EVENT_VIEW_TURNED, orientation : window.orientation } ); }; }; }; @@ -274,11 +274,11 @@ X.ViewPort = { console.log( '> X_TEMP.onDomContentLoaded rs:' + X_ViewPort_readyState ); - if( X_TEMP.SYSTEM_EVENT_PRE_INIT <= X_ViewPort_readyState ) return X_Callback_UN_LISTEN; - X_ViewPort_readyState = X_TEMP.SYSTEM_EVENT_PRE_INIT; + if( X_EVENT_PRE_INIT <= X_ViewPort_readyState ) return X_Callback_UN_LISTEN; + X_ViewPort_readyState = X_EVENT_PRE_INIT; // DOMContentLoaded の無いブラウザで X_TEMP.onDomContentLoaded への参照が残り続けるのを回避 - X_TEMP.onDomContentLoaded && X_ViewPort_document.unlisten( 'DOMContentLoaded', X_TEMP.onDomContentLoaded ); + X_TEMP.onDomContentLoaded && X_ViewPort_document[ 'unlisten' ]( 'DOMContentLoaded', X_TEMP.onDomContentLoaded ); delete X_TEMP.onDomContentLoaded; elmHtml = document.documentElement || @@ -293,42 +293,42 @@ X.ViewPort = { X_ViewPort_rootElement = document.compatMode !== 'CSS1Compat' ? elmBody : elmHtml || elmBody; - html = X.Doc.html = X_Node_html = elmHtml && new Node( elmHtml ); - html._flags |= X_Node_State.IN_TREE; + html = X[ 'Doc' ][ 'html' ] = X_Node_html = elmHtml && new Node( elmHtml ); + html[ '_flags' ] |= X_Node_State.IN_TREE; - head = X.Doc.head = X_Node_head = elmHead && new Node( elmHead ); + head = X[ 'Doc' ][ 'head' ] = X_Node_head = elmHead && new Node( elmHead ); - body = X.Doc.body = X_Node_body = new Node( elmBody ); + body = X[ 'Doc' ][ 'body' ] = X_Node_body = new Node( elmBody ); - body.parent = head.parent = html; - html._xnodes = [ head, body ]; + body[ 'parent ' ] = head[ 'parent' ] = html; + html[ '_xnodes' ] = [ head, body ]; - html.appendTo = html.appendToRoot = html.before = html.after = html.clone = html.remove = html.destroy = html.prev = html.next = - html.create = html.createText = html.createAt = html.createTextAt = html.append = html.appendAt = html.empty = html.html = html.text = - html.css = html.cssText = - head.appendTo = head.appendToRoot = head.before = head.after = head.clone = head.remove = head.destroy = - head.createText = head.createTextAt = head.empty = head.html = head.text = head.css = head.cssText = - body.appendTo = body.appendToRoot = body.before = body.after = body.clone = body.remove = body.destroy = new Function( 'return this' ); - - X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_PRE_INIT, function(){ - X_ViewPort_readyState = X_TEMP.SYSTEM_EVENT_XTREE; + html[ 'appendTo' ] = html[ 'before' ] = html[ 'after' ] = html[ 'clone' ] = html[ 'remove' ] = html[ 'destroy' ] = html[ 'prev' ] = html[ 'next' ] = + html[ 'create' ] = html[ 'createText' ] = html[ 'createAt' ] = html[ 'createTextAt' ] = html[ 'append' ] = html[ 'appendAt' ] = html[ 'empty' ] = html[ 'html' ] = html[ 'text' ] = + html[ 'css' ] = html[ 'cssText' ] = + head[ 'appendTo' ] = head[ 'before' ] = head[ 'after' ] = head[ 'clone' ] = head[ 'remove' ] = head[ 'destroy' ] = + head[ 'createText' ] = head[ 'createTextAt' ] = head[ 'empty' ] = head[ 'html' ] = head[ 'text' ] = head[ 'css' ] = head[ 'cssText' ] = + body[ 'appendTo' ] = body[ 'before' ] = body[ 'after' ] = body[ 'clone' ] = body[ 'remove' ] = body[ 'destroy' ] = new Function( 'return this' ); + + X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, function(){ + X_ViewPort_readyState = X_EVENT_XTREE_READY; if( X_TEMP.X_Dom_useBuilder ) X_TEMP.X_Dom_useBuilder = !!document.body.children.length; - !X_TEMP.X_Dom_useBuilder && X_ViewPort.asyncDispatch( X_TEMP.SYSTEM_EVENT_XTREE ); + !X_TEMP.X_Dom_useBuilder && X_ViewPort[ 'asyncDispatch' ]( X_EVENT_XTREE_READY ); } ); - X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_XTREE, function(){ - X_ViewPort_readyState = X_TEMP.SYSTEM_EVENT_INIT; + X_ViewPort[ 'listenOnce' ]( X_EVENT_XTREE_READY, function(){ + X_ViewPort_readyState = X_EVENT_INIT; //X_UA[ 'Opera7' ] && alert( 'bc' ); - X_Node_body.appendAt( 0, + X_Node_body[ 'appendAt' ]( 0, X_Node_systemNode = X_Doc_create( 'div', { 'class' : 'hidden-system-node' } ), - X_Node_fontSizeNode = X_Doc_create( 'div', { 'class' : 'hidden-system-node' } ).cssText( 'line-height:1;height:1em;' ).text( 'X' ) + X_Node_fontSizeNode = X_Doc_create( 'div', { 'class' : 'hidden-system-node' } )[ 'cssText' ]( 'line-height:1;height:1em;' )[ 'text' ]( 'X' ) ); X_Node_startUpdate(); - X_ViewPort.asyncDispatch( X_TEMP.SYSTEM_EVENT_INIT ); + X_ViewPort[ 'asyncDispatch' ]( X_EVENT_INIT ); } ); - X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_INIT, function(){ + X_ViewPort[ 'listenOnce' ]( X_EVENT_INIT, function(){ var size = X_ViewPort_getWindowSize(), // http://jsdo.it/imaya/kTYg @@ -362,18 +362,18 @@ X.ViewPort = { if( X_Dom_detectFontSize ){ X_EventDispatcher_systemListen( X_ViewPort, 'resize', X_ViewPort_resize ); - X.Timer.add( 333, X_Dom_detectFontSize ); + X_Timer_add( 333, X_Dom_detectFontSize ); } else { - X.Timer.add( 333, X_ViewPort_resize ); + X_Timer_add( 333, X_ViewPort_resize ); }; - X_ViewPort_baseFontSize = X_Node_fontSizeNode._rawObject.offsetHeight; + X_ViewPort_baseFontSize = X_Node_fontSizeNode[ '_rawObject' ].offsetHeight; - X_ViewPort_readyState = X_Event.XDOM_READY; - X_ViewPort.asyncDispatch( { type : X_Event.XDOM_READY, w : X_ViewPort_width = size[ 0 ], h : X_ViewPort_height = size[ 1 ] } ); + X_ViewPort_readyState = X_EVENT_XDOM_READY; + X_ViewPort[ 'asyncDispatch' ]( { type : X_EVENT_XDOM_READY, w : X_ViewPort_width = size[ 0 ], h : X_ViewPort_height = size[ 1 ] } ); } ); - X_ViewPort.asyncDispatch( X_TEMP.SYSTEM_EVENT_PRE_INIT ); + X_ViewPort[ 'asyncDispatch' ]( X_EVENT_PRE_INIT ); X_EventDispatcher_systemListen( X_ViewPort, [ 'beforeunload', 'unload' ] ); @@ -419,7 +419,7 @@ console.log( 'X.Dom dom:w3c=' + X_UA_DOM.W3C + ' ev:w3c=' + X_UA_EVENT.W3C ); /* for ie9+/Mozilla/Opera9 */ if( X_UA_EVENT.W3C ){ - X_ViewPort_document.listenOnce( 'DOMContentLoaded', X_TEMP.onDomContentLoaded ); + X_ViewPort_document[ 'listenOnce' ]( 'DOMContentLoaded', X_TEMP.onDomContentLoaded ); } else if( 6 <= X_UA[ 'IE' ] && X.inHead ){ // if this script in Head @@ -428,7 +428,7 @@ if( 6 <= X_UA[ 'IE' ] && X.inHead ){ X_TEMP._script.onreadystatechange = function(){ var s = X_TEMP._script; if( s && s.readyState === 'complete' ){ - s.onreadystatechange = X.emptyFunction; + s.onreadystatechange = X_emptyFunction; s.onreadystatechange = null; s.parentNode.removeChild( s ); delete X_TEMP._script; @@ -439,11 +439,11 @@ if( 6 <= X_UA[ 'IE' ] && X.inHead ){ // Re: onLoad doesn't work with Safari? // http://lists.apple.com/archives/web-dev/2003/Oct/msg00036.html if( X_UA[ 'WebKit' ] || X_UA[ 'Safari' ] < 3 ){ // sniff - X.Timer.add( 16, function(){ + X_Timer_add( 16, function(){ if( !X_TEMP.onDomContentLoaded ) return X_Callback_UN_LISTEN; if( document.readyState === 'loaded' || document.readyState === 'complete' ) return X_TEMP.onDomContentLoaded(); }); }; /* for other browsers */ -X_ViewPort.listenOnce( 'load', X_TEMP.onDomContentLoaded ); +X_ViewPort[ 'listenOnce' ]( 'load', X_TEMP.onDomContentLoaded ); diff --git a/0.6.x/js/01_core/17_XLogger.js b/0.6.x/js/01_core/17_XLogger.js index 60d8e5f..d757551 100644 --- a/0.6.x/js/01_core/17_XLogger.js +++ b/0.6.x/js/01_core/17_XLogger.js @@ -18,15 +18,15 @@ X.Logger = { }, _output : function( msg, level ){ var body, $Area; - if( X_Event.XDOM_READY <= X_ViewPort_readyState ){ + if( X_EVENT_XDOM_READY <= X_ViewPort_readyState ){ if( $Area = X.Logger._$LogArea ){ - $Area.remove(); + $Area[ 'remove' ](); delete X.Logger._$LogArea; }; } else - if( X_Event.XDOM_READY <= X_ViewPort_readyState ){ + if( X_EVENT_XDOM_READY <= X_ViewPort_readyState ){ if( !( $Area = X.Logger._$LogArea ) ){ $Area = X.Logger._$LogArea = X.Node( 'div' ).addToRoot( 0 ); }; diff --git a/0.6.x/js/02_dom/00_XDoc.js b/0.6.x/js/02_dom/00_XDoc.js index c185700..e2fcbf8 100644 --- a/0.6.x/js/02_dom/00_XDoc.js +++ b/0.6.x/js/02_dom/00_XDoc.js @@ -3,42 +3,42 @@ * @namespace X.Doc * @alias X.Doc */ -X.Doc = { - listen : function( type, arg1, arg2, arg3 ){ +X[ 'Doc' ] = { + 'listen' : function( type, arg1, arg2, arg3 ){ if( type <= X_ViewPort_readyState && type === 'DOMContentLoaded' ){ /* * X.Event.XDOM_READY 以後に listen した場合の対策 */ - X_ViewPort_document.asyncDispatch( type ); + X_ViewPort_document[ 'asyncDispatch' ]( type ); }; - type && arg1 && X_ViewPort_document.listen( type, arg1, arg2, arg3 ); + type && arg1 && X_ViewPort_document[ 'listen' ]( type, arg1, arg2, arg3 ); return X.Doc; }, - listenOnce : function( type, arg1, arg2, arg3 ){ + 'listenOnce' : function( type, arg1, arg2, arg3 ){ if( type <= X_ViewPort_readyState && type === 'DOMContentLoaded' ){ /* * X.Event.XDOM_READY 以後に listen した場合の対策 */ - X_ViewPort_document.asyncDispatch( type ); + X_ViewPort_document[ 'asyncDispatch' ]( type ); }; - type && arg1 && X_ViewPort_document.listenOnce( type, arg1, arg2, arg3 ); + type && arg1 && X_ViewPort_document[ 'listenOnce' ]( type, arg1, arg2, arg3 ); return X.Doc; }, - unlisten : function( type, arg1, arg2, arg3 ){ - type && arg1 && X_ViewPort_document.unlisten( type, arg1, arg2, arg3 ); + 'unlisten' : function( type, arg1, arg2, arg3 ){ + type && arg1 && X_ViewPort_document[ 'unlisten' ]( type, arg1, arg2, arg3 ); return X.Doc; }, - listening : function( type, arg1, arg2, arg3 ){ - return X_ViewPort_document.listening( type, arg1, arg2, arg3 ); + 'listening' : function( type, arg1, arg2, arg3 ){ + return X_ViewPort_document[ 'listening' ]( type, arg1, arg2, arg3 ); }, - create : X_Doc_create, + 'create' : X_Doc_create, - createText : X_Doc_createText + 'createText' : X_Doc_createText // html // head diff --git a/0.6.x/js/02_dom/01_XDTD.js b/0.6.x/js/02_dom/01_XDTD.js index 77e85c8..21e5021 100644 --- a/0.6.x/js/02_dom/01_XDTD.js +++ b/0.6.x/js/02_dom/01_XDTD.js @@ -1,20 +1,18 @@ -X.Dom = {}; - -var X_Dom_DTD_EMPTY = { - AREA : true, - BASE : true, - BASEFONT : true, - BR : true, - COL : true, - FRAME : true, - HR : true, - IMG : true, - INPUT : true, - ISINDEX : true, - LINK : true, - META : true, - PARAM : true, - EMBED : true +var X_Dom_DTD_EMPTY = { + 'AREA' : true, + 'BASE' : true, + 'BASEFONT' : true, + 'BR' : true, + 'COL' : true, + 'FRAME' : true, + 'HR' : true, + 'IMG' : true, + 'INPUT' : true, + 'ISINDEX' : true, + 'LINK' : true, + 'META' : true, + 'PARAM' : true, + 'EMBED' : true }, /* @@ -22,64 +20,54 @@ var X_Dom_DTD_EMPTY = { */ X_Dom_DTD_TAG_FIX = X_UA[ 'IE4' ] ? - { ABBR : 'ACRONYM', BDO : '', RUBY : '' } : + { 'ABBR' : 'ACRONYM', 'BDO' : '', 'RUBY' : '' } : X_UA[ 'IE5x' ] || X_UA[ 'IE6' ] ? - { ABBR : 'ACRONYM' } : + { 'ABBR' : 'ACRONYM' } : {}, X_Dom_DTD_ATTR_VAL_IS_URI = { - action : true, - archive : true, - background : true, - cite : true, - classid : true, - codebase : true, - data : true, - href : true, - longdesc : true, - profile : true, - src : true, - usemap : true + 'action' : true, + 'archive' : true, + 'background' : true, + 'cite' : true, + 'classid' : true, + 'codebase' : true, + 'data' : true, + 'href' : true, + 'longdesc' : true, + 'profile' : true, + 'src' : true, + 'usemap' : true }, X_Dom_DTD_MOVE_TO_HEAD = { - STYLE : true, - LINK : true, - TITLE : true, - BGSOUND : true, - AREA : true, - BASE : true, - META : true + 'STYLE' : true, + 'LINK' : true, + 'TITLE' : true, + 'BGSOUND' : true, + 'AREA' : true, + 'BASE' : true, + 'META' : true }, X_Dom_DTD_CLEANUP_TAGS = { - SCRIPT : true, - NOSCRIPT : true, - NOFRAMES : true, - '!' : true, // ie - COMMENT : true, // ie - NOEMBED : true, - NOLAYER : true + 'SCRIPT' : true, + 'NOSCRIPT' : true, + 'NOFRAMES' : true, + '!' : true, // ie + 'COMMENT' : true, // ie + 'NOEMBED' : true, + 'NOLAYER' : true }, X_Dom_DTD_SKIP_CLEANUP_TAGS = { - PRE : true, - TEXTAREA : true, - CODE : true, - KBD : true, - SAMP : true, - XMP : true, - PLAINTEXT : true, - LISTING : true + 'PRE' : true, + 'TEXTAREA' : true, + 'CODE' : true, + 'KBD' : true, + 'SAMP' : true, + 'XMP' : true, + 'PLAINTEXT' : true, + 'LISTING' : true }; -/* -X.Dom.DTD = { - - EMPTY : X_Dom_DTD_EMPTY, - - TAG_FIX : X_Dom_DTD_TAG_FIX, - - ATTR_VAL_IS_URI : X_Dom_DTD_ATTR_VAL_IS_URI -}; -*/ diff --git a/0.6.x/js/02_dom/02_XNode.js b/0.6.x/js/02_dom/02_XNode.js index 4b2ccd3..7da1288 100644 --- a/0.6.x/js/02_dom/02_XNode.js +++ b/0.6.x/js/02_dom/02_XNode.js @@ -1,5 +1,6 @@ var - + /** @enum {number} + * @const */ X_Node_State = { DESTROYED : 0x0, EXIST : 0x1, @@ -43,9 +44,9 @@ var IE4_FIXED : X_UA[ 'IE4' ] ? 2 << 24 : 0, IE5_DISPLAY_NONE_FIX : X_UA[ 'IE5' ] && X_UA[ 'ActiveX' ] ? 2 << 24 : 0 - }, + }; - X_Node_BITMASK_RESET_STYLE = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ ( +var X_Node_BITMASK_RESET_STYLE = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ ( X_Node_State.STYLE_IS_DISPLAY_NONE | X_Node_State.STYLE_IS_INVISIBLE | X_Node_State.STYLE_IS_POS_ABSOLUTE | @@ -67,6 +68,7 @@ var X_Node_BitMask_IE4_IS_MIX = X_Node_State.IE4_HAS_TEXTNODE | X_Node_State.IE4_HAS_ELEMENT, + /** @enum {number} */ X_Node_TYPE = { XNODE : 1, RAW_HTML : 2, @@ -102,57 +104,170 @@ var * * @alias X.Node * @class Node HTMLElement、TextNode をラップし jQuery 風な API で操作できます。 - * @constructor * @constructs Node * @extends {EventDispatcher} */ -var Node = X.Node = X.EventDispatcher.inherits( +var Node = X[ 'Node' ] = X_EventDispatcher[ 'inherits' ]( 'X.Node', X.Class.POOL_OBJECT, // X.Class.FINAL + { - _uid : 0, - _flags : X_Node_State.DESTROYED, + /** + * 要素に振られるユニークID + * @type {number} + * @private + * @alias Node.prototype._uid + */ + '_uid' : 0, + + /** + * Node の状態を表すフラグ。 + * @type {number} + * @private + * @alias Node.prototype._flags + */ + '_flags' : X_Node_State.DESTROYED, // _rawObject : null, - _rect : null, // - _fontSize : 0, + '_rect' : null, // + + /** + * 最後に計測したフォントサイズを保持している。ツリーが変更されると削除される。 + * @type {number} + * @private + * @alias Node.prototype._fontSize + */ + '_fontSize' : 0, + + /** + * NodeList と動作を一致させるためのプロパティ。常に 1。 + * @type {number} + * @private + * @alias Node.prototype.length + */ + length : 1, + + /** + * 親 Node。 + * @type {Node} + * @private + * @alias Node.prototype.parent + */ + parent : null, // remove された枝も親子構造は維持している。 + + /** + * 子 Node リスト + * @type {Array} + * @private + * @alias Node.prototype._xnodes + */ + '_xnodes' : null, + + /** + * GPU レイヤーに転送されている場合、その一番親となっている Node。未実装。 + * @type {Node} + * @private + * @alias Node.prototype._gpuParent + */ + '_gpuParent' : null, + + /** + * タグ名。テキストノードの場合は空文字列。 + * @type {string} + * @private + * @alias Node.prototype._tag + */ + '_tag' : '', - length : 1, - parent : null, // remove された枝も親子構造は維持している。 - _xnodes : null, // Array. - _gpuParent : null, // TODO - - _tag : '', - _text : '', - _id : '', // - _className : '', // - - _attrs : null, // see X_Node_Attr - _newAttrs : null, - _attrText : '', + /** + * テキストコンテンツ。テキストノードで使用。 + * @type {string} + * @private + * @alias Node.prototype._text + */ + '_text' : '', - _css : null, // see X_Node_CSS - _cssText : '', + /** + * id + * @type {string} + * @private + * @alias Node.prototype._id + */ + '_id' : '', - _anime : null, // Hash see X_Node_Anime + /** + * クラス名。複数のクラスが設定されている場合、スペース区切り。 + * @type {string} + * @private + * @alias Node.prototype._className + */ + '_className' : '', // + + /** + * 属性。 + * @type {object} + * @private + * @alias Node.prototype._attrs + */ + '_attrs' : null, // see X_Node_Attr + + /** + * まだコミットされていない属性。 + * @type {object} + * @private + * @alias Node.prototype._newAttrs + */ + '_newAttrs' : null, + + /** + * 属性を文字列にしたもの。 color="red" size="8" + * @type {object} + * @private + * @alias Node.prototype._attrText + */ + '_attrText' : '', + + /** + * スタイル。 + * @type {object} + * @private + * @alias Node.prototype._css + */ + '_css' : null, + + /** + * cssText + * @type {string} + * @private + * @alias Node.prototype._cssText + */ + '_cssText' : '', + + /** + * アニメーション用オブジェクト。 + * @type {object} + * @private + * @alias Node.prototype._anime + */ + '_anime' : null, /* * TODO Node の継承ができない! */ - Constructor : function( v ){ + 'Constructor' : function( v ){ var uid = X_Node_CHASHE.length, css, xnodes, xnode, parent; if( X_Node_newByTag ){ X_Node_newByTag = false; - this._tag = v.toUpperCase(); + this[ '_tag' ] = v.toUpperCase(); arguments[ 1 ] && this.attr( arguments[ 1 ] ); css = arguments[ 2 ]; css && this[ X_Type_isString( css ) ? 'cssText' : 'css' ]( css ); } else if( X_Node_newByText ){ X_Node_newByText = false; - this._text = v; + this[ '_text' ] = v; } else { if( 1 < arguments.length ) return new X_NodeList( arguments ); if( X_Type_isArray( v ) && v.length ) return new X_NodeList( v ); @@ -166,19 +281,19 @@ var Node = X.Node = X.EventDispatcher.inherits( if( xnode = X_Node_getXNode( v ) ) return xnode; // v.parentNode || v.parentElement : dom1 || dom0 this.parent = ( parent = v.parentNode || v.parentElement ) && parent.tagName /* ie7- */ && X_Node_getXNode( parent ); - this._rawObject = v; - this._tag = v.tagName.toUpperCase(); - this._id = v.id; - this._className = v.className; + this[ '_rawObject' ] = v; + this[ '_tag' ] = v.tagName.toUpperCase(); + this[ '_id' ] = v.id; + this[ '_className' ] = v.className; - this.cssText( v.style.cssText ); - this._flags &= X_Node_BitMask_RESET_DIRTY; // X_Node_State.DIRTY_CSS を落とす + this[ 'cssText' ]( v.style.cssText ); + this[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; // X_Node_State.DIRTY_CSS を落とす // TODO attr の回収は不可能、、、? if( X_UA_DOM.IE4 ){ v.setAttribute( 'UID', '' + uid ); } else { - v.UID = uid; + v[ 'UID' ] = uid; }; // childNodes... break; @@ -186,9 +301,9 @@ var Node = X.Node = X.EventDispatcher.inherits( case X_Node_TYPE.RAW_TEXT : if( xnode = X_Node_getXNode( v ) ) return xnode; this.parent = X_Node_getXNode( v.parentNode ); - this._rawObject = v; - this._text = v.data; - v.UID = uid; + this[ '_rawObject' ] = v; + this[ '_text' ] = v.data; + v[ 'UID' ] = uid; break; case X_Node_TYPE.HTML_STRING : @@ -204,11 +319,11 @@ var Node = X.Node = X.EventDispatcher.inherits( }; }; - if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){ - this._flags |= X_Node_State.IN_TREE; + if( this.parent && ( this.parent[ '_flags' ] & X_Node_State.IN_TREE ) ){ + this[ '_flags' ] |= X_Node_State.IN_TREE; }; - this._flags |= X_Node_State.EXIST; - X_Node_CHASHE[ this._uid = uid ] = this; + this[ '_flags' ] |= X_Node_State.EXIST; + X_Node_CHASHE[ this[ '_uid' ] = uid ] = this; }, // attr @@ -216,62 +331,56 @@ var Node = X.Node = X.EventDispatcher.inherits( // find // animate, stop - create : X_Node_create, + 'create' : X_Node_create, - createAt : X_Node_createAt, + 'createAt' : X_Node_createAt, - createText : X_Node_createText, + 'createText' : X_Node_createText, - createTextAt : X_Node_createTextAt, + 'createTextAt' : X_Node_createTextAt, - clone : X_Node_clone, + 'clone' : X_Node_clone, - append : X_Node_append, + 'append' : X_Node_append, - appendAt : X_Node_appendAt, + 'appendAt' : X_Node_appendAt, - appendTo : X_Node_appendTo, + 'appendTo' : X_Node_appendTo, - appendToRoot : X_Node_appendToRoot, // remove + 'prev' : X_Node_before, - before : X_Node_before, // remove + 'next' : X_Node_after, - prev : X_Node_before, + 'swap' : X_Node_swap, - after : X_Node_after, // remove + 'remove' : X_Node_remove, - next : X_Node_after, - - swap : X_Node_swap, - - remove : X_Node_remove, - - empty : X_Node_empty, + 'empty' : X_Node_empty, destroy : X_Node_destroy, // -> kill && kill event - contains : X_Node_contains, + 'contains' : X_Node_contains, - getChildAt : X_Node_getChildAt, + 'getChildAt' : X_Node_getChildAt, - numChildren : X_Node_length, + 'numChildren' : X_Node_length, - firstChild : X_Node_firstChild, + 'firstChild' : X_Node_firstChild, - lastChild : X_Node_lastChild, + 'lastChild' : X_Node_lastChild, - getOrder : X_Node_getOrder, + 'getOrder' : X_Node_getOrder, - className : X_Node_className, - addClass : X_Node_addClass, - removeClass : X_Node_removeClass, - toggleClass : X_Node_toggleClass, - hasClass : X_Node_hasClass, + 'className' : X_Node_className, + 'addClass' : X_Node_addClass, + 'removeClass' : X_Node_removeClass, + 'toggleClass' : X_Node_toggleClass, + 'hasClass' : X_Node_hasClass, - html : X_Node_html, - text : X_Node_text, - call : X_Node_call, - each : X_Node_each + 'html' : X_Node_html, + 'text' : X_Node_text, + 'call' : X_Node_call, + 'each' : X_Node_each } ); @@ -302,30 +411,30 @@ function X_Node_getXNode( v ){ uid = v.getAttribute( 'UID' ); return uid && X_Node_CHASHE[ uid ]; }; - return v.UID && X_Node_CHASHE[ v.UID ]; + return v[ 'UID' ] && X_Node_CHASHE[ v[ 'UID' ] ]; case X_Node_TYPE.WINDOW : return X_ViewPort; case X_Node_TYPE.DOCUMENT : return X_ViewPort_document; case X_Node_TYPE.RAW_TEXT : - if( v.UID ) return X_Node_CHASHE[ v.UID ]; + if( v[ 'UID' ] ) return X_Node_CHASHE[ v[ 'UID' ] ]; for( chashe = X_Node_CHASHE, i = chashe.length; i; ){ - if( ( xnode = X_Node_CHASHE[ --i ] ) && ( xnode._rawObject === v ) ) return xnode; + if( ( xnode = X_Node_CHASHE[ --i ] ) && ( xnode[ '_rawObject' ] === v ) ) return xnode; }; }; }; function X_Node_getRoot( xnode ){ return X_ViewPort_document; - //return X_Node_body._rawObject.documentElement ? node : node.ownerDocument || node.document; + //return X_Node_body[ '_rawObject' ].documentElement ? node : node.ownerDocument || node.document; }; // XMLかどうかを判別する var X_Node_isXmlDocument = X_UA_DOM.IE4 ? - X.emptyFunction : + X_emptyFunction : (function( root ){ if( X_Type_isBoolean( root.isXML ) ) return root.isXML; - return root.isXML = root._rawObject.createElement( 'p' ).tagName !== root._rawObject.createElement( 'P' ).tagName; + return root.isXML = root[ '_rawObject' ].createElement( 'p' ).tagName !== root[ '_rawObject' ].createElement( 'P' ).tagName; }), X_Node_CHASHE = [], X_Node_none = X_Node_CHASHE[ 0 ] = new Node(), @@ -338,15 +447,15 @@ var X_Node_isXmlDocument = * remove : * X_Node_reserveRemoval = [] に追加。commitUpdate で remove * add : - * X_Node_reserveRemoval にいたら消す, new_parent._xnodes に挿入 + * X_Node_reserveRemoval にいたら消す, new_parent[ '_xnodes' ] に挿入 */ X_Node_reserveRemoval = []; var X_Node__ie4getRawNode = X_UA_DOM.IE4 && function ( that ){ - return that._rawObject || - ( that._rawObject = document.all[ 'ie4uid' + that._uid ] ) || - ( that._id && ( that._rawObject = document.all[ that._id ] ) ); + return that[ '_rawObject' ] || + ( that[ '_rawObject' ] = document.all[ 'ie4uid' + that[ '_uid' ] ] ) || + ( that[ '_id' ] && ( that[ '_rawObject' ] = document.all[ that[ '_id' ] ] ) ); }; @@ -354,8 +463,8 @@ function X_Node_toggleInTreeFlag( xnodes, flag ){ var i = xnodes.length, xnode; for( ; i; ){ xnode = xnodes[ --i ]; - flag ? ( xnode._flags |= X_Node_State.IN_TREE | X_Node_State.DIRTY_POSITION ) : ( xnode._flags &= ~X_Node_State.IN_TREE & ~X_Node_State.IE5_DISPLAY_NONE_FIX ); - xnode._xnodes && X_Node_toggleInTreeFlag( xnode._xnodes, flag ); + flag ? ( xnode[ '_flags' ] |= X_Node_State.IN_TREE | X_Node_State.DIRTY_POSITION ) : ( xnode[ '_flags' ] &= ~X_Node_State.IN_TREE & ~X_Node_State.IE5_DISPLAY_NONE_FIX ); + xnode[ '_xnodes' ] && X_Node_toggleInTreeFlag( xnode[ '_xnodes' ], flag ); }; }; @@ -365,96 +474,128 @@ function X_Node_toggleInGPUFlag( gpuRoot, xnodes, flag ){ if( flag ){ for( ; i; ){ xnode = xnodes[ --i ]; - if( !xnode._gpuParent ){ - xnode._flags |= X_Node_State.GPU_CHILD; - xnode._gpuParent = gpuRoot; - xnode._xnodes && X_Node_toggleInTreeFlag( gpuRoot, xnode._xnodes, flag ); + if( !xnode[ '_gpuParent' ] ){ + xnode[ '_flags' ] |= X_Node_State.GPU_CHILD; + xnode[ '_gpuParent' ] = gpuRoot; + xnode[ '_xnodes' ] && X_Node_toggleInTreeFlag( gpuRoot, xnode[ '_xnodes' ], flag ); }; }; } else { for( ; i; ){ xnode = xnodes[ --i ]; - if( xnode._gpuParent === gpuRoot ){ - xnode._flags &= ~X_Node_State.GPU_CHILD; - delete xnode._gpuParent; - xnode._xnodes && X_Node_toggleInTreeFlag( gpuRoot, xnode._xnodes, flag ); + if( xnode[ '_gpuParent' ] === gpuRoot ){ + xnode[ '_flags' ] &= ~X_Node_State.GPU_CHILD; + delete xnode[ '_gpuParent' ]; + xnode[ '_xnodes' ] && X_Node_toggleInTreeFlag( gpuRoot, xnode[ '_xnodes' ], flag ); }; }; }; }; -/* -------------------------------------- - * Create +/** + * タグ名等を指定して新規に子ノードを作成し、現在のノードに追加する。 + * @alias Node.prototype.create + * @param {string} [tag] タグ名 + * @param {object} [opt_attrs=] 属性 + * @param {object|string} [opt_css=] css + * @return {Node} 新規作成されたノード + * @example var child = parent.create( 'div' ); */ function X_Node_create( tag, opt_attrs, opt_css ){ var xnode; - if( !this._tag ) return; - this.append( xnode = X_Doc_create( tag, opt_attrs, opt_css ) ); + if( !this[ '_tag' ] ) return; + this[ 'append' ]( xnode = X_Doc_create( tag, opt_attrs, opt_css ) ); return xnode; }; +/** + * 挿入位置とタグ名等を指定して新規に子ノードを作成し、現在のノードに挿入する。 + * @alias Node.prototype.createAt + * @param {number} [index] 挿入位置 + * @param {string} [tag] タグ名 + * @param {object} [opt_attrs=] 属性 + * @param {object|string} [opt_css=] css + * @return {Node} 新規作成されたノード + * @example var child = parent.create( 2, 'div' ); + */ function X_Node_createAt( index, tag, opt_attrs, opt_css ){ var xnode; - if( !this._tag ) return; - this.appendAt( index, xnode = X_Doc_create( tag, opt_attrs, opt_css ) ); + if( !this[ '_tag' ] ) return; + this[ 'appendAt' ]( index, xnode = X_Doc_create( tag, opt_attrs, opt_css ) ); return xnode; }; -/* -------------------------------------- - * CreateText +/** + * テキストを指定して新規にテキストノードを作成し、現在のノードに挿入する。 + * @alias Node.prototype.createText + * @param {string} [tag] テキスト + * @return {Node} 新規作成されたノード */ function X_Node_createText( text ){ var xnode; - if( !this._tag ) return; - this.append( xnode = X_Doc_createText( text ) ); + if( !this[ '_tag' ] ) return; + this[ 'append' ]( xnode = X_Doc_createText( text ) ); return xnode; }; +/** + * 挿入位置とテキストを指定して新規に子ノードを作成し、現在のノードに挿入する。 + * @alias Node.prototype.createTextAt + * @param {number} [index] 挿入位置 + * @param {string} [tag] テキスト + * @return {Node} 新規作成されたノード + */ function X_Node_createTextAt( index, text ){ var xnode; - if( !this._tag ) return; - this.appendAt( index, xnode = X_Doc_createText( text ) ); + if( !this[ '_tag' ] ) return; + this[ 'appendAt' ]( index, xnode = X_Doc_createText( text ) ); return xnode; }; -/* -------------------------------------- - * Clone +/** + * Node のクローンを作成し返す。id もクローンされる点に注意。イベントリスナはクローンされない。 * http://d.hatena.ne.jp/think49/20110724/1311472811 * http://d.hatena.ne.jp/uupaa/20100508/1273299874 + * @alias Node.prototype.clone + * @param {boolean} [opt_clone_children] 子要素のクローンを行うか? + * @return {Node} */ function X_Node_clone( opt_clone_children ){ var xnode, xnodes, i, l; - if( this._tag ){ + if( this[ '_tag' ] ){ X_Node_newByTag = true; - xnode = new Node( this._tag, X_Object_clone( this._attrs ), X_Object_clone( this._css ) ) - .attr( { 'id' : this._id } ) - .className( this._className ); - if( opt_clone_children && ( xnodes = this._xnodes ) && ( l = xnodes.length ) ){ + xnode = new Node( this[ '_tag' ], X_Object_clone( this[ '_attrs' ] ), X_Object_clone( this[ '_css' ] ) ) + .attr( { 'id' : this[ '_id' ] } ) + [ 'className' ]( this[ '_className' ] ); + if( opt_clone_children && ( xnodes = this[ '_xnodes' ] ) && ( l = xnodes.length ) ){ for( i = 0; i < l; ++i ){ - xnode.append( xnodes[ i ].clone( true ) ); + xnode[ 'append' ]( xnodes[ i ][ 'clone' ]( true ) ); }; }; return xnode; }; X_Node_newByText = true; - return new Node( this._text ); + return new Node( this[ '_text' ] ); }; -/* -------------------------------------- - * Add - * Node - * HtmlElement の場合は内部使用専用 そのため event の破棄等しない +/** + * ノードを子配列の最後に追加する。文字列が渡された場合、HTMLパーサーによって Node ツリーを作成して追加する。HtmlElement, TextNode の場合は内部使用専用。 + * @alias Node.prototype.clone + * @param {Node|string|HTMLElement|TextNode} [v] HTMLElement と TextNode は内部のみ。 + * @return {Node} 自身。チェインメソッド + * @example myNode.append( node ); + * myNode.append( nodeSprite, '

    A
    ', 'B' ); */ function X_Node_append( v ){ var i, l, xnodes, frg; - if( !this._tag ) return; + if( !this[ '_tag' ] ) return; if( 1 < ( l = arguments.length ) ){ for( i = 0; i < l; ++i ){ - this.append( arguments[ i ] ); + this[ 'append' ]( arguments[ i ] ); }; return this; }; - if( !( xnodes = this._xnodes ) ) this._xnodes = xnodes = []; + if( !( xnodes = this[ '_xnodes' ] ) ) this[ '_xnodes' ] = xnodes = []; switch( X_Node_getType( v ) ){ case X_Node_TYPE.RAW_HTML : @@ -466,9 +607,9 @@ function X_Node_append( v ){ return this.append.apply( this, X_HtmlParser_parse( v, true ) ); case X_Node_TYPE.XNODE : // 親の xnodes から v を消す - v.parent && v.remove(); + v.parent && v[ 'remove' ](); // IE4 でテキストノードの追加、FIXED 済でない場合、親に要素の追加を通知 - if( X_UA[ 'IE4' ] && !v._tag && ( this._flags & X_Node_State.IE4_FIXED ) === 0 ) this._flags |= X_Node_State.IE4_DIRTY_CHILDREN; + if( X_UA[ 'IE4' ] && !v[ '_tag' ] && ( this[ '_flags' ] & X_Node_State.IE4_FIXED ) === 0 ) this[ '_flags' ] |= X_Node_State.IE4_DIRTY_CHILDREN; break; default : return this; @@ -476,34 +617,41 @@ function X_Node_append( v ){ v.parent = this; xnodes[ xnodes.length ] = v; - if( this._flags & X_Node_State.IN_TREE ){ - v._flags |= X_Node_State.IN_TREE; - v._xnodes && X_Node_toggleInTreeFlag( v._xnodes, true ); + if( this[ '_flags' ] & X_Node_State.IN_TREE ){ + v[ '_flags' ] |= X_Node_State.IN_TREE; + v[ '_xnodes' ] && X_Node_toggleInTreeFlag( v[ '_xnodes' ], true ); X_Node_reserveUpdate(); }; return this; }; - +/** + * ノードを挿入位置に追加する。 + * @alias Node.prototype.clone + * @param {number} index 挿入位置 0以上 + * @param {Node|string|HTMLElement|TextNode} [v] HTMLElement と TextNode は内部のみ。 + * @return {Node} 自身。チェインメソッド + * @example myNode.appendAt( 1, node ); + */ function X_Node_appendAt( start, v ){ var xnodes, l, i; - if( !this._tag ) return this; + if( !this[ '_tag' ] ) return this; l = arguments.length; - if( !( xnodes = this._xnodes ) ) xnodes = this._xnodes = []; + if( !( xnodes = this[ '_xnodes' ] ) ) xnodes = this[ '_xnodes' ] = []; if( xnodes.length <= start ){ - if( l === 2 ) return this.append( v ); + if( l === 2 ) return this[ 'append' ]( v ); for( i = 1; i < l; ++i ){ - this.append( arguments[ i ] ); + this[ 'append' ]( arguments[ i ] ); }; return this; }; if( start < 0 ) start = 0; if( 2 < l ){ for( ; l; ){ - this.appendAt( start, arguments[ --l ] ); + this[ 'appendAt' ]( start, arguments[ --l ] ); }; return this; }; @@ -517,24 +665,24 @@ function X_Node_appendAt( start, v ){ case X_Node_TYPE.STRING : v = X_HtmlParser_parse( v, true ); for( i = v.length; i; ){ - this.appendAt( start, v[ --i ] ); + this[ 'appendAt' ]( start, v[ --i ] ); }; return this; case X_Node_TYPE.XNODE : // 親の xnodes から v を消す - v.parent && v.remove(); + v.parent && v[ 'remove' ](); // IE4 でテキストノードの追加、FIXED 済でない場合、親に要素の追加を通知 - if( X_UA[ 'IE4' ] && !v._tag && ( this._flags & X_Node_State.IE4_FIXED ) === 0 ) this._flags |= X_Node_State.IE4_DIRTY_CHILDREN; + if( X_UA[ 'IE4' ] && !v[ '_tag' ] && ( this[ '_flags' ] & X_Node_State.IE4_FIXED ) === 0 ) this[ '_flags' ] |= X_Node_State.IE4_DIRTY_CHILDREN; break; default : return this; }; v.parent = this; - this._xnodes.splice( start, 0, v ); - if( this._flags & X_Node_State.IN_TREE ){ - v._flags |= X_Node_State.IN_TREE; - v._xnodes && X_Node_toggleInTreeFlag( v._xnodes, true ); + this[ '_xnodes' ].splice( start, 0, v ); + if( this[ '_flags' ] & X_Node_State.IN_TREE ){ + v[ '_flags' ] |= X_Node_State.IN_TREE; + v[ '_xnodes' ] && X_Node_toggleInTreeFlag( v[ '_xnodes' ], true ); X_Node_reserveUpdate(); }; return this; @@ -553,12 +701,7 @@ function X_Node_appendTo( parent, opt_index ){ default : return this; }; - opt_index === undefined ? parent.append( this ) : parent.appendAt( opt_index, this ); - return this; -}; - -function X_Node_appendToRoot( opt_index ){ - opt_index === undefined ? X_Node_body.append( this ) : X_Node_body.appendAt( opt_index, this ); + opt_index === undefined ? parent[ 'append' ]( this ) : parent[ 'appendAt' ]( opt_index, this ); return this; }; @@ -571,7 +714,7 @@ function X_Node_before( v ){ // getter if( v === undefined ){ if( !parent ) return; - xnodes = parent._xnodes; + xnodes = parent[ '_xnodes' ]; i = xnodes.indexOf( this ); return 0 < i ? xnodes[ i - 1 ] : v; }; @@ -579,14 +722,14 @@ function X_Node_before( v ){ if( !parent ) return this; l = arguments.length; - start = this.getOrder(); + start = this[ 'getOrder' ](); if( 1 < l ){ for( ; l; ){ - parent.appendAt( start, arguments[ --l ] ); + parent[ 'appendAt' ]( start, arguments[ --l ] ); }; return this; }; - parent.appendAt( start, v ); + parent[ 'appendAt' ]( start, v ); return this; }; @@ -596,7 +739,7 @@ function X_Node_after( v ){ // getter if( v === undefined ){ if( !parent ) return; - xnodes = parent._xnodes; + xnodes = parent[ '_xnodes' ]; i = xnodes.indexOf( this ); return ++i < xnodes.length ? xnodes[ i ] : v; }; @@ -604,30 +747,30 @@ function X_Node_after( v ){ if( !parent ) return this; l = arguments.length; - start = this.getOrder() + 1; - if( parent._xnodes.length <= start ){ + start = this[ 'getOrder' ]() + 1; + if( parent[ '_xnodes' ].length <= start ){ if( 1 < l ){ for( i = 0; i < l; ++i ){ - parent.append( arguments[ i ] ); + parent[ 'append' ]( arguments[ i ] ); }; return this; }; - parent.append( v ); + parent[ 'append' ]( v ); return this; }; if( 1 < l ){ for( ; l; ){ - parent.appendAt( start, arguments[ --l ] ); + parent[ 'appendAt' ]( start, arguments[ --l ] ); }; return this; }; - parent.appendAt( start, v ); + parent[ 'appendAt' ]( start, v ); return this; }; function X_Node_swap( v ){ if( !this.parent ) return this; - return arguments.length === 1 ? this.before( v ).remove() : this.before.apply( this, arguments ).remove(); + return arguments.length === 1 ? this[ 'prev' ]( v )[ 'remove' ]() : X_Node_before.apply( this, arguments )[ 'remove' ](); }; /* -------------------------------------- @@ -640,23 +783,23 @@ function X_Node_remove(){ if( !parent ) return this; delete this.parent; - parent._xnodes.splice( parent._xnodes.indexOf( this ), 1 ); + parent[ '_xnodes' ].splice( parent[ '_xnodes' ].indexOf( this ), 1 ); - if( this._flags & X_Node_State.IN_TREE ){ - this._flags &= ~X_Node_State.IN_TREE & ~X_Node_State.IE5_DISPLAY_NONE_FIX; - this._xnodes && X_Node_toggleInTreeFlag( this._xnodes, false ); + if( this[ '_flags' ] & X_Node_State.IN_TREE ){ + this[ '_flags' ] &= ~X_Node_State.IN_TREE & ~X_Node_State.IE5_DISPLAY_NONE_FIX; + this[ '_xnodes' ] && X_Node_toggleInTreeFlag( this[ '_xnodes' ], false ); if( X_UA_DOM.IE4 ){ - elm = this._rawObject || X_Node__ie4getRawNode( this ); + elm = this[ '_rawObject' ] || X_Node__ie4getRawNode( this ); if( elm ){ X_Node_reserveRemoval[ X_Node_reserveRemoval.length ] = this; X_Node_reserveUpdate(); } else - if( !this._tag && ( parent._flags & X_Node_State.IE4_FIXED ) === 0 ){ - parent._flags |= X_Node_State.IE4_DIRTY_CHILDREN; + if( !this[ '_tag' ] && ( parent[ '_flags' ] & X_Node_State.IE4_FIXED ) === 0 ){ + parent[ '_flags' ] |= X_Node_State.IE4_DIRTY_CHILDREN; }; } else { - elm = this._rawObject; + elm = this[ '_rawObject' ]; if( elm && elm.parentNode && elm.parentNode.tagName ){ X_Node_reserveRemoval[ X_Node_reserveRemoval.length ] = this; X_Node_reserveUpdate(); @@ -667,7 +810,7 @@ function X_Node_remove(){ }; function X_Node_empty(){ - var xnodes = this._xnodes, i; + var xnodes = this[ '_xnodes' ], i; if( xnodes && ( i = xnodes.length ) ){ for( ; i; ){ xnodes[ --i ].destroy(); @@ -682,38 +825,38 @@ function X_Node_empty(){ */ function X_Node_destroy( isChild ){ - var xnodes = this._xnodes, i, elm; + var xnodes = this[ '_xnodes' ], i, elm; - if( ( this._flags & X_Node_State.EXIST ) === 0 ) return; + if( ( this[ '_flags' ] & X_Node_State.EXIST ) === 0 ) return; - elm = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ); + elm = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ); if( xnodes && ( i = xnodes.length ) ){ //for( ; i; ){ // xnodes[ --i ].destroy( true ); //}; }; - elm && this._listeners && this.unlisten(); // イベントの退避 + elm && this._listeners && this[ 'unlisten' ](); // イベントの退避 - if( this._flags & X_Node_State.IN_TREE ){ - !isChild && this.remove(); - this._flags &= ~X_Node_State.EXIST; + if( this[ '_flags' ] & X_Node_State.IN_TREE ){ + !isChild && this[ 'remove' ](); + this[ '_flags' ] &= ~X_Node_State.EXIST; } else { - this.parent && this.parent._xnodes.splice( this.parent._xnodes.indexOf( this ), 1 ); + this.parent && this.parent[ '_xnodes' ].splice( this.parent[ '_xnodes' ].indexOf( this ), 1 ); elm && !isChild && X_Node__actualRemove( this ); - this.kill(); + this[ 'kill' ](); }; - delete X_Node_CHASHE[ this._uid ]; + delete X_Node_CHASHE[ this[ '_uid' ] ]; }; function X_Node_onBeforeKill( e ){ - var xnodes = this._xnodes, i, elm; + var xnodes = this[ '_xnodes' ], i, elm; - if( ( this._flags & X_Node_State.EXIST ) === 0 ) return X.Callback.NONE; + if( ( this[ '_flags' ] & X_Node_State.EXIST ) === 0 ) return X_Callback_NONE; - elm = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ); - elm && this._listeners && this.unlisten(); // イベントの退避 + elm = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ); + elm && this._listeners && this[ 'unlisten' ](); // イベントの退避 if( xnodes && ( i = xnodes.length ) ){ for( ; i; ){ @@ -721,16 +864,16 @@ function X_Node_onBeforeKill( e ){ }; }; - delete X_Node_CHASHE[ this._uid ]; + delete X_Node_CHASHE[ this[ '_uid' ] ]; if( e ){ - this.remove(); + this[ 'remove' ](); if( X_Node_reserveRemoval[ X_Node_reserveRemoval.length - 1 ] === this ){ - this._flags &= ~X_Node_State.EXIST; - return X.Callback.PREVENT_DEFAULT; + this[ '_flags' ] &= ~X_Node_State.EXIST; + return X_Callback_PREVENT_DEFAULT; }; }; - return X.Callback.NONE; + return X_Callback_NONE; }; @@ -739,20 +882,20 @@ function X_Node_onBeforeKill( e ){ */ function X_Node_contains( v ){ var elm, type, xnodes, i; - if( !v || !this._tag || this === v ) return false; + if( !v || !this[ '_tag' ] || this === v ) return false; // contains ie4+ - if( ( elm = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ) ) && document.contains && ( type = X_Node_getType( v ) ) && ( type === X_Node_TYPE.RAW_HTML || type === X_Node_TYPE.RAW_TEXT ) ){ - return elm.contains( v ); + if( ( elm = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ) ) && document.contains && ( type = X_Node_getType( v ) ) && ( type === X_Node_TYPE.RAW_HTML || type === X_Node_TYPE.RAW_TEXT ) ){ + return elm[ 'contains' ]( v ); }; //if( document.compareDocumentPosition ){ // //}; - xnodes = this._xnodes; + xnodes = this[ '_xnodes' ]; if( !xnodes || !xnodes.length ) return false; if( xnodes.indexOf( v ) !== -1 ) return true; // fast if( elm === v.parentNode ) return true; for( i = xnodes.length; i; ){ - if( xnodes[ --i ].contains( v ) ) return true; + if( xnodes[ --i ][ 'contains' ]( v ) ) return true; }; return false; }; @@ -761,12 +904,12 @@ function X_Node_contains( v ){ * getChild */ function X_Node_getChildAt( i ){ - var xnodes = this._xnodes; + var xnodes = this[ '_xnodes' ]; return xnodes && 0 <= i && i < xnodes.length && xnodes[ i ]; }; function X_Node_length(){ - var xnodes = this._xnodes; + var xnodes = this[ '_xnodes' ]; return xnodes ? xnodes.length : 0; }; @@ -774,10 +917,11 @@ function X_Node_length(){ * firstChild, lastChild */ function X_Node_firstChild(){ - return this.getChildAt( 0 ); + return this[ '_xnodes' ] && this[ '_xnodes' ][ 0 ]; }; function X_Node_lastChild(){ - return this.getChildAt( this._xnodes.length - 1 ); + var xnodes = this[ '_xnodes' ]; + return xnodes && xnodes[ xnodes.length - 1 ]; }; /* -------------------------------------- @@ -786,7 +930,7 @@ function X_Node_lastChild(){ function X_Node_getOrder(){ var parent = this.parent; if( !parent ) return -1; - return parent._xnodes.indexOf( this ); + return parent[ '_xnodes' ].indexOf( this ); }; /* -------------------------------------- @@ -795,12 +939,12 @@ function X_Node_getOrder(){ function X_Node_className( v ){ var node, _, __; // getter - if( v === undefined ) return this._className; + if( v === undefined ) return this[ '_className' ]; // setter - if( this._className === v ) return this; + if( this[ '_className' ] === v ) return this; if( !v || !X_Type_isString( v ) ){ - delete this._className; + delete this[ '_className' ]; } else { // cleanup _ = ' '; @@ -809,11 +953,11 @@ function X_Node_className( v ){ v.charAt( 0 ) === _ && ( v = v.substr( 1 ) ); v.lastIndexOf( _ ) === 0 && ( v = v.substr( 0, v.length - 1 ) ); - if( this._className === v ) return this; - v ? ( this._className = v ) : delete this._className; + if( this[ '_className' ] === v ) return this; + v ? ( this[ '_className' ] = v ) : delete this[ '_className' ]; }; - this._flags |= X_Node_State.DIRTY_CLASSNAME; - this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate(); + this[ '_flags' ] |= X_Node_State.DIRTY_CLASSNAME; + this[ '_flags' ] & X_Node_State.IN_TREE && X_Node_reserveUpdate(); return this; }; function X_Node_addClass( v ){ @@ -824,13 +968,13 @@ function X_Node_addClass( v ){ for( ; i; ){ name = names[ --i ]; if( !name ) continue; - !this.hasClass( name ) && ( v += ( v ? ' ' : '' ) + name ); + !this[ 'hasClass' ]( name ) && ( v += ( v ? ' ' : '' ) + name ); }; - return v ? this.className( this._className + ( this._className ? ' ' : '' ) + v ) : this; + return v ? this[ 'className' ]( this[ '_className' ] + ( this[ '_className' ] ? ' ' : '' ) + v ) : this; }; function X_Node_removeClass( v ){ var _ = ' ', - className = this._className, + className = this[ '_className' ], names = v.split( _ ), classNames, i, f, j; if( !className ) return this; @@ -845,23 +989,23 @@ function X_Node_removeClass( v ){ }; }; }; - return f ? this.className( classNames.join( _ ) ) : this; + return f ? this[ 'className' ]( classNames.join( _ ) ) : this; }; function X_Node_toggleClass( v, opt_toggle ){ var names, i, name; if( opt_toggle !== undefined ){ - return !!opt_toggle ? this.addClass( v ) : this.removeClass( v ); + return !!opt_toggle ? this[ 'addClass' ]( v ) : this[ 'removeClass' ]( v ); }; names = v.split( ' ' ); for( i = names.length; i; ){ name = names[ --i ]; - this.hasClass( name ) ? this.removeClass( name ) : this.addClass( name ); + this[ 'hasClass' ]( name ) ? this[ 'removeClass' ]( name ) : this[ 'addClass' ]( name ); }; return this; }; function X_Node_hasClass( v ){ var _ = ' ', - className = this._className, + className = this[ '_className' ], i, name; if( className === v ) return true; if( !className ) return false; @@ -886,35 +1030,35 @@ function X_Node_html( html ){ var _ = '', q = '"', xnodes, n, i, l; // setter if( html !== undefined ){ // String 以外に Number や false null なども許可 - if( !this._tag ) return this.text( html ); - return html ? this.empty().append.apply( this, X_HtmlParser_parse( html, true ) ) : this.empty(); + if( !this[ '_tag' ] ) return this[ 'text' ]( html ); + return html ? this[ 'empty' ]().append.apply( this, X_HtmlParser_parse( html, true ) ) : this[ 'empty' ](); }; // getter - if( !this._tag ){ - return this._text; + if( !this[ '_tag' ] ){ + return this[ '_text' ]; }; - this._flags & X_Node_State.OLD_CSSTEXT && X_Node_CSS_objToCssText( this ); + this[ '_flags' ] & X_Node_State.OLD_CSSTEXT && X_Node_CSS_objToCssText( this ); html = !X_Node_outerXNode ? [] : [ - '<', this._tag, - this._id ? ' id="' + this._id + q : _, - this._className ? ' class="' + this._className + q : _, - this._flags & X_Node_State.OLD_ATTRTEXT ? X_Node_Attr_objToAttrText( this ) : this._attrText, - this._cssText ? ' style="' + this._cssText + q : _, + '<', this[ '_tag' ], + this[ '_id' ] ? ' id="' + this[ '_id' ] + q : _, + this[ '_className' ] ? ' class="' + this[ '_className' ] + q : _, + this[ '_flags' ] & X_Node_State.OLD_ATTRTEXT ? X_Node_Attr_objToAttrText( this ) : this[ '_attrText' ], + this[ '_cssText' ] ? ' style="' + this[ '_cssText' ] + q : _, '>' ]; n = html.length; - if( ( xnodes = this._xnodes ) && ( l = xnodes.length ) ){ + if( ( xnodes = this[ '_xnodes' ] ) && ( l = xnodes.length ) ){ if( !X_Node_outerXNode ) X_Node_outerXNode = this; for( i = 0; i < l; ++i ){ - html[ n ] = xnodes[ i ].html(); + html[ n ] = xnodes[ i ][ 'html' ](); ++n; }; if( X_Node_outerXNode === this ) X_Node_outerXNode = null; }; - !X_Node_outerXNode || X_Dom_DTD_EMPTY[ this._tag ] || ( html[ n ] = '<\/' + this._tag + '>' ); + !X_Node_outerXNode || X_Dom_DTD_EMPTY[ this[ '_tag' ] ] || ( html[ n ] = '<\/' + this[ '_tag' ] + '>' ); return html.join( _ ); }; @@ -928,34 +1072,34 @@ function X_Node_text( text ){ if( text === null ) text = ''; text += ''; - if( !this._tag ){ - if( this._text !== text ){ - text ? ( this._text = text ) : delete this._text; - this._flags |= X_Node_State.DIRTY_CONTENT; - this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate(); + if( !this[ '_tag' ] ){ + if( this[ '_text' ] !== text ){ + text ? ( this[ '_text' ] = text ) : delete this[ '_text' ]; + this[ '_flags' ] |= X_Node_State.DIRTY_CONTENT; + this[ '_flags' ] & X_Node_State.IN_TREE && X_Node_reserveUpdate(); }; return this; }; - if( ( xnodes = this._xnodes ) && xnodes.length === 1 && !xnodes[ 0 ]._tag ){ - xnodes[ 0 ].text( text ); + if( ( xnodes = this[ '_xnodes' ] ) && xnodes.length === 1 && !xnodes[ 0 ][ '_tag' ] ){ + xnodes[ 0 ][ 'text' ]( text ); return this; }; // TODO 一つのtextnode を残すケース 完全に削除したい場合は empty()を使う - if( !text ) return this.empty(); - this.empty().createText( text ); + if( !text ) return this[ 'empty' ](); + this[ 'empty' ]()[ 'createText' ]( text ); return this; }; // getter - if( this._tag ){ - if( ( xnodes = this._xnodes ) && ( l = xnodes.length ) ){ + if( this[ '_tag' ] ){ + if( ( xnodes = this[ '_xnodes' ] ) && ( l = xnodes.length ) ){ for( texts = [], i = 0; i < l; ++i ){ - texts[ i ] = xnodes[ i ].text(); + texts[ i ] = xnodes[ i ][ 'text' ](); }; return texts.join( '' ); }; return ''; }; - return this._text; + return this[ '_text' ]; }; /* @@ -969,24 +1113,24 @@ function X_Node_call( name /*, opt_args... */ ){ switch( name ){ case 'nodeType' : - return this._tag ? 1 : 3; + return this[ '_tag' ] ? 1 : 3; case 'text' : - return this.text(); + return this[ 'text' ](); case 'html' : case 'innerHTML' : - return this.html(); + return this[ 'html' ](); case 'outerHTML' : X_Node_outerXNode = X_Node_body; // == true ならなんでもよい。型を合わすために xbody にしている - v = this.html(); + v = this[ 'html' ](); X_Node_outerXNode = null; return v; case 'fontSize' : return X_Node_CSS_getCharSize( this ); case 'inGPU' : - return !!( this._flags & ( X_Node_State.GPU_NOW | X_Node_State.GPU_RELEASE_RESERVED ) ); + return !!( this[ '_flags' ] & ( X_Node_State.GPU_NOW | X_Node_State.GPU_RELEASE_RESERVED ) ); }; - raw = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ); + raw = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ); if( !raw ) return; if( name === 'scrollTo' ){ @@ -1049,7 +1193,7 @@ function X_Node_each( func /*, opt_args */ ){ */ function X_Node_reserveUpdate(){ - if( !X_Node_updateTimerID ) X_Node_updateTimerID = X.Timer.requestFrame( X_Node_startUpdate ); + if( !X_Node_updateTimerID ) X_Node_updateTimerID = X_Timer_requestFrame( X_Node_startUpdate ); }; var X_Node_updateReservedByReleaseGPU = false; @@ -1057,16 +1201,16 @@ var X_Node_updateReservedByReleaseGPU = false; function X_Node_startUpdate( time ){ var removal, i, xnode; - if( !X_Node_updateTimerID || X_ViewPort_readyState < X_TEMP.SYSTEM_EVENT_INIT ){ + if( !X_Node_updateTimerID || X_ViewPort_readyState < X_EVENT_INIT ){ return; }; - X.Timer.cancelFrame( X_Node_updateTimerID ); + X_Timer_cancelFrame( X_Node_updateTimerID ); X_Node_updateTimerID = 0; if( time ){ // X.Timer 経由でないと発火しない このイベントでサイズを取ると無限ループに - X_System._listeners && X_System._listeners[ X_Event.BEFORE_UPDATE ] && X_System.dispatch( X_Event.BEFORE_UPDATE ); + X_System._listeners && X_System._listeners[ X_EVENT_BEFORE_UPDATE ] && X_System[ 'dispatch' ]( X_EVENT_BEFORE_UPDATE ); }; removal = X_Node_reserveRemoval; @@ -1076,16 +1220,16 @@ function X_Node_startUpdate( time ){ xnode = removal[ --i ]; // TODO GPU レイヤーの子の場合、remove をスキップする。 非GPU レイヤーへ apppend される場合、clone する? X_Node__actualRemove( xnode ); - ( xnode._flags & X_Node_State.EXIST ) === 0 && xnode.kill(); + ( xnode[ '_flags' ] & X_Node_State.EXIST ) === 0 && xnode[ 'kill' ](); }; removal.length = 0; }; - if( X_Node_html._flags & X_Node_BitMask_IS_DIRTY ){ - X_Node__commitUpdate( X_Node_html, X_Node_html._rawObject.parentNode, null, X_Node_html._flags ); + if( X_Node_html[ '_flags' ] & X_Node_BitMask_IS_DIRTY ){ + X_Node__commitUpdate( X_Node_html, X_Node_html[ '_rawObject' ].parentNode, null, X_Node_html[ '_flags' ] ); } else { - X_Node__commitUpdate( X_Node_head, X_Node_head._rawObject.parentNode, null, X_Node_head._flags ); - X_Node__commitUpdate( X_Node_body, X_Node_body._rawObject.parentNode, null, X_Node_body._flags ); + X_Node__commitUpdate( X_Node_head, X_Node_head[ '_rawObject' ].parentNode, null, X_Node_head[ '_flags' ] ); + X_Node__commitUpdate( X_Node_body, X_Node_body[ '_rawObject' ].parentNode, null, X_Node_body[ '_flags' ] ); }; if( X_Node_updateReservedByReleaseGPU ){ @@ -1095,10 +1239,10 @@ function X_Node_startUpdate( time ){ if( time ){ // X.Timer 経由でないと発火しない このイベントでサイズを取ると無限ループに - X_System._listeners && X_System._listeners[ X_Event.UPDATED ] && X_System.dispatch( X_Event.UPDATED ); + X_System._listeners && X_System._listeners[ X_EVENT_UPDATED ] && X_System[ 'dispatch' ]( X_EVENT_UPDATED ); }; - X_ViewPort._listeners && X_ViewPort._listeners[ X_Event.AFTER_UPDATE ] && X_ViewPort.asyncDispatch( X_Event.AFTER_UPDATE ); + X_ViewPort._listeners && X_ViewPort._listeners[ X_EVENT_AFTER_UPDATE ] && X_ViewPort[ 'asyncDispatch' ]( X_EVENT_AFTER_UPDATE ); }; /* @@ -1117,34 +1261,34 @@ function X_Node_startUpdate( time ){ var X_Node__commitUpdate = X_UA_DOM.W3C ? ( function( that, parentElement, nextElement, accumulatedFlags ){ - var elm = that._rawObject, + var elm = that[ '_rawObject' ], created, xnodes, l, next; // 1. GPU 一切の更新をスキップ - if( that._flags & X_Node_State.GPU_NOW ){ - console.log( '更新のskip ' + !!( that._flags & X_Node_BitMask_IS_DIRTY ) ); - that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm ); + if( that[ '_flags' ] & X_Node_State.GPU_NOW ){ + console.log( '更新のskip ' + !!( that[ '_flags' ] & X_Node_BitMask_IS_DIRTY ) ); + that[ '_flags' ] & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm ); return elm; }; // 2. GPU解放予約 // TODO もしかしたらこのタイミングで更新できるかも。 - if( that._flags & X_Node_State.GPU_RELEASE_RESERVED ){ + if( that[ '_flags' ] & X_Node_State.GPU_RELEASE_RESERVED ){ console.log( 'GPU 解放 ' ); //X_Node_updateReservedByReleaseGPU = true; //X_Node__updateRawNode( that, elm ); - that._flags &= X_Node_BitMask_RESET_GPU; + that[ '_flags' ] &= X_Node_BitMask_RESET_GPU; //return elm; }; // 3. GPU予約 -> GPU - if( that._flags & X_Node_State.GPU_RESERVED ){ - that._flags &= X_Node_BitMask_RESET_GPU; - that._flags |= X_Node_State.GPU_NOW; + if( that[ '_flags' ] & X_Node_State.GPU_RESERVED ){ + that[ '_flags' ] &= X_Node_BitMask_RESET_GPU; + that[ '_flags' ] |= X_Node_State.GPU_NOW; }; // 4. style="display:none" の場合 - if( that._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ){ + if( that[ '_flags' ] & X_Node_State.STYLE_IS_DISPLAY_NONE ){ if( X_Node_displayNoneFixForIE5 ){ // filter の効いている要素を含む要素は display:none が無視される。 // filter = '' で削除はできるが、再表示時に filter が消える。 -> filter な要素を削除してしまう。 @@ -1158,9 +1302,9 @@ var X_Node__commitUpdate = }; // 5. ie5 非表示fixフラグ - accumulatedFlags |= that._flags; + accumulatedFlags |= that[ '_flags' ]; - if( that._flags & X_Node_State.IE5_DISPLAY_NONE_FIX ){ + if( that[ '_flags' ] & X_Node_State.IE5_DISPLAY_NONE_FIX ){ if( accumulatedFlags & ( X_Node_State.DIRTY_POSITION | X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME ) === 0 ){ return nextElement; }; @@ -1168,27 +1312,27 @@ var X_Node__commitUpdate = // 6. 要素の生成 if( !elm ){ - if( !that._tag ){ - that._flags &= X_Node_BitMask_RESET_DIRTY; - that._rawObject = elm = document.createTextNode( X_String_chrReferanceTo( that._text ) ); + if( !that[ '_tag' ] ){ + that[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; + that[ '_rawObject' ] = elm = document.createTextNode( X_String_chrReferanceTo( that[ '_text' ] ) ); if( !X_UA[ 'IE' ] ){ - elm.UID = that._uid; + elm[ 'UID' ] = that[ '_uid' ]; }; } else if( X_Node_strictElmCreation ){ - that._flags & X_Node_State.OLD_CSSTEXT && X_Node_CSS_objToCssText( that, true ); // OLD_CSSTEXT ?? + that[ '_flags' ] & X_Node_State.OLD_CSSTEXT && X_Node_CSS_objToCssText( that, true ); // OLD_CSSTEXT ?? - that._rawObject = elm = + that[ '_rawObject' ] = elm = document.createElement( [ - '<', that._tag, - ' UID="', that._uid, '"', - that._id ? ' id="' + that._id + '"' : '', - that._className ? ' class="' + that._className + '"' : '', + '<', that[ '_tag' ], + ' UID="', that[ '_uid' ], '"', + that[ '_id' ] ? ' id="' + that[ '_id' ] + '"' : '', + that[ '_className' ] ? ' class="' + that[ '_className' ] + '"' : '', X_Node_Attr_objToAttrText( that, true ), - that._cssText ? ' style="' + that._cssText + '"' : '', + that[ '_cssText' ] ? ' style="' + that[ '_cssText' ] + '"' : '', '>' ].join( '' ) ); } else { - that._rawObject = elm = document.createElement( that._tag ); + that[ '_rawObject' ] = elm = document.createElement( that[ '_tag' ] ); }; // IE には要素追加のタイミングで起こるメモリリークがありここで追加 @@ -1198,9 +1342,9 @@ var X_Node__commitUpdate = parentElement.appendChild( elm ); }; - if( that._tag ){ + if( that[ '_tag' ] ){ X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰 - that._flags |= X_Node_State.ACTUAL_LISTENING; + that[ '_flags' ] |= X_Node_State.ACTUAL_LISTENING; if( X_Node_documentFragment ){ //( frg = X_Node_documentFragment ).appendChild( elm ); @@ -1208,20 +1352,20 @@ var X_Node__commitUpdate = }; if( X_Node_strictElmCreation ){ - that._flags &= X_Node_BitMask_RESET_DIRTY; + that[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; // ie の string から要素を作る場合、ネットワーク系属性は onload イベントなどを拾うために、要素生成->イベント復帰後に適用する - that._newAttrs && ( that._flags |= X_Node_State.DIRTY_ATTR ); // _newAttrs には ネットワーク系属性が入っている。Network 系の属性は遅らせて設定 - that._flags |= X_Node_State.DIRTY_IE_FILTER;// doc 追加後に filter を指定しないと有効にならない。 + that[ '_newAttrs' ] && ( that[ '_flags' ] |= X_Node_State.DIRTY_ATTR ); // _newAttrs には ネットワーク系属性が入っている。Network 系の属性は遅らせて設定 + that[ '_flags' ] |= X_Node_State.DIRTY_IE_FILTER;// doc 追加後に filter を指定しないと有効にならない。 } else { - elm.UID = that._uid; - that._newAttrs = that._attrs; - that._flags &= X_Node_BitMask_RESET_DIRTY; - that._flags |= X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME | X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_CSS | X_Node_State.DIRTY_IE_FILTER; + elm[ 'UID' ] = that[ '_uid' ]; + that[ '_newAttrs' ] = that[ '_attrs' ]; + that[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; + that[ '_flags' ] |= X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME | X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_CSS | X_Node_State.DIRTY_IE_FILTER; // http://outcloud.blogspot.jp/2010/09/iframe.html // この問題は firefox3.6 で確認 if( X_UA[ 'Gecko' ] ){ - if( that._tag === 'IFRAME' && ( !that._attrs || !that._attrs[ 'src' ] ) ){ + if( that[ '_tag' ] === 'IFRAME' && ( !that[ '_attrs' ] || !that[ '_attrs' ][ 'src' ] ) ){ //elm.contentWindow.location.replace = elm.src = 'about:blank'; that.attr( 'src', 'about:blank' ); }; @@ -1238,14 +1382,14 @@ var X_Node__commitUpdate = parentElement.appendChild( elm ); }; - if( that._listeners && ( that._flags & X_Node_State.ACTUAL_LISTENING ) === 0 ){ + if( that._listeners && ( that[ '_flags' ] & X_Node_State.ACTUAL_LISTENING ) === 0 ){ X_EventDispatcher_toggleAllEvents( that, true );// イベントの退避 - that._flags |= X_Node_State.ACTUAL_LISTENING; + that[ '_flags' ] |= X_Node_State.ACTUAL_LISTENING; }; // 8. 更新の適用 if( accumulatedFlags & X_Node_BitMask_IS_DIRTY ){ - delete that._fontSize; + delete that[ '_fontSize' ]; X_Node__updateRawNode( that, elm ); }; @@ -1253,18 +1397,18 @@ var X_Node__commitUpdate = // 親及び自身へのクラス・id指定で display : none になるケースがありそれを検出 // 生成と破棄が繰り返されてしまう、親と自身の id, class が変わった場合だけ再生成。 accumulatedFlags & ( ID | CLASSNAME ) // currentStyle を観ていたときはエラーで停止する、alert と挟むと正常に動いて支離滅裂 - if( X_Node_displayNoneFixForIE5 && that._tag ){ + if( X_Node_displayNoneFixForIE5 && that[ '_tag' ] ){ if( elm.runtimeStyle.display === 'none' ){ X_Node__actualRemove( that ); - that._flags |= X_Node_State.IE5_DISPLAY_NONE_FIX; + that[ '_flags' ] |= X_Node_State.IE5_DISPLAY_NONE_FIX; return nextElement; } else { - that._flags &= ~X_Node_State.IE5_DISPLAY_NONE_FIX; + that[ '_flags' ] &= ~X_Node_State.IE5_DISPLAY_NONE_FIX; }; }; // 10. 子要素の更新。 - if( ( xnodes = that._xnodes ) && ( l = xnodes.length ) ) { + if( ( xnodes = that[ '_xnodes' ] ) && ( l = xnodes.length ) ) { for( ; l; ){ next = X_Node__commitUpdate( xnodes[ --l ], elm, next, accumulatedFlags ); }; @@ -1275,7 +1419,7 @@ var X_Node__commitUpdate = parentElement.insertBefore( elm, nextElement ) : parentElement.appendChild( elm ); - if( X_UA[ 'Gecko' ] && that._tag === 'IFRAME' && elm.contentWindow ){ + if( X_UA[ 'Gecko' ] && that[ '_tag' ] === 'IFRAME' && elm.contentWindow ){ // tree に追加されるまで contentWindow は存在しない。 elm.contentWindow.location.replace = elm.src; }; @@ -1285,16 +1429,16 @@ var X_Node__commitUpdate = }) : X_UA_DOM.IE4 ? ( function( that, parentElement, prevElement, accumulatedFlags ){ - var elm = that._rawObject || X_Node__ie4getRawNode( that ), + var elm = that[ '_rawObject' ] || X_Node__ie4getRawNode( that ), xnodes, l, i, dirty, mix, html, text, prev; - if( !that._tag ){ - that._flags & X_Node_State.DIRTY_CONTENT && X_Node__updateRawNode( that, elm ); + if( !that[ '_tag' ] ){ + that[ '_flags' ] & X_Node_State.DIRTY_CONTENT && X_Node__updateRawNode( that, elm ); return elm; }; // 4. style="display:none" の場合 - if( that._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ){ + if( that[ '_flags' ] & X_Node_State.STYLE_IS_DISPLAY_NONE ){ if( elm ){ elm.style.display = 'none'; if( elm.style.display !== 'none' ){ // ie4 の style は currentStyle 相当らしい、、、? div 以外への display:none が効かないので remove する。 @@ -1310,14 +1454,14 @@ var X_Node__commitUpdate = prevElement.insertAdjacentHTML( 'AfterEnd', X_Node__actualCreate( that, false ) ) : parentElement.insertAdjacentHTML( 'AfterBegin', X_Node__actualCreate( that, false ) ); X_Node__afterActualCreate( that ); - return that._rawObject || X_Node__ie4getRawNode( that ); + return that[ '_rawObject' ] || X_Node__ie4getRawNode( that ); }; - accumulatedFlags |= that._flags; + accumulatedFlags |= that[ '_flags' ]; - xnodes = that._xnodes; + xnodes = that[ '_xnodes' ]; l = xnodes ? xnodes.length : 0; - dirty = !!( that._flags & X_Node_State.IE4_DIRTY_CHILDREN ); + dirty = !!( that[ '_flags' ] & X_Node_State.IE4_DIRTY_CHILDREN ); /* * HTML の下に TextNode だけ 。MIX_FIXED でない場合、削除、追加 を親に通知 @@ -1326,21 +1470,21 @@ var X_Node__commitUpdate = * HTML の下は MIX_FIXED -> TextNode を に置き換えてあるのでW3C DON 的に触ることができる */ if( dirty ){ - that._flags &= ~X_Node_State.IE4_DIRTY_CHILDREN; + that[ '_flags' ] &= ~X_Node_State.IE4_DIRTY_CHILDREN; for( i = 0; i < l; ++i ){ - if( xnodes[ i ]._tag ){ - that._flags |= X_Node_State.IE4_HAS_ELEMENT; + if( xnodes[ i ][ '_tag' ] ){ + that[ '_flags' ] |= X_Node_State.IE4_HAS_ELEMENT; } else { - that._flags |= X_Node_State.IE4_HAS_TEXTNODE; + that[ '_flags' ] |= X_Node_State.IE4_HAS_TEXTNODE; }; - if( that._flags & X_Node_BitMask_IE4_IS_MIX === X_Node_BitMask_IE4_IS_MIX ){ + if( that[ '_flags' ] & X_Node_BitMask_IE4_IS_MIX === X_Node_BitMask_IE4_IS_MIX ){ mix = true; break; }; }; }; - if( that._flags & X_Node_State.IE4_FIXED || that._flags & X_Node_BitMask_IE4_IS_MIX === X_Node_State.IE4_HAS_ELEMENT ){ + if( that[ '_flags' ] & X_Node_State.IE4_FIXED || that[ '_flags' ] & X_Node_BitMask_IE4_IS_MIX === X_Node_State.IE4_HAS_ELEMENT ){ for( i = 0; i < l; ++i ){ prev = X_Node__commitUpdate( xnodes[ i ], elm, prev, accumulatedFlags ); }; @@ -1354,24 +1498,24 @@ var X_Node__commitUpdate = for( i = 0; i < l; ++i ){ X_Node__afterActualCreate( xnodes[ i ] ); }; - that._flags |= X_Node_State.IE4_FIXED; + that[ '_flags' ] |= X_Node_State.IE4_FIXED; } else - if( that._flags & X_Node_State.IE4_HAS_TEXTNODE ){ + if( that[ '_flags' ] & X_Node_State.IE4_HAS_TEXTNODE ){ dirty = dirty || false; for( i = 0; i < l; ++i ){ text = xnodes[ i ]; - if( text._flags & X_Node_BitMask_IS_DIRTY ){ - text._flags &= X_Node_BitMask_RESET_DIRTY; + if( text[ '_flags' ] & X_Node_BitMask_IS_DIRTY ){ + text[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; dirty = true; }; }; - if( dirty ) elm.innerHTML = that.text(); + if( dirty ) elm.innerHTML = that[ 'text' ](); }; - if( accumulatedFlags & X_Node_BitMask_IS_DIRTY ) delete that._fontSize; + if( accumulatedFlags & X_Node_BitMask_IS_DIRTY ) delete that[ '_fontSize' ]; - that._flags &= ~X_Node_State.DIRTY_POSITION; - that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm ); + that[ '_flags' ] &= ~X_Node_State.DIRTY_POSITION; + that[ '_flags' ] & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm ); return elm; }) : (function(){}); @@ -1385,28 +1529,28 @@ var X_Node__updateRawNode = var attrs, rename, k, v; // textNode - if( !that._tag ){ - elm.data = X_String_chrReferanceTo( that._text ); - that._flags &= X_Node_BitMask_RESET_DIRTY; + if( !that[ '_tag' ] ){ + elm.data = X_String_chrReferanceTo( that[ '_text' ] ); + that[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; return; }; // id - if( that._flags & X_Node_State.DIRTY_ID ){ - that._id ? ( elm.id = that._id ) : ( elm.id && elm.removeAttribute( 'id' ) ); + if( that[ '_flags' ] & X_Node_State.DIRTY_ID ){ + that[ '_id' ] ? ( elm.id = that[ '_id' ] ) : ( elm.id && elm.removeAttribute( 'id' ) ); }; // className - if( that._flags & X_Node_State.DIRTY_CLASSNAME ){ - that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA[ 'IE' ] < 8 ? 'className' : 'class' ) ); // className は ie7- + if( that[ '_flags' ] & X_Node_State.DIRTY_CLASSNAME ){ + that[ '_className' ] ? ( elm.className = that[ '_className' ] ) : ( elm.className && elm.removeAttribute( X_UA[ 'IE' ] < 8 ? 'className' : 'class' ) ); // className は ie7- }; // attr - if( that._flags & X_Node_State.DIRTY_ATTR && ( attrs = that._newAttrs || that._attrs ) ){ + if( that[ '_flags' ] & X_Node_State.DIRTY_ATTR && ( attrs = that[ '_newAttrs' ] || that[ '_attrs' ] ) ){ rename = X_Node_Attr_renameForDOM; for( k in attrs ){ v = attrs[ k ]; - switch( that._tag + k ){ + switch( that[ '_tag' ] + k ){ case 'TEXTAREAvalue' : // IETester 5.5 ではエラーが出なかった.MultipulIE5.5 ではエラーが出たので if( !X_UA[ 'MacIE' ] && X_UA[ 'IE5x' ] ){ @@ -1439,41 +1583,41 @@ var X_Node__updateRawNode = elm.removeAttribute( rename[ k ] || k ) : ( elm[ rename[ k ] || k ] = X_Node_Attr_noValue[ k ] ? k : v ); }; - delete that._newAttrs; + delete that[ '_newAttrs' ]; }; // style - if( that._flags & X_Node_State.DIRTY_CSS ){ - if( that._flags & X_Node_State.OLD_CSSTEXT ? X_Node_CSS_objToCssText( that ) : that._cssText ){ + if( that[ '_flags' ] & X_Node_State.DIRTY_CSS ){ + if( that[ '_flags' ] & X_Node_State.OLD_CSSTEXT ? X_Node_CSS_objToCssText( that ) : that[ '_cssText' ] ){ X_UA[ 'Opera78' ] || X_UA[ 'NN6' ] ? - elm.setAttribute( 'style', that._cssText ) : // opera8用 - ( elm.style.cssText = that._cssText ); + elm.setAttribute( 'style', that[ '_cssText' ] ) : // opera8用 + ( elm.style.cssText = that[ '_cssText' ] ); } else { elm.style.cssText = ''; // IE5.5以下 Safari3.2 で必要 elm.removeAttribute( 'style' ); }; } else - if( that._flags & X_Node_State.DIRTY_IE_FILTER ){ + if( that[ '_flags' ] & X_Node_State.DIRTY_IE_FILTER ){ v = X_Node_CSS_objToIEFilterText( that ); if( v ){ elm.style.filter = v; - that._flags |= X_Node_State.IE_FILTER_NOW; + that[ '_flags' ] |= X_Node_State.IE_FILTER_NOW; } else { elm.style.removeAttribute( 'filter' ); - that._flags &= ~X_Node_State.IE_FILTER_NOW; + that[ '_flags' ] &= ~X_Node_State.IE_FILTER_NOW; }; }; - that._flags &= X_Node_BitMask_RESET_DIRTY; + that[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; }) : X_UA_DOM.IE4 ? ( function( that, elm ){ var attrs, rename, k, v; // fake textNode - if( !that._tag ){ - elm.innerText = that._text; - that._flags &= X_Node_BitMask_RESET_DIRTY; + if( !that[ '_tag' ] ){ + elm.innerText = that[ '_text' ]; + that[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; return; }; @@ -1482,34 +1626,34 @@ var X_Node__updateRawNode = * title、className、id、lang、language には setAttribute でなく、element.id で直接読み書きできる */ // id - if( that._flags & X_Node_State.DIRTY_ID ) elm.setAttribute( 'id', that._id || ( 'ie4uid' + that._uid ) ); + if( that[ '_flags' ] & X_Node_State.DIRTY_ID ) elm.setAttribute( 'id', that[ '_id' ] || ( 'ie4uid' + that[ '_uid' ] ) ); // className - if( that._flags & X_Node_State.DIRTY_CLASSNAME ){ - that._className ? ( elm.className = that._className ) : elm.removeAttribute( 'class' ); + if( that[ '_flags' ] & X_Node_State.DIRTY_CLASSNAME ){ + that[ '_className' ] ? ( elm.className = that[ '_className' ] ) : elm.removeAttribute( 'class' ); }; // style - if( that._flags & X_Node_State.DIRTY_CSS ){ - if( that._flags & X_Node_State.OLD_CSSTEXT ? X_Node_CSS_objToCssText( that ) : that._cssText ){ - elm.style.cssText = that._cssText; + if( that[ '_flags' ] & X_Node_State.DIRTY_CSS ){ + if( that[ '_flags' ] & X_Node_State.OLD_CSSTEXT ? X_Node_CSS_objToCssText( that ) : that[ '_cssText' ] ){ + elm.style.cssText = that[ '_cssText' ]; } else { elm.style.cssText = ''; elm.removeAttribute( 'style' ); }; } else - if( that._flags & X_Node_State.DIRTY_IE_FILTER ){ + if( that[ '_flags' ] & X_Node_State.DIRTY_IE_FILTER ){ v = X_Node_CSS_objToIEFilterText( that ); if( v ){ elm.style.filter = v; - that._flags |= X_Node_State.IE_FILTER_NOW; + that[ '_flags' ] |= X_Node_State.IE_FILTER_NOW; } else { elm.style.removeAttribute( 'filter' ); - that._flags &= ~X_Node_State.IE_FILTER_NOW; + that[ '_flags' ] &= ~X_Node_State.IE_FILTER_NOW; }; }; // attr - if( that._flags & X_Node_State.DIRTY_ATTR && ( attrs = that._newAttrs || that._attrs ) ){ + if( that[ '_flags' ] & X_Node_State.DIRTY_ATTR && ( attrs = that[ '_newAttrs' ] || that[ '_attrs' ] ) ){ rename = X_Node_Attr_renameForDOM; for( k in attrs ){ //if( X_EMPTY_OBJECT[ k ] ) continue; @@ -1517,10 +1661,10 @@ var X_Node__updateRawNode = elm.removeAttribute( rename[ k ] || k ) : elm.setAttribute( rename[ k ] || k, X_Node_Attr_noValue[ k ] ? k : v ); }; - delete that._newAttrs; + delete that[ '_newAttrs' ]; }; - that._flags &= X_Node_BitMask_RESET_DIRTY; + that[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; }) : (function(){}); @@ -1543,54 +1687,54 @@ var X_Node__updateRawNode = */ var X_Node__actualCreate = X_UA_DOM.IE4 && (function( that, isChild ){ - var uid = that._uid, + var uid = that[ '_uid' ], html, xnodes, n, i, l; - if( !that._tag ){ - html = [ '', that._text, '' ];// fake textNode - delete that._rawObject; + if( !that[ '_tag' ] ){ + html = [ '', that[ '_text' ], '' ];// fake textNode + delete that[ '_rawObject' ]; } else { if( !isChild ) X_Node__actualRemove( that, /* true */ false ); - that._flags & X_Node_State.OLD_CSSTEXT && X_Node_CSS_objToCssText( that, true ); + that[ '_flags' ] & X_Node_State.OLD_CSSTEXT && X_Node_CSS_objToCssText( that, true ); html = [ - '<', that._tag, ' id=', ( that._id || ( 'ie4uid' + uid ) ), ' UID="', uid, '"', - that._className ? ' class="' + that._className + '"' : '', + '<', that[ '_tag' ], ' id=', ( that[ '_id' ] || ( 'ie4uid' + uid ) ), ' UID="', uid, '"', + that[ '_className' ] ? ' class="' + that[ '_className' ] + '"' : '', X_Node_Attr_objToAttrText( that, true ), - that._cssText ? ' style="' + that._cssText + '"' : '', + that[ '_cssText' ] ? ' style="' + that[ '_cssText' ] + '"' : '', '>' ]; n = html.length; - if( ( xnodes = that._xnodes ) && ( l = xnodes.length ) ){ + if( ( xnodes = that[ '_xnodes' ] ) && ( l = xnodes.length ) ){ - that._flags &= ~X_Node_State.IE4_DIRTY_CHILDREN; + that[ '_flags' ] &= ~X_Node_State.IE4_DIRTY_CHILDREN; for( i = 0; i < l; ++i ){ - if( xnodes[ i ]._tag ){ - that._flags |= X_Node_State.IE4_HAS_ELEMENT; + if( xnodes[ i ][ '_tag' ] ){ + that[ '_flags' ] |= X_Node_State.IE4_HAS_ELEMENT; } else { - that._flags |= X_Node_State.IE4_HAS_TEXTNODE; + that[ '_flags' ] |= X_Node_State.IE4_HAS_TEXTNODE; }; - if( that._flags & X_Node_BitMask_IE4_IS_MIX === X_Node_BitMask_IE4_IS_MIX ){ + if( that[ '_flags' ] & X_Node_BitMask_IE4_IS_MIX === X_Node_BitMask_IE4_IS_MIX ){ break; }; }; - if( that._flags & X_Node_BitMask_IE4_IS_MIX === X_Node_State.IE4_HAS_TEXTNODE ){ + if( that[ '_flags' ] & X_Node_BitMask_IE4_IS_MIX === X_Node_State.IE4_HAS_TEXTNODE ){ // only textnode - html[ n ] = that.text(); + html[ n ] = that[ 'text' ](); ++n; } else { for( i = 0; i < l; ++i ){ html[ n ] = X_Node__actualCreate( xnodes[ i ], true ); ++n; }; - that._flags |= X_Node_State.IE4_FIXED; + that[ '_flags' ] |= X_Node_State.IE4_FIXED; }; }; - X_Dom_DTD_EMPTY[ that._tag ] || ( html[ n ] = '<\/' + that._tag + '>' ); + X_Dom_DTD_EMPTY[ that[ '_tag' ] ] || ( html[ n ] = '<\/' + that[ '_tag' ] + '>' ); - that._newAttrs && ( that._flags |= X_Node_State.DIRTY_ATTR ); + that[ '_newAttrs' ] && ( that[ '_flags' ] |= X_Node_State.DIRTY_ATTR ); }; return html.join( '' ); @@ -1600,18 +1744,18 @@ var X_Node__afterActualCreate = X_UA_DOM.IE4 && (function( that ){ var xnodes, i, v; - if( !that._tag ) return that; + if( !that[ '_tag' ] ) return that; - if( ( xnodes = that._xnodes ) && ( i = xnodes.length ) ){ + if( ( xnodes = that[ '_xnodes' ] ) && ( i = xnodes.length ) ){ for( ; i; ){ X_Node__afterActualCreate( xnodes[ --i ] ); }; }; // ネットワーク系属性と filter は要素生成後に適用 - if( that._flags & ( X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_IE_FILTER ) ){ - X_Node__updateRawNode( that, that._rawObject || X_Node__ie4getRawNode( that ) ); + if( that[ '_flags' ] & ( X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_IE_FILTER ) ){ + X_Node__updateRawNode( that, that[ '_rawObject' ] || X_Node__ie4getRawNode( that ) ); } else { - that._flags &= X_Node_BitMask_RESET_DIRTY; + that[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; }; X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰 }); @@ -1621,22 +1765,22 @@ var X_Node__actualRemove = // GPUレイヤーにいるうちは remove しない。-> GPU解除してから remove する // Firefox34 では遭遇せず、Safari で何度かアニメーションしているうちに発生 ( function( that, isChild ){ - var xnodes = that._xnodes, - elm = that._rawObject, + var xnodes = that[ '_xnodes' ], + elm = that[ '_rawObject' ], child, i, l; if( xnodes && ( l = xnodes.length ) ){ for( i = 0; i < l; ++i ){ child = xnodes[ i ]; - child._tag && X_Node__actualRemove( child, true ); + child[ '_tag' ] && X_Node__actualRemove( child, true ); }; }; if( !elm ) return; - if( that._flags & X_Node_State.ACTUAL_LISTENING ){ + if( that[ '_flags' ] & X_Node_State.ACTUAL_LISTENING ){ that._listeners && X_EventDispatcher_toggleAllEvents( that, false );// イベントの退避 - that._flags &= ~X_Node_State.ACTUAL_LISTENING; + that[ '_flags' ] &= ~X_Node_State.ACTUAL_LISTENING; }; // ie5では filter の効いている要素をremove時に破棄して、再度append 時に新規生成する @@ -1645,22 +1789,22 @@ var X_Node__actualRemove = if( elm.filters && elm.filters.length ){ //elm.style.removeAttribute( 'filter' ); isChild = false; - delete that._rawObject; + delete that[ '_rawObject' ]; // 破棄前にインタラクティブな属性値を控える - if( X_Node_Attr_HAS_VALUE[ that._tag ] && ( !that._newAttrs || !X_Object_inObject( 'value', that._newAttrs ) ) ){ - if( !that._attrs ) that._attrs = {}; - that._attrs.value = elm.value; + if( X_Node_Attr_HAS_VALUE[ that[ '_tag' ] ] && ( !that[ '_newAttrs' ] || !X_Object_inObject( 'value', that[ '_newAttrs' ] ) ) ){ + if( !that[ '_attrs' ] ) that[ '_attrs' ] = {}; + that[ '_attrs' ].value = elm.value; }; - if( that._tag === 'OPTION' && ( !that._newAttrs || !X_Object_inObject( 'selected', that._newAttrs ) ) ){ - if( !that._attrs ) that._attrs = {}; - that._attrs.selected = elm.selected; + if( that[ '_tag' ] === 'OPTION' && ( !that[ '_newAttrs' ] || !X_Object_inObject( 'selected', that[ '_newAttrs' ] ) ) ){ + if( !that[ '_attrs' ] ) that[ '_attrs' ] = {}; + that[ '_attrs' ].selected = elm.selected; }; - if( that._tag === 'SELECT' && ( !that._newAttrs || !X_Object_inObject( 'selectedIndex', that._newAttrs ) ) ){ - if( !that._attrs ) that._attrs = {}; - that._attrs.selectedIndex = elm.selectedIndex; + if( that[ '_tag' ] === 'SELECT' && ( !that[ '_newAttrs' ] || !X_Object_inObject( 'selectedIndex', that[ '_newAttrs' ] ) ) ){ + if( !that[ '_attrs' ] ) that[ '_attrs' ] = {}; + that[ '_attrs' ].selectedIndex = elm.selectedIndex; }; - if( that._tag === 'INPUT' && that._attr && ( that._attr.type === 'checkbox' || that._attr.type === 'radio' ) && ( !that._newAttrs || !X_Object_inObject( 'checked', that._newAttrs ) ) ){ - that._attrs.checked = elm.checked; + if( that[ '_tag' ] === 'INPUT' && that._attr && ( that._attr.type === 'checkbox' || that._attr.type === 'radio' ) && ( !that[ '_newAttrs' ] || !X_Object_inObject( 'checked', that[ '_newAttrs' ] ) ) ){ + that[ '_attrs' ].checked = elm.checked; }; // 子要素への参照を外す elm.innerHTML = ''; @@ -1676,8 +1820,8 @@ var X_Node__actualRemove = }) : X_UA_DOM.IE4 ? ( function( that, isChild ){ - var xnodes = that._xnodes, - elm = that._rawObject || X_Node__ie4getRawNode( that ), + var xnodes = that[ '_xnodes' ], + elm = that[ '_rawObject' ] || X_Node__ie4getRawNode( that ), i, l, xnode; if( xnodes && ( l = xnodes.length ) ){ for( i = 0; i < l; ++i ){ @@ -1689,29 +1833,29 @@ var X_Node__actualRemove = that._listeners && X_EventDispatcher_toggleAllEvents( that, false );// イベントの退避 // 破棄前にインタラクティブな属性値を控える - if( X_Node_Attr_HAS_VALUE[ that._tag ] && ( !that._newAttrs || !X_Object_inObject( 'value', that._newAttrs ) ) ){ - if( !that._attrs ) that._attrs = {}; - that._attrs.value = elm.value; + if( X_Node_Attr_HAS_VALUE[ that[ '_tag' ] ] && ( !that[ '_newAttrs' ] || !X_Object_inObject( 'value', that[ '_newAttrs' ] ) ) ){ + if( !that[ '_attrs' ] ) that[ '_attrs' ] = {}; + that[ '_attrs' ].value = elm.value; }; - if( that._tag === 'OPTION' && ( !that._newAttrs || !X_Object_inObject( 'selected', that._newAttrs ) ) ){ - if( !that._attrs ) that._attrs = {}; - that._attrs.selected = elm.selected; + if( that[ '_tag' ] === 'OPTION' && ( !that[ '_newAttrs' ] || !X_Object_inObject( 'selected', that[ '_newAttrs' ] ) ) ){ + if( !that[ '_attrs' ] ) that[ '_attrs' ] = {}; + that[ '_attrs' ].selected = elm.selected; }; - if( that._tag === 'SELECT' && ( !that._newAttrs || !X_Object_inObject( 'selectedIndex', that._newAttrs ) ) ){ - if( !that._attrs ) that._attrs = {}; - that._attrs.selectedIndex = elm.selectedIndex; + if( that[ '_tag' ] === 'SELECT' && ( !that[ '_newAttrs' ] || !X_Object_inObject( 'selectedIndex', that[ '_newAttrs' ] ) ) ){ + if( !that[ '_attrs' ] ) that[ '_attrs' ] = {}; + that[ '_attrs' ].selectedIndex = elm.selectedIndex; }; - if( that._tag === 'INPUT' && that._attr && ( that._attr.type === 'checkbox' || that._attr.type === 'radio' ) && ( !that._newAttrs || !X_Object_inObject( 'checked', that._newAttrs ) ) ){ - if( !that._attrs ) that._attrs = {}; - that._attrs.checked = elm.checked; + if( that[ '_tag' ] === 'INPUT' && that._attr && ( that._attr.type === 'checkbox' || that._attr.type === 'radio' ) && ( !that[ '_newAttrs' ] || !X_Object_inObject( 'checked', that[ '_newAttrs' ] ) ) ){ + if( !that[ '_attrs' ] ) that[ '_attrs' ] = {}; + that[ '_attrs' ].checked = elm.checked; }; elm.removeAttribute( 'id' ); // ? - //document.all[ that._id || ( 'ie4uid' + that._uid ) ] = null; // MacIE5 でエラー + //document.all[ that[ '_id' ] || ( 'ie4uid' + that[ '_uid' ] ) ] = null; // MacIE5 でエラー if( !isChild ) elm.outerHTML = ''; - delete that._rawObject; + delete that[ '_rawObject' ]; }) : (function(){}); -X_ViewPort.listenOnce( X_Event.UNLOAD, X_Node__actualRemove, [ X_Node_html, true ] ); +X_ViewPort[ 'listenOnce' ]( X_EVENT_UNLOAD, X_Node__actualRemove, [ X_Node_html, true ] ); diff --git a/0.6.x/js/02_dom/03_XDomEvent.js b/0.6.x/js/02_dom/03_XDomEvent.js index 16ab951..6ba81c8 100644 --- a/0.6.x/js/02_dom/03_XDomEvent.js +++ b/0.6.x/js/02_dom/03_XDomEvent.js @@ -12,14 +12,16 @@ // http://msdn.microsoft.com/ja-jp/library/ie/dn255104%28v=vs.85%29.aspx var X_Dom_Event_devicePixelRatio = window.devicePixelRatio || ( window.screen.deviceXDPI / window.screen.logicalXDPI ), - X_Dom_Event_convertMSPointerType = window.MSPointerEvent && [ 0, 0, 'touch', 'pen', 'mouse' ];/*{ + X_Dom_Event_convertMSPointerType = window.MSPointerEvent && [ 0, 0, 'touch', 'pen', 'mouse' ],/*{ '2' : 'touch', '3' : 'pen', '4' : 'mouse' }; */ + X_Dom_Event_CANCEL_MOUSE = {}, + X_DomEvent; if( !X_UA[ 'IE' ] || 9 <= X_UA[ 'IE' ] ){ - X.Dom.Event = function( e, xnode ){ + X_DomEvent = function( e, xnode ){ var originalType = e.type, type, pointerEventType, touches, events, @@ -27,18 +29,18 @@ if( !X_UA[ 'IE' ] || 9 <= X_UA[ 'IE' ] ){ elm, i, n, time, touch, ev; //this._event = e; - this.type = type = X_Event_RenameTo[ originalType ] || originalType; + this[ 'type' ] = type = X_Event_RenameTo[ originalType ] || originalType; switch( type ){ case 'message' : - this.data = e.data; - this.origin = e.origin; - this.source = e.source; + this[ 'data' ] = e.data; + this[ 'origin' ] = e.origin; + this[ 'source' ] = e.source; break; case 'progress' : - this.lengthComputable = e.lengthComputable; - this.loaded = e.loaded; - this.total = e.total; + this[ 'lengthComputable' ] = e.lengthComputable; + this[ 'loaded' ] = e.loaded; + this[ 'total' ] = e.total; break; }; @@ -48,56 +50,56 @@ if( !X_UA[ 'IE' ] || 9 <= X_UA[ 'IE' ] ){ if( e.pointerType ){ // PointerEvent; if( X_Dom_Event_convertMSPointerType ){ - this.pointerType = X_Dom_Event_convertMSPointerType[ e.pointerType ]; - this.pressure = e.pressure || ( e.button !== -1 ? 0.5 : 0 ); + this[ 'pointerType' ] = X_Dom_Event_convertMSPointerType[ e.pointerType ]; + this[ 'pressure' ] = e.pressure || ( e.button !== -1 ? 0.5 : 0 ); // ポインターの接触形状の スクリーン ピクセル単位の幅と高さ なので変換。(多分、、、) - this.width = e.width / X_Dom_Event_devicePixelRatio; - this.height = e.height / X_Dom_Event_devicePixelRatio; + this[ 'width' ] = e.width / X_Dom_Event_devicePixelRatio; + this[ 'height' ] = e.height / X_Dom_Event_devicePixelRatio; } else { - this.pointerType = e.pointerType; - this.pressure = e.pressure; + this[ 'pointerType' ] = e.pointerType; + this[ 'pressure' ] = e.pressure; // ポインターの接触形状の CSS ピクセル単位の幅と高さ。 - this.width = e.width; - this.height = e.height; + this[ 'width' ] = e.width; + this[ 'height' ] = e.height; }; - switch( this.pointerType ){ + switch( this[ 'pointerType' ] ){ case 'pen' : //Y-Z 平面と、ペンの軸が含まれる平面の間の角度を返します。Y 軸の範囲は -90 ~ +90 です。X の傾きの正の方向は右方向です。 - this.tiltX = e.tiltX; - this.tiltY = e.tiltY; + this[ 'tiltX' ] = e.tiltX; + this[ 'tiltY' ] = e.tiltY; if( originalType === 'MSPointerHover' ){ - this.type = 'pointermove'; // ie10 には pointerhover と pointermoveがあり、ie11 で一本化。ie11 では buttons を見て hover 状態を判定 + this[ 'type' ] = 'pointermove'; // ie10 には pointerhover と pointermoveがあり、ie11 で一本化。ie11 では buttons を見て hover 状態を判定 }; case 'touch' : - this.radiusX = e.radiusX; - this.radiusY = e.radiusY; - this.rotationAngle = e.rotationAngle; + this[ 'radiusX' ] = e.radiusX; + this[ 'radiusY' ] = e.radiusY; + this[ 'rotationAngle' ] = e.rotationAngle; case 'mouse' : }; - this.button = e.button; - this.buttons = e.buttons; + this[ 'button' ] = e.button; + this[ 'buttons' ] = e.buttons; - this.pointerId = e.pointerId; - this.target = X_Node_getXNode( e.target ); - this.relatedTarget = X_Node_getXNode( e.relatedTarget ); // xnode - this.isPrimary = e.isPrimary; - this.hwTimestamp = e.hwTimestamp; - this.timestamp = e.timestamp; + this[ 'pointerId' ] = e.pointerId; + this[ 'target' ] = X_Node_getXNode( e.target ); + this[ 'relatedTarget' ] = X_Node_getXNode( e.relatedTarget ); // xnode + this[ 'isPrimary' ] = e.isPrimary; + this[ 'hwTimestamp' ] = e.hwTimestamp; + this[ 'timestamp' ] = e.timestamp; - this.altKey = e.altKey; - this.ctrlKey = e.ctrlKey; - this.metaKey = e.metaKey; - this.shiftKey = e.shiftKey; - //this.screenX = touch.screenX; - //this.screenY = touch.screenY; - this.clientX = e.clientX; - this.clientY = e.clientY; - this.pageX = e.pageX; - this.pageY = e.pageY; - this.offsetX = e.offsetX; - this.offsetY = e.offsetY; + this[ 'altKey' ] = e.altKey; + this[ 'ctrlKey' ] = e.ctrlKey; + this[ 'metaKey' ] = e.metaKey; + this[ 'shiftKey' ] = e.shiftKey; + //this[ 'screenX' ] = touch.screenX; + //this[ 'screenY' ] = touch.screenY; + this[ 'clientX' ] = e.clientX; + this[ 'clientY' ] = e.clientY; + this[ 'pageX' ] = e.pageX; + this[ 'pageY' ] = e.pageY; + this[ 'offsetX' ] = e.offsetX; + this[ 'offsetY' ] = e.offsetY; } else if( pointerEventType = X_Event_toPointer[ originalType ] ){ // Touch or Mouse @@ -109,7 +111,7 @@ if( !X_UA[ 'IE' ] || 9 <= X_UA[ 'IE' ] ){ if( touches.length === 0 ){ alert( 'e.changedTouches.length === 0' ); }; - xnode._cancelMouse = pointerEventType; + X_Dom_Event_CANCEL_MOUSE[ xnode[ '_uid' ] ] = pointerEventType; events = []; altKey = e.altKey; @@ -123,79 +125,78 @@ if( !X_UA[ 'IE' ] || 9 <= X_UA[ 'IE' ] ){ target = touch.target; related = touch.relatedTarget; events[ i ] = { - type : pointerEventType, - pointerType : 'touch', - target : X_Node_getXNode( target.nodeType === 3 ? target.parentNode : target ),// defeat Safari bug // xnodetouch.target, - currentTarget : xnode, - relatedTarget : related && X_Node_getXNode( related.nodeType === 3 ? related.parentNode : related ), // xnode iOS3 には relatedTarget がない - isPrimary : true, - hwTimestamp : time, - timestamp : time, - button : e.button, - buttons : e.buttons || e.button, - altKey : altKey, - ctrlKey : ctrlKey, - metaKey : metaKey, - shiftKey : shiftKey, - pointerId : touch.identifier + 2, + 'type' : pointerEventType, + 'pointerType' : 'touch', + 'target' : X_Node_getXNode( target.nodeType === 3 ? target.parentNode : target ),// defeat Safari bug // xnodetouch.target, + 'currentTarget' : xnode, + 'relatedTarget' : related && X_Node_getXNode( related.nodeType === 3 ? related.parentNode : related ), // xnode iOS3 には relatedTarget がない + 'isPrimary' : true, + 'hwTimestamp' : time, + 'timestamp' : time, + 'button' : e.button, + 'buttons' : e.buttons || e.button, + 'altKey' : altKey, + 'ctrlKey' : ctrlKey, + 'metaKey' : metaKey, + 'shiftKey' : shiftKey, + 'pointerId' : touch.identifier + 2, //screenX : touch.screenX, //screenY : touch.screenY, - clientX : touch.clientX, - clientY : touch.clientY, - pageX : touch.pageX, - pageY : touch.pageY, - offsetX : touch.offsetX, // 要素上の座標を取得 - offsetY : touch.offsetY, - radiusX : touch.radiusX || 0, - radiusY : touch.radiusY || 0, - rotationAngle : touch.rotationAngle || 0, - pressure : touch.force || touch.webkitForce || force, - width : touch.width || 0, - height : touch.height || 0 + 'clientX' : touch.clientX, + 'clientY' : touch.clientY, + 'pageX' : touch.pageX, + 'pageY' : touch.pageY, + 'offsetX' : touch.offsetX, // 要素上の座標を取得 + 'offsetY' : touch.offsetY, + 'radiusX' : touch.radiusX || 0, + 'radiusY' : touch.radiusY || 0, + 'rotationAngle' : touch.rotationAngle || 0, + 'pressure' : touch.force || touch.webkitForce || force, + 'width' : touch.width || 0, + 'height' : touch.height || 0 }; }; return events.length === 1 ? events[ 0 ] : events; } else { - if( xnode._cancelMouse === pointerEventType ){ - delete xnode._cancelMouse; - console.log( '**** xnode._cancelMouse ' + xnode._cancelMouse ); + if( X_Dom_Event_CANCEL_MOUSE[ xnode[ '_uid' ] ] === pointerEventType ){ + delete X_Dom_Event_CANCEL_MOUSE[ xnode[ '_uid' ] ]; return []; }; // MouseEvent; - this.type = pointerEventType; - this.pointerType = 'mouse'; + this[ 'type' ] = pointerEventType; + this[ 'pointerType' ] = 'mouse'; - this.button = e.button !== undefined ? e.button : + this[ 'button' ] = e.button !== undefined ? e.button : e.which !== undefined ? e.which - 1 : -1; - this.buttons = e.buttons !== undefined ? e.buttons : this.button === 0 ? 1 : this.button === 1 ? 2 : this.button === 2 ? 4 : 0; - this.pressure = ( this.button !== -1 ? 0.5 : 0 ); + this[ 'buttons' ] = e.buttons !== undefined ? e.buttons : this[ 'button' ] === 0 ? 1 : this[ 'button' ] === 1 ? 2 : this[ 'button' ] === 2 ? 4 : 0; + this[ 'pressure' ] = ( this[ 'button' ] !== -1 ? 0.5 : 0 ); elm = e.target; - this.target = X_Node_getXNode( elm.nodeType === 3 ? elm.parentNode : elm );// defeat Safari bug // xnodetouch.target; - this.isPrimary = true; - this.hwTimestamp = this.timestamp = X_Timer_now(); - this.altKey = e.altKey; - this.ctrlKey = e.ctrlKey; - this.metaKey = e.metaKey; - this.shiftKey = e.shiftKey; - this.pointerId = 1; - //this.screenX = touch.screenX; - //this.screenY = touch.screenY; + this[ 'target' ] = X_Node_getXNode( elm.nodeType === 3 ? elm.parentNode : elm );// defeat Safari bug // xnodetouch.target; + this[ 'isPrimary' ] = true; + this[ 'hwTimestamp' ] = this[ 'timestamp' ] = X_Timer_now(); + this[ 'altKey' ] = e.altKey; + this[ 'ctrlKey' ] = e.ctrlKey; + this[ 'metaKey' ] = e.metaKey; + this[ 'shiftKey' ] = e.shiftKey; + this[ 'pointerId' ] = 1; + //this[ 'screenX' ] = touch.screenX; + //this[ 'screenY' ] = touch.screenY; // TODO http://uupaa-js.googlecode.com/svn-history/r8/trunk/doc/reference/symbols/src/trunk_uu.module.ui.js.html // Safari2ではclientX,YはpageX,Yと同じ値を返す - this.clientX = e.clientX; - this.clientY = e.clientY; - this.pageX = e.pageX; - this.pageY = e.pageY; - this.offsetX = e.offsetX || e.layerX; // 要素上の座標を取得 - this.offsetY = e.offsetY || e.layerY; + this[ 'clientX' ] = e.clientX; + this[ 'clientY' ] = e.clientY; + this[ 'pageX' ] = e.pageX; + this[ 'pageY' ] = e.pageY; + this[ 'offsetX' ] = e.offsetX || e.layerX; // 要素上の座標を取得 + this[ 'offsetY' ] = e.offsetY || e.layerY; // http://www.programming-magic.com/20090127231544/ // Opera で button==2の場合、コンテキストメニューイベントを発火 「ツール」->「設定」->「詳細設定」->「コンテンツ」->「Javascriptオプション」で「右クリックを制御するスクリプトを許可する」 - if( originalType === 'mousedown' && this.button === 2 && X_UA[ 'Opera' ] ){ - events = [ X.Object.clone( this ), X.Object.clone( this ) ]; + if( originalType === 'mousedown' && this[ 'button' ] === 2 && X_UA[ 'Opera' ] ){ + events = [ X_Object_clone( this ), X_Object_clone( this ) ]; events[ 1 ].type = 'contextmenu'; return events; }; @@ -203,22 +204,22 @@ if( !X_UA[ 'IE' ] || 9 <= X_UA[ 'IE' ] ){ } else { // Other - this.keyCode = e.keyCode || e.which; - this.altKey = e.altKey; - this.ctrlKey = e.ctrlKey; - this.shiftKey = e.shiftKey; - this.metaKey = e.metaKey; + this[ 'keyCode' ] = e.keyCode || e.which; + this[ 'altKey' ] = e.altKey; + this[ 'ctrlKey' ] = e.ctrlKey; + this[ 'shiftKey' ] = e.shiftKey; + this[ 'metaKey' ] = e.metaKey; - this.button = e.button !== undefined ? e.button : + this[ 'button' ] = e.button !== undefined ? e.button : e.which !== undefined ? e.which - 1 : -1; - this.buttons = e.buttons !== undefined ? e.buttons : this.button === 0 ? 1 : this.button === 1 ? 2 : this.button === 2 ? 4 : 0; + this[ 'buttons' ] = e.buttons !== undefined ? e.buttons : this[ 'button' ] === 0 ? 1 : this[ 'button' ] === 1 ? 2 : this[ 'button' ] === 2 ? 4 : 0; //http://www.quirksmode.org/js/events_properties.html if( elm = e.target ){ - this.target = X_Node_getXNode( elm.nodeType === 3 ? elm.parentNode : elm );// defeat Safari bug // xnode + this[ 'target' ] = X_Node_getXNode( elm.nodeType === 3 ? elm.parentNode : elm );// defeat Safari bug // xnode }; if( elm = e.relatedTarget ){ - this.relatedTarget = X_Node_getXNode( elm.nodeType === 3 ? elm.parentNode : elm ); // xnode + this[ 'relatedTarget' ] = X_Node_getXNode( elm.nodeType === 3 ? elm.parentNode : elm ); // xnode }; if( type === 'wheel' ){ @@ -227,58 +228,58 @@ if( !X_UA[ 'IE' ] || 9 <= X_UA[ 'IE' ] ){ // https://w3g.jp/blog/tools/wheelevent_crossbrowser // ホイール系イベント2014年版クロスブラウザ if( e.deltaY !== undefined ){ - this.deltaX = e.deltaX; - this.deltaY = e.deltaY; - this.deltaZ = e.deltaZ || 0; + this[ 'deltaX' ] = e.deltaX; + this[ 'deltaY' ] = e.deltaY; + this[ 'deltaZ' ] = e.deltaZ || 0; } else if( e.wheelDeltaY !== undefined ){ - this.deltaX = e.wheelDeltaX / 120; - this.deltaY = e.wheelDeltaY / 120; - this.deltaZ = e.wheelDeltaZ / 120 || 0; + this[ 'deltaX' ] = e.wheelDeltaX / 120; + this[ 'deltaY' ] = e.wheelDeltaY / 120; + this[ 'deltaZ' ] = e.wheelDeltaZ / 120 || 0; } else if( e.wheelDelta !== undefined ){ - this.deltaX = this.deltaZ = 0; - this.deltaY = e.wheelDelta / -120; + this[ 'deltaX' ] = this[ 'deltaZ' ] = 0; + this[ 'deltaY' ] = e.wheelDelta / -120; } else if( e.detail !== undefined ){ - this.deltaX = this.deltaZ = 0; - this.deltaY = originalType === 'MozMousePixelScroll' ? e.detail / 45 : e.detail / 3; // 3 + this[ 'deltaX' ] = this[ 'deltaZ' ] = 0; + this[ 'deltaY' ] = originalType === 'MozMousePixelScroll' ? e.detail / 45 : e.detail / 3; // 3 } else { - this.deltaX = this.deltaY = this.deltaZ = 0; + this[ 'deltaX' ] = this[ 'deltaY' ] = this[ 'deltaZ' ] = 0; }; }; }; - this.currentTarget = xnode; // xnode - this.eventPhase = e.eventPhase; - this.detail = e.detail; + this[ 'currentTarget' ] = xnode; // xnode + this[ 'eventPhase' ] = e.eventPhase; + this[ 'detail' ] = e.detail; }; } else { - X.Dom.Event = function( e, xnode, element ){ + X_DomEvent = function( e, xnode, element ){ var originalType = e.type, btn, type; - this.type = X_Event_RenameTo[ originalType ] || originalType; - this.target = X_Node_getXNode( e.srcElement ); // xnode - if( this.target && !this.target._tag ) this.target = this.target.parent; // ie4 の fake Textnode がヒットしていないか? - this.currentTarget = xnode; // xnode - this.relatedTarget = X_Node_getXNode( e.formElement || e.toElement ); // xnode - this.eventPhase = e.srcElement === element ? 2: 3; + this[ 'type' ] = X_Event_RenameTo[ originalType ] || originalType; + this[ 'target' ] = X_Node_getXNode( e.srcElement ); // xnode + if( this[ 'target' ] && !this[ 'target' ][ '_tag' ] ) this[ 'target' ] = this[ 'target' ].parent; // ie4 の fake Textnode がヒットしていないか? + this[ 'currentTarget' ] = xnode; // xnode + this[ 'relatedTarget' ] = X_Node_getXNode( e.formElement || e.toElement ); // xnode + this[ 'eventPhase' ] = e.srcElement === element ? 2: 3; - this.keyCode = e.keyCode; - this.altKey = e.altKey; - this.ctrlKey = e.ctrlKey; - this.shiftKey = e.shiftKey; + this[ 'keyCode' ] = e.keyCode; + this[ 'altKey' ] = e.altKey; + this[ 'ctrlKey' ] = e.ctrlKey; + this[ 'shiftKey' ] = e.shiftKey; - switch( this.type ){ + switch( this[ 'type' ] ){ case 'message' : - this.data = e.data; - this.origin = e.origin; - this.source = e.source; + this[ 'data' ] = e.data; + this[ 'origin' ] = e.origin; + this[ 'source' ] = e.source; break; case 'progress' : - this.loaded = e.loaded; - this.total = e.total; + this[ 'loaded' ] = e.loaded; + this[ 'total' ] = e.total; break; }; @@ -286,68 +287,62 @@ if( !X_UA[ 'IE' ] || 9 <= X_UA[ 'IE' ] ){ switch( originalType ){ case 'click' : case 'dblclick' : - this.button = 0; + this[ 'button' ] = 0; break; case 'contextmenu' : - this.button = 2; + this[ 'button' ] = 2; break; default : // mouseup, mousedown btn = e.button; - this.button = + this[ 'button' ] = btn & 1 ? 0 : btn & 4 ? 2 : btn & 2 ? 1 : -1; // 左:1(click:0), 中:4, 右:2 }; - this.buttons = e.button; + this[ 'buttons' ] = e.button; - this.deltaX = 0; - this.deltaY = e.wheelDelta / -120; + this[ 'deltaX' ] = 0; + this[ 'deltaY' ] = e.wheelDelta / -120; if( type = X_Event_toPointer[ originalType ] ){ - this.type = type; - this.clientX = e.clientX; - this.clientY = e.clientY; - //this.screenX = e.screenX; - //this.screenY = e.screenY; + this[ 'type' ] = type; + this[ 'clientX' ] = e.clientX; + this[ 'clientY' ] = e.clientY; + //this[ 'screenX' ] = e.screenX; + //this[ 'screenY' ] = e.screenY; //if( X_ViewPort_rootElement ){ // uuu... - this.pageX = e.clientX + X_ViewPort_rootElement.scrollLeft; - this.pageY = e.clientY + X_ViewPort_rootElement.scrollTop; + this[ 'pageX' ] = e.clientX + X_ViewPort_rootElement.scrollLeft; + this[ 'pageY' ] = e.clientY + X_ViewPort_rootElement.scrollTop; // DOMAssistant 2.8.1 //event.pageX = DOMAssistant.def(e.pageX)? e.pageX : (event.clientX + (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0)); //event.pageY = DOMAssistant.def(e.pageY)? e.pageY : (event.clientY + (de.scrollTop || b.scrollTop) - (de.clientTop || 0)); //}; if( 5 <= X_UA[ 'IE' ] ){ - this.offsetX = e.offsetX; // イベントターゲット左上からの座標 - this.offsetY = e.offsetY; + this[ 'offsetX' ] = e.offsetX; // イベントターゲット左上からの座標 + this[ 'offsetY' ] = e.offsetY; }// else //if( e.srcElement ){ - // this.offsetX = e.x - e.srcElement.offsetLeft; // e.x はイベント発生要素の親要素を基準にした座標。 - // this.offsetY = e.y - e.srcElement.offsetTop; + // this[ 'offsetX' ] = e.x - e.srcElement.offsetLeft; // e.x はイベント発生要素の親要素を基準にした座標。 + // this[ 'offsetY' ] = e.y - e.srcElement.offsetTop; //}; - this.pointerId = 1; - this.radiusX = 0; - this.radiusY = 0; - this.rotationAngle = 0; - this.width = 0; - this.height = 0; - this.tiltX = 0; - this.tiltY = 0; + this[ 'pointerId' ] = 1; + this[ 'radiusX' ] = 0; + this[ 'radiusY' ] = 0; + this[ 'rotationAngle' ] = 0; + this[ 'width' ] = 0; + this[ 'height' ] = 0; + this[ 'tiltX' ] = 0; + this[ 'tiltY' ] = 0; }; }; }; // TODO load -> readystatechange this.readyState === "loaded" || this.readyState === "complete" -/* -X.Dom.Event._LOAD_FIX_TAGS = { - IFRAME : true, - SCRIPT : true//, - //LINK : true -}; */ // https://github.com/georgeadamson/jQuery.prefixfree-events/blob/master/jQuery.prefixfree-events.js // https://developer.mozilla.org/en-US/docs/Web/Events/wheel diff --git a/0.6.x/js/02_dom/04_XBoxModel.js b/0.6.x/js/02_dom/04_XBoxModel.js index 85b0c9c..ed00a00 100644 --- a/0.6.x/js/02_dom/04_XBoxModel.js +++ b/0.6.x/js/02_dom/04_XBoxModel.js @@ -1,30 +1,32 @@ var X_Node_BoxModel = { - CONTENT_BOX : 1, - PADDING_BOX : 2, - BORDER_BOX : 3, - - defaultBoxModel : 0, - boxSizingEnabled : false, + CONTENT_BOX : 1, + PADDING_BOX : 2, + BORDER_BOX : 3 + }, + + X_Node_BoxModel_defaultBoxModel, + X_Node_BoxModel_boxSizingEnabled, // TODO: offsetLeft, offsetTop の基準位置 - absoluteOffset : 0 -}; + X_Node_BoxModel_absoluteOffset; -X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_INIT, function(){ + + +X_ViewPort[ 'listenOnce' ]( X_EVENT_INIT, function(){ var node = X_Node_systemNode; - node.cssText( 'width:10px;padding:1px;border:2px solid #0;margin:4px;' ); + node[ 'cssText' ]( 'width:10px;padding:1px;border:2px solid #0;margin:4px;' ); - X_Node_BoxModel.defaultBoxModel = node.width() === 10 ? + X_Node_BoxModel_defaultBoxModel = node[ 'width' ]() === 10 ? X_Node_BoxModel.BORDER_BOX : X_Node_BoxModel.CONTENT_BOX; - if( X_Node_BoxModel.defaultBoxModel === X_Node_BoxModel.CONTENT_BOX ){ - X_Node_BoxModel.boxSizingEnabled = node.cssText( 'width:10px;padding:1px;border:2px solid #0;margin:4px;' + + if( X_Node_BoxModel_defaultBoxModel === X_Node_BoxModel.CONTENT_BOX ){ + X_Node_BoxModel_boxSizingEnabled = node[ 'cssText' ]( 'width:10px;padding:1px;border:2px solid #0;margin:4px;' + 'box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-o-box-sizing:border-box;-ms-box-sizing:border-box;' ) - .width() === 10; + [ 'width' ]() === 10; }; /* @@ -32,11 +34,11 @@ X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_INIT, function(){ * TODO boxShadow が有効な要素に対して offsetWidth 等の補正(?) */ if( X_Node_CSS_Support[ 'boxShadow' ] && - node.cssText( - X_Node_CSS_uncamelize( X_Node_CSS_VENDER_PREFIX[ 'boxShadow' ] ) + ':10px 10px 0 0 #000;width:10px;' - ).width() !== 10 - ){ - console.log( node.cssText() + node.width() ); + node[ 'cssText' ]( + X_Node_CSS_uncamelize( X_Node_CSS_VENDER_PREFIX[ 'boxShadow' ] ) + ':10px 10px 0 0 #000;width:10px;' + )[ 'width' ]() !== 10 + ){ + console.log( node[ 'cssText' ]() + node[ 'width' ]() ); X_Node_CSS_Support[ 'boxShadowLayoutBug' ] = true; }; @@ -45,14 +47,14 @@ X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_INIT, function(){ // margin // top - X_Node_BoxModel.absoluteOffset = - node.cssText( 'position:absolute;top:0;left:0;margin:1px;border:2px solid #000;padding:4px;' ) - .append( '
    ' ) - .firstChild().cssText( 'position:absolute;top:8px;left:8px;margin:16px;border:32px solid #666;padding:64px;' ) - .y(); - + X_Node_BoxModel_absoluteOffset = + node[ 'cssText' ]( 'position:absolute;top:0;left:0;margin:1px;border:2px solid #000;padding:4px;' ) + [ 'append' ]( '
    ' ) + [ 'firstChild' ]() + [ 'cssText' ]( 'position:absolute;top:8px;left:8px;margin:16px;border:32px solid #666;padding:64px;' ) + [ 'y' ](); - node.cssText( '' ).empty(); + node[ 'cssText' ]( '' )[ 'empty' ](); }); /* -------------------------------------- @@ -63,128 +65,128 @@ X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_INIT, function(){ * getBoxObjectFor * getBoundingClientRect */ -Node.prototype.width = function(){ - if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; +Node.prototype[ 'width' ] = function(){ + if( ( this[ '_flags' ] & X_Node_State.IN_TREE ) === 0 || this[ '_flags' ] & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; X_Node_updateTimerID && X_Node_startUpdate(); if( X_UA_DOM.W3C ){ // TODO width : length + overflow : hidden ならそれを返す? <- block or inline - return this._rawObject ? this._rawObject.offsetWidth : 0; + return this[ '_rawObject' ] ? this[ '_rawObject' ].offsetWidth : 0; } else if( X_UA_DOM.IE4 ){ - return ( this._rawObject || X_Node__ie4getRawNode( this ) ).offsetWidth; + return ( this[ '_rawObject' ] || X_Node__ie4getRawNode( this ) ).offsetWidth; } else { }; }; -Node.prototype.height = function(){ - if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; +Node.prototype[ 'height' ] = function(){ + if( ( this[ '_flags' ] & X_Node_State.IN_TREE ) === 0 || this[ '_flags' ] & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; X_Node_updateTimerID && X_Node_startUpdate(); if( X_UA_DOM.W3C ){ - // this.css( X_Node_CSS_Unit.px, 'height' ); - return this._rawObject ? this._rawObject.offsetHeight : 0; + // this[ 'css' ]( X_Node_CSS_Unit.px, 'height' ); + return this[ '_rawObject' ] ? this[ '_rawObject' ].offsetHeight : 0; } else if( X_UA_DOM.IE4 ){ - return ( this._rawObject || X_Node__ie4getRawNode( this ) ).offsetHeight; + return ( this[ '_rawObject' ] || X_Node__ie4getRawNode( this ) ).offsetHeight; } else { }; }; -Node.prototype.clientWidth = function(){ - if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; +Node.prototype[ 'clientWidth' ] = function(){ + if( ( this[ '_flags' ] & X_Node_State.IN_TREE ) === 0 || this[ '_flags' ] & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; X_Node_updateTimerID && X_Node_startUpdate(); if( X_UA_DOM.W3C ){ - // this.css( X_Node_CSS_Unit.px, 'width' ); - return this._rawObject ? this._rawObject.clientWidth : 0; + // this[ 'css' ]( X_Node_CSS_Unit.px, 'width' ); + return this[ '_rawObject' ] ? this[ '_rawObject' ].clientWidth : 0; } else if( X_UA_DOM.IE4 ){ - return ( this._rawObject || X_Node__ie4getRawNode( this ) ).clientWidth; + return ( this[ '_rawObject' ] || X_Node__ie4getRawNode( this ) ).clientWidth; } else { }; }; -Node.prototype.clientHeight = function(){ - if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; +Node.prototype[ 'clientHeight' ] = function(){ + if( ( this[ '_flags' ] & X_Node_State.IN_TREE ) === 0 || this[ '_flags' ] & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; X_Node_updateTimerID && X_Node_startUpdate(); if( X_UA_DOM.W3C ){ - // this.css( X_Node_CSS_Unit.px, 'height' ); - return this._rawObject ? this._rawObject.clientHeight : 0; + // this[ 'css' ]( X_Node_CSS_Unit.px, 'height' ); + return this[ '_rawObject' ] ? this[ '_rawObject' ].clientHeight : 0; } else if( X_UA_DOM.IE4 ){ - return ( this._rawObject || X_Node__ie4getRawNode( this ) ).clientHeight; + return ( this[ '_rawObject' ] || X_Node__ie4getRawNode( this ) ).clientHeight; } else { }; }; -Node.prototype.scrollWidth = function(){ - if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; +Node.prototype[ 'scrollWidth' ] = function(){ + if( ( this[ '_flags' ] & X_Node_State.IN_TREE ) === 0 || this[ '_flags' ] & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; X_Node_updateTimerID && X_Node_startUpdate(); if( X_UA_DOM.W3C ){ - // this.css( X_Node_CSS_Unit.px, 'width' ); - return this._rawObject ? this._rawObject.scrollWidth : 0; + // this[ 'css' ]( X_Node_CSS_Unit.px, 'width' ); + return this[ '_rawObject' ] ? this[ '_rawObject' ].scrollWidth : 0; } else if( X_UA_DOM.IE4 ){ - return ( this._rawObject || X_Node__ie4getRawNode( this ) ).scrollWidth; + return ( this[ '_rawObject' ] || X_Node__ie4getRawNode( this ) ).scrollWidth; } else { }; }; -Node.prototype.scrollHeight = function(){ - if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; +Node.prototype[ 'scrollHeight' ] = function(){ + if( ( this[ '_flags' ] & X_Node_State.IN_TREE ) === 0 || this[ '_flags' ] & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; X_Node_updateTimerID && X_Node_startUpdate(); if( X_UA_DOM.W3C ){ - return this._rawObject ? this._rawObject.scrollHeight : 0; + return this[ '_rawObject' ] ? this[ '_rawObject' ].scrollHeight : 0; } else if( X_UA_DOM.IE4 ){ - return ( this._rawObject || X_Node__ie4getRawNode( this ) ).scrollHeight; + return ( this[ '_rawObject' ] || X_Node__ie4getRawNode( this ) ).scrollHeight; } else { }; }; -Node.prototype.scrollLeft = function(){ - if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; +Node.prototype[ 'scrollLeft' ] = function(){ + if( ( this[ '_flags' ] & X_Node_State.IN_TREE ) === 0 || this[ '_flags' ] & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; X_Node_updateTimerID && X_Node_startUpdate(); if( X_UA_DOM.W3C ){ - // this.css( X_Node_CSS_Unit.px, 'width' ); - return this._rawObject ? this._rawObject.scrollLeft : 0; + // this[ 'css' ]( X_Node_CSS_Unit.px, 'width' ); + return this[ '_rawObject' ] ? this[ '_rawObject' ].scrollLeft : 0; } else if( X_UA_DOM.IE4 ){ - return ( this._rawObject || X_Node__ie4getRawNode( this ) ).scrollLeft; + return ( this[ '_rawObject' ] || X_Node__ie4getRawNode( this ) ).scrollLeft; } else { }; }; -Node.prototype.scrollTop = function(){ - if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; +Node.prototype[ 'scrollTop' ] = function(){ + if( ( this[ '_flags' ] & X_Node_State.IN_TREE ) === 0 || this[ '_flags' ] & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; X_Node_updateTimerID && X_Node_startUpdate(); if( X_UA_DOM.W3C ){ - // this.css( X_Node_CSS_Unit.px, 'width' ); - return this._rawObject ? this._rawObject.scrollTop : 0; + // this[ 'css' ]( X_Node_CSS_Unit.px, 'width' ); + return this[ '_rawObject' ] ? this[ '_rawObject' ].scrollTop : 0; } else if( X_UA_DOM.IE4 ){ - return ( this._rawObject || X_Node__ie4getRawNode( this ) ).scrollTop; + return ( this[ '_rawObject' ] || X_Node__ie4getRawNode( this ) ).scrollTop; } else { }; @@ -198,44 +200,44 @@ Node.prototype.scrollTop = function(){ * transformX, Y は加える? アニメーション中は? */ // X_Node_CSS_transform, -Node.prototype.x = function(){ - if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; +Node.prototype[ 'x' ] = function(){ + if( ( this[ '_flags' ] & X_Node_State.IN_TREE ) === 0 || this[ '_flags' ] & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; X_Node_updateTimerID && X_Node_startUpdate(); if( X_UA_DOM.W3C ){ - // this.css( X_Node_CSS_Unit.px, 'left' ); - // this.css( X_Node_CSS_Unit.px, 'translateX' ); - return this._rawObject ? this._rawObject.offsetLeft : 0; + // this[ 'css' ]( X_Node_CSS_Unit.px, 'left' ); + // this[ 'css' ]( X_Node_CSS_Unit.px, 'translateX' ); + return this[ '_rawObject' ] ? this[ '_rawObject' ].offsetLeft : 0; } else if( X_UA_DOM.IE4 ){ // pixelLeft http://www.din.or.jp/~hagi3/JavaScript/JSTips/DHTML/ProbIE5.htm - return ( this._rawObject || X_Node__ie4getRawNode( this ) ).offsetLeft; + return ( this[ '_rawObject' ] || X_Node__ie4getRawNode( this ) ).offsetLeft; } else { }; }; -Node.prototype.y = function(){ - if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; +Node.prototype[ 'y' ] = function(){ + if( ( this[ '_flags' ] & X_Node_State.IN_TREE ) === 0 || this[ '_flags' ] & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0; X_Node_updateTimerID && X_Node_startUpdate(); if( X_UA_DOM.W3C ){ - // this.css( X_Node_CSS_Unit.px, 'top' ); - // this.css( X_Node_CSS_Unit.px, 'transisitonY' ); - return this._rawObject ? this._rawObject.offsetTop : 0; + // this[ 'css' ]( X_Node_CSS_Unit.px, 'top' ); + // this[ 'css' ]( X_Node_CSS_Unit.px, 'transisitonY' ); + return this[ '_rawObject' ] ? this[ '_rawObject' ].offsetTop : 0; } else if( X_UA_DOM.IE4 ){ - return ( this._rawObject || X_Node__ie4getRawNode( this ) ).offsetTop; + return ( this[ '_rawObject' ] || X_Node__ie4getRawNode( this ) ).offsetTop; } else { }; }; -Node.prototype.offset = function( /* xnodeParent */ ){ +Node.prototype[ 'offset' ] = function( /* xnodeParent */ ){ - if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return { x : 0, y : 0 }; + if( ( this[ '_flags' ] & X_Node_State.IN_TREE ) === 0 || this[ '_flags' ] & X_Node_State.STYLE_IS_DISPLAY_NONE ) return { x : 0, y : 0 }; if( X.Doc.body === this || X.Doc.html === this ){ return { x : 0, y : 0 }; @@ -244,10 +246,10 @@ Node.prototype.offset = function( /* xnodeParent */ ){ X_Node_updateTimerID && X_Node_startUpdate(); if( X_UA_DOM.W3C ){ - return this._rawObject ? X_Node_getPosition( this._rawObject ) : { x : 0, y : 0 }; + return this[ '_rawObject' ] ? X_Node_getPosition( this[ '_rawObject' ] ) : { x : 0, y : 0 }; } else if( X_UA_DOM.IE4 ){ - return X_Node_getPosition( this._rawObject || X_Node__ie4getRawNode( this ) ); + return X_Node_getPosition( this[ '_rawObject' ] || X_Node__ie4getRawNode( this ) ); } else { }; diff --git a/0.6.x/js/02_dom/05_XNodeAttr.js b/0.6.x/js/02_dom/05_XNodeAttr.js index e56b9df..3f9a059 100644 --- a/0.6.x/js/02_dom/05_XNodeAttr.js +++ b/0.6.x/js/02_dom/05_XNodeAttr.js @@ -1,71 +1,71 @@ var X_Node_Attr_noValue = { - checked : 1, - compact : 1, - declare : 1, - defer : 1, - disabled : 1, - ismap : 1, - multiple : 1, - nohref : 1, - noresize : 1, - noshade : 1, - nowrap : 1, - readonly : 1, - selected : 1 + 'checked' : 1, + 'compact' : 1, + 'declare' : 1, + 'defer' : 1, + 'disabled' : 1, + 'ismap' : 1, + 'multiple' : 1, + 'nohref' : 1, + 'noresize' : 1, + 'noshade' : 1, + 'nowrap' : 1, + 'readonly' : 1, + 'selected' : 1 }, X_Node_Attr_renameForDOM = { - 'class' : 'className', - accesskey : 'accessKey', - 'accept-charset' : 'acceptCharset', - bgcolor : 'bgColor', - cellpadding : 'cellPadding', - cellspacing : 'cellSpacing', - 'char' : 'ch', - charoff : 'chOff', - codebase : 'codeBase', - codetype : 'codeType', - colspan : 'colSpan', - datetime : 'dateTime', - 'for' : 'htmlFor', - frameborder : 'frameBorder', - 'http-equiv' : 'httpEquiv', - ismap : 'isMap', - longdesc : 'longDesc', - maxlength : 'maxLength', - nohref : 'noHref', - readonly : 'readOnly', - rowspan : 'rowSpan', - tabindex : 'tabIndex', - usemap : 'useMap', - valuetype : 'valueType', - checked : 'defaultChecked' + 'class' : 'className', + 'accesskey' : 'accessKey', + 'accept-charset' : 'acceptCharset', + 'bgcolor' : 'bgColor', + 'cellpadding' : 'cellPadding', + 'cellspacing' : 'cellSpacing', + 'char' : 'ch', + 'charoff' : 'chOff', + 'codebase' : 'codeBase', + 'codetype' : 'codeType', + 'colspan' : 'colSpan', + 'datetime' : 'dateTime', + 'for' : 'htmlFor', + 'frameborder' : 'frameBorder', + 'http-equiv' : 'httpEquiv', + 'ismap' : 'isMap', + 'longdesc' : 'longDesc', + 'maxlength' : 'maxLength', + 'nohref' : 'noHref', + 'readonly' : 'readOnly', + 'rowspan' : 'rowSpan', + 'tabindex' : 'tabIndex', + 'usemap' : 'useMap', + 'valuetype' : 'valueType', + 'checked' : 'defaultChecked' }, X_Node_Attr_HAS_VALUE = { - INPUT : true, - TEXTAREA : true, - SELECT : true, - BUTTON : true, - OBJECT : true, - PARAM : true // FlashVars が flash 側から書き換えられるケースがある?? + 'INPUT' : true, + 'TEXTAREA' : true, + 'SELECT' : true, + 'BUTTON' : true, + 'OBJECT' : true, + 'PARAM' : true // FlashVars が flash 側から書き換えられるケースがある?? }, // の場合、value の値はユーザーで変えることはない // はユーザーによって常に変更される HTML5 ではこれにさらにいろいろ加わる X_Node_Attr_STATIC_VALUE_TYPES = { - button : true, - hidden : true, - submit : true, - reset : true, - radio : true, - checkbox : true + 'button' : true, + 'hidden' : true, + 'submit' : true, + 'reset' : true, + 'radio' : true, + 'checkbox' : true }, // 自由な内容が入るため、参照文字への変換が必要 X_Node_Attr_toChrReferance = { - value : true, - title : true, - alt : true + 'value' : true, + 'title' : true, + 'alt' : true }, X_Node_Attr_renameForTag = {}; @@ -76,22 +76,22 @@ X_Node_Attr_renameForTag = {}; // -> src (img, iframe, ), link の href, // function X_Node_Attr_objToAttrText( that, skipNetworkForElmCreation ){ - var obj = that._attrs, + var obj = that[ '_attrs' ], noValue = X_Node_Attr_noValue, attrs = [ '' ], // 先頭にスペース plain = X_EMPTY_OBJECT, n = 0, k, check; if( skipNetworkForElmCreation ){ - delete that._newAttrs; + delete that[ '_newAttrs' ]; // このあとで _newAttr にネットワーク系の属性を控える, attrText には加えない } else { - that._flags &= ~X_Node_State.OLD_ATTRTEXT; + that[ '_flags' ] &= ~X_Node_State.OLD_ATTRTEXT; // 完全な attrText }; if( !obj ){ // Opera7 - delete that._attrText; + delete that[ '_attrText' ]; return ''; }; @@ -100,7 +100,7 @@ function X_Node_Attr_objToAttrText( that, skipNetworkForElmCreation ){ if( skipNetworkForElmCreation ){ check = false; - switch( that._tag + k ){ + switch( that[ '_tag' ] + k ){ case 'PARAMvalue' : check = obj[ 'name' ] !== 'movie'; case 'INPUTsrc' : @@ -120,8 +120,8 @@ function X_Node_Attr_objToAttrText( that, skipNetworkForElmCreation ){ case 'APPLETcode' : //case 'AUDIOsrc' : //case 'VIDEOsrc' : - if( !that._newAttrs ) that._newAttrs = {}; - that._newAttrs[ k ] = obj[ k ]; + if( !that[ '_newAttrs' ] ) that[ '_newAttrs' ] = {}; + that[ '_newAttrs' ][ k ] = obj[ k ]; continue; }; }; @@ -133,14 +133,14 @@ function X_Node_Attr_objToAttrText( that, skipNetworkForElmCreation ){ }; if( 0 < n ){ - return that._attrText = attrs.join( ' ' ); + return that[ '_attrText' ] = attrs.join( ' ' ); }; - delete that._attrText; + delete that[ '_attrText' ]; return ''; }; (function( renameForDOM, renameForTag ){ - var k, i; + var k; for( k in renameForDOM ){ //if( X_EMPTY_OBJECT[ k ] ) continue; renameForTag[ renameForDOM[ k ] ] = k; @@ -156,32 +156,32 @@ function X_Node_Attr_objToAttrText( that, skipNetworkForElmCreation ){ * className, onclick等 はここで設定しない * */ -Node.prototype.attr = function( nameOrObj /* v */ ){ - var attrs = this._attrs, newAttrs, f, k, elm, v; +Node.prototype[ 'attr' ] = function( nameOrObj /* v */ ){ + var attrs = this[ '_attrs' ], newAttrs, f, k, elm, v; - if( !this._tag ) return this; + if( !this[ '_tag' ] ) return this; if( nameOrObj && X_Type_isObject( nameOrObj ) ){ - attrs || ( attrs = this._attrs = {} ); - newAttrs = this._newAttrs || ( this._newAttrs = {} ); + attrs || ( attrs = this[ '_attrs' ] = {} ); + newAttrs = this[ '_newAttrs' ] || ( this[ '_newAttrs' ] = {} ); for( k in nameOrObj ){ //if( X_EMPTY_OBJECT[ k ] ) continue; if( X_Node_Attr_setAttr( this, attrs, newAttrs, k, nameOrObj[ k ] ) === true ) f = true; }; if( f ){ - delete this._attrText; - this._flags |= X_Node_State.DIRTY_ATTR | X_Node_State.OLD_ATTRTEXT; - this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate(); + delete this[ '_attrText' ]; + this[ '_flags' ] |= X_Node_State.DIRTY_ATTR | X_Node_State.OLD_ATTRTEXT; + this[ '_flags' ] & X_Node_State.IN_TREE && X_Node_reserveUpdate(); }; return this; } else if( 1 < arguments.length ){ // setter - if( X_Node_Attr_setAttr( this, attrs || ( this._attrs = {} ), this._newAttrs || ( this._newAttrs = {} ), nameOrObj, arguments[ 1 ] ) === true ){ - delete this._attrText; - this._flags |= X_Node_State.DIRTY_ATTR | X_Node_State.OLD_ATTRTEXT; - this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate(); + if( X_Node_Attr_setAttr( this, attrs || ( this[ '_attrs' ] = {} ), this[ '_newAttrs' ] || ( this[ '_newAttrs' ] = {} ), nameOrObj, arguments[ 1 ] ) === true ){ + delete this[ '_attrText' ]; + this[ '_flags' ] |= X_Node_State.DIRTY_ATTR | X_Node_State.OLD_ATTRTEXT; + this[ '_flags' ] & X_Node_State.IN_TREE && X_Node_reserveUpdate(); }; return this; } else @@ -189,22 +189,22 @@ Node.prototype.attr = function( nameOrObj /* v */ ){ // getter switch( nameOrObj ){ case 'id' : - return this._id; + return this[ '_id' ]; case 'class' : case 'className' : - return this._className; + return this[ '_className' ]; case 'tag' : case 'tagName' : - return this._tag; + return this[ '_tag' ]; case 'style' : case 'cssText' : - return this.cssText(); + return this[ 'cssText' ](); case 'src' : // src は遷移して変化する, name も? - if( this._tag !== 'IFRAME' ) break; - if( this._newAttrs && X_Object_inObject( nameOrObj, this._newAttrs ) ) return this._newAttrs[ nameOrObj ]; - if( elm = X_UA_DOM.IE4 ? this._rawObject || X_Node__ie4getRawNode( this ) : this._rawObject ){ - if( !attrs ) attrs = this._attrs = {}; + if( this[ '_tag' ] !== 'IFRAME' ) break; + if( this[ '_newAttrs' ] && X_Object_inObject( nameOrObj, this[ '_newAttrs' ] ) ) return this[ '_newAttrs' ][ nameOrObj ]; + if( elm = X_UA_DOM.IE4 ? this[ '_rawObject' ] || X_Node__ie4getRawNode( this ) : this[ '_rawObject' ] ){ + if( !attrs ) attrs = this[ '_attrs' ] = {}; return attrs[ nameOrObj ] = elm[ nameOrObj ]; // getAttribute( nameOrObj )? }; break; @@ -213,16 +213,16 @@ Node.prototype.attr = function( nameOrObj /* v */ ){ // kquery.js : safariのバグ対策 // if ($.browser.safari && key === "selected" && tmp) tmp.selectedIndex; // 親ノードの selectedIndex の getter を呼んでおくと値が正しくなる、ということ?( by itozyun ) - if( X_UA[ 'WebKit' ] ) this._rawObject.parentNode && this._rawObject.parentNode.selectedIndex; + if( X_UA[ 'WebKit' ] ) this[ '_rawObject' ].parentNode && this[ '_rawObject' ].parentNode.selectedIndex; case 'value' : - if( this._tag === 'INPUT' && X_Node_Attr_STATIC_VALUE_TYPES[ attrs[ 'type' ] ] ) break; + if( this[ '_tag' ] === 'INPUT' && X_Node_Attr_STATIC_VALUE_TYPES[ attrs[ 'type' ] ] ) break; case 'checked' : case 'disabled' : case 'selectedIndex' : - if( X_Node_Attr_HAS_VALUE[ this._tag ] ){ - if( this._newAttrs && X_Object_inObject( nameOrObj, this._newAttrs ) ) return this._newAttrs[ nameOrObj ]; - if( elm = X_UA_DOM.IE4 ? this._rawObject || X_Node__ie4getRawNode( this ) : this._rawObject ){ - if( !attrs ) attrs = this._attrs = {}; + if( X_Node_Attr_HAS_VALUE[ this[ '_tag' ] ] ){ + if( this[ '_newAttrs' ] && X_Object_inObject( nameOrObj, this[ '_newAttrs' ] ) ) return this[ '_newAttrs' ][ nameOrObj ]; + if( elm = X_UA_DOM.IE4 ? this[ '_rawObject' ] || X_Node__ie4getRawNode( this ) : this[ '_rawObject' ] ){ + if( !attrs ) attrs = this[ '_attrs' ] = {}; return attrs[ nameOrObj ] = elm[ nameOrObj ]; // getAttribute( nameOrObj )? }; }; @@ -239,24 +239,24 @@ function X_Node_Attr_setAttr( that, attrs, newAttrs, name, v ){ case 'tagName' : return; case 'id' : - v = ( v !== 'ie4uid' + that._uid ) ? v : undefined; + v = ( v !== 'ie4uid' + that[ '_uid' ] ) ? v : undefined; // TODO unique の check - if( v !== that._id ){ - that._id = v; - that._flags |= X_Node_State.DIRTY_ID; - that._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate(); + if( v !== that[ '_id' ] ){ + that[ '_id' ] = v; + that[ '_flags' ] |= X_Node_State.DIRTY_ID; + that[ '_flags' ] & X_Node_State.IN_TREE && X_Node_reserveUpdate(); }; return; case 'class' : case 'className' : - return that.className( v ); + return that[ 'className' ]( v ); case 'style' : case 'cssText' : - return that.cssText( v ); + return that[ 'cssText' ]( v ); case 'text' : - return that.text( v ); + return that[ 'text' ]( v ); case 'html' : - return that.html( v ); + return that[ 'html' ]( v ); }; // debug if( name.indexOf( 'on' ) === 0 ){ diff --git a/0.6.x/js/02_dom/06_XNodeCSS.js b/0.6.x/js/02_dom/06_XNodeCSS.js index 6a87798..4f22524 100644 --- a/0.6.x/js/02_dom/06_XNodeCSS.js +++ b/0.6.x/js/02_dom/06_XNodeCSS.js @@ -47,15 +47,15 @@ function X_Node_CSS_uncamelize( str ){ var -X_node_CSS_getComputedStyle = window.getComputedStyle || document.defaultView && document.defaultView.getComputedStyle, - - /* font-size -> fontSize */ -X_Node_CSS__DICTIONARY_CAMELIZE = {}, - - /* fontSize -> font-size */ -X_Node_CSS_CHAR_CODE_A = 'A'.charCodeAt( 0 ), + X_Node_CSS_getComputedStyle = window.getComputedStyle || document.defaultView && document.defaultView.getComputedStyle, + + /* font-size -> fontSize */ + X_Node_CSS__DICTIONARY_CAMELIZE = {}, -X_Node_CSS__DICTIONARY_UNCAMELIZE = {}, + /* fontSize -> font-size */ + X_Node_CSS_CHAR_CODE_A = 'A'.charCodeAt( 0 ), + + X_Node_CSS__DICTIONARY_UNCAMELIZE = {}, /* * CSS における display, position, float プロパティの相互関係 @@ -84,12 +84,12 @@ _ABSOLUTE_BOX _FLOAT_BOX _GRNERAL */ -X_Node_CSS_VENDER_PREFIX = {}, - -X_Node_CSS__CLIP_SEPARATOR = X_UA[ 'IE' ] < 8 ? ' ' : ',', - -X_Node_CSS__UNIT_RATIO = {}, -X_Node_CSS__FONT_SIZE_RATIO = {}, + X_Node_CSS_VENDER_PREFIX = {}, + + X_Node_CSS__CLIP_SEPARATOR = X_UA[ 'IE' ] < 8 ? ' ' : ',', + + X_Node_CSS__UNIT_RATIO = {}, + X_Node_CSS__FONT_SIZE_RATIO = {}, // https://developer.mozilla.org/en-US/docs/Web/CSS/transform // Firefox 3.5, ie9, Opera 10.5, Safari 3.1, Chrome @@ -103,88 +103,88 @@ X_Node_CSS__FONT_SIZE_RATIO = {}, // ブラウザ毎の getComputedStyle の戻り値 http://d.hatena.ne.jp/uupaa/20080928/1222543331 -X_Node_CSS_COLOR = { - BLACK : 0x0, - RED : 0xFF0000, - LIME : 0x00FF00, - BLUE : 0x0000FF, - YELLOW : 0xFFFF00, - AQUA : 0x00FFFF, - CYAN : 0x00FFFF, - MAGENTA : 0xFF00FF, - FUCHSIA : 0xFF00FF, - WHITE : 0xFFFFFF, - GREEN : 0x008000, - PURPLE : 0x800080, - MAROON : 0x800000, - NAVY : 0x000080, - OLIVE : 0x808000, - TEAL : 0x008080, - GRAY : 0x808080, - SILVER : 0xC0C0C0, - DIMGRAY : 0x696969, - SLATEGRAY : 0x708090, - DARKGRAY : 0xA9A9A9, - GAINSBORO : 0xDCDCDC, - MIDNIGHTBLUE : 0x191970, - SLATEBLUE : 0x6A5ACD, - MEDIUMBLUE : 0x0000CD, - ROYALBLUE : 0x4169E1, - DODGERBLUE : 0x1E90FF, - SKYBLUE : 0x87CEEB, - STEELBLUE : 0x4682B4, - LIGHTBLUE : 0xADD8E6, - PALETURQUOISE : 0xAFEEEE, - TURQUOISE : 0x40E0D0, - LIGHTCYAN : 0xE0FFFF, - AQUAMARINE : 0x7FFFD4, - DARKGREEN : 0x006400, - SEAGREEN : 0x2E8B57, - LIGHTGREEN : 0x90EE90, - CHARTREUSE : 0x7FFF00, - GREENYELLOW : 0xADFF2F, - LIMEGREEN : 0x32CD32, - YELLOWGREEN : 0x9ACD32, - OLIVEDRAB : 0x6B8E23, - DARKKHAKI : 0xBCB76B, - PALEGOLDENROD : 0xEEE8AA, - LIGHTYELLOW : 0xFFFFE0, - GOLD : 0xFFD700, - GOLDENROD : 0xDAA520, - DARKGOLDENROD : 0xB8860B, - ROSYBROWN : 0xBC8F8F, - INDIANRED : 0xCD5C5C, - SADDLEBROWN : 0x8B4513, - SIENNA : 0xA0522D, - PERU : 0xCD853F, - BURLYWOOD : 0xDEB887, - BEIGE : 0xF5F5DC, - WHEAT : 0xF5DEB3, - SANDYBROWN : 0xF4A460, - TAN : 0xD2B48C, - CHOCOLATE : 0xD2691E, - FIREBRICK : 0xB22222, - BROWN : 0xA52A2A, - SALMON : 0xFA8072, - ORANGE : 0xFFA500, - CORAL : 0xFF7F50, - TOMATO : 0xFF6347, - HOTPINK : 0xFF69B4, - PINK : 0xFFC0CB, - DEEPPINK : 0xFF1493, - PALEVIOLETRED : 0xDB7093, - VIOLET : 0xEE82EE, - PLUM : 0xDDA0DD, - ORCHILD : 0xDA70D6, - DARKVIOLET : 0x9400D3, - BLUEVIOLET : 0x8A2BE2, - MEDIUMPURPLE : 0x9370DB, - THISTLE : 0xD8BFD8, - LAVENDER : 0xE6E6FA, - MISTYROSE : 0xFFE4E1, - IVORY : 0xFFFFF0, - LEMONCHIFFON : 0xFFFACD -}; + X_Node_CSS_COLOR = { + 'BLACK' : 0x0, + 'RED' : 0xFF0000, + 'LIME' : 0x00FF00, + 'BLUE' : 0x0000FF, + 'YELLOW' : 0xFFFF00, + 'AQUA' : 0x00FFFF, + 'CYAN' : 0x00FFFF, + 'MAGENTA' : 0xFF00FF, + 'FUCHSIA' : 0xFF00FF, + 'WHITE' : 0xFFFFFF, + 'GREEN' : 0x008000, + 'PURPLE' : 0x800080, + 'MAROON' : 0x800000, + 'NAVY' : 0x000080, + 'OLIVE' : 0x808000, + 'TEAL' : 0x008080, + 'GRAY' : 0x808080, + 'SILVER' : 0xC0C0C0, + 'DIMGRAY' : 0x696969, + 'SLATEGRAY' : 0x708090, + 'DARKGRAY' : 0xA9A9A9, + 'GAINSBORO' : 0xDCDCDC, + 'MIDNIGHTBLUE' : 0x191970, + 'SLATEBLUE' : 0x6A5ACD, + 'MEDIUMBLUE' : 0x0000CD, + 'ROYALBLUE' : 0x4169E1, + 'DODGERBLUE' : 0x1E90FF, + 'SKYBLUE' : 0x87CEEB, + 'STEELBLUE' : 0x4682B4, + 'LIGHTBLUE' : 0xADD8E6, + 'PALETURQUOISE' : 0xAFEEEE, + 'TURQUOISE' : 0x40E0D0, + 'LIGHTCYAN' : 0xE0FFFF, + 'AQUAMARINE' : 0x7FFFD4, + 'DARKGREEN' : 0x006400, + 'SEAGREEN' : 0x2E8B57, + 'LIGHTGREEN' : 0x90EE90, + 'CHARTREUSE' : 0x7FFF00, + 'GREENYELLOW' : 0xADFF2F, + 'LIMEGREEN' : 0x32CD32, + 'YELLOWGREEN' : 0x9ACD32, + 'OLIVEDRAB' : 0x6B8E23, + 'DARKKHAKI' : 0xBCB76B, + 'PALEGOLDENROD' : 0xEEE8AA, + 'LIGHTYELLOW' : 0xFFFFE0, + 'GOLD' : 0xFFD700, + 'GOLDENROD' : 0xDAA520, + 'DARKGOLDENROD' : 0xB8860B, + 'ROSYBROWN' : 0xBC8F8F, + 'INDIANRED' : 0xCD5C5C, + 'SADDLEBROWN' : 0x8B4513, + 'SIENNA' : 0xA0522D, + 'PERU' : 0xCD853F, + 'BURLYWOOD' : 0xDEB887, + 'BEIGE' : 0xF5F5DC, + 'WHEAT' : 0xF5DEB3, + 'SANDYBROWN' : 0xF4A460, + 'TAN' : 0xD2B48C, + 'CHOCOLATE' : 0xD2691E, + 'FIREBRICK' : 0xB22222, + 'BROWN' : 0xA52A2A, + 'SALMON' : 0xFA8072, + 'ORANGE' : 0xFFA500, + 'CORAL' : 0xFF7F50, + 'TOMATO' : 0xFF6347, + 'HOTPINK' : 0xFF69B4, + 'PINK' : 0xFFC0CB, + 'DEEPPINK' : 0xFF1493, + 'PALEVIOLETRED' : 0xDB7093, + 'VIOLET' : 0xEE82EE, + 'PLUM' : 0xDDA0DD, + 'ORCHILD' : 0xDA70D6, + 'DARKVIOLET' : 0x9400D3, + 'BLUEVIOLET' : 0x8A2BE2, + 'MEDIUMPURPLE' : 0x9370DB, + 'THISTLE' : 0xD8BFD8, + 'LAVENDER' : 0xE6E6FA, + 'MISTYROSE' : 0xFFE4E1, + 'IVORY' : 0xFFFFF0, + 'LEMONCHIFFON' : 0xFFFACD + }; function X_Node_CSS_parseColor( x ){ var rgb, r, g, b; @@ -245,16 +245,16 @@ function X_Node_CSS_parseColor( x ){ }; function X_Node_CSS_objToCssText( that, skipFilter ){ - var obj = that._css, + var obj = that[ '_css' ], plain = X_EMPTY_OBJECT, css = [], n = -1, p, v, specialFix, filterFix; - that._flags &= ~X_Node_State.OLD_CSSTEXT; + that[ '_flags' ] &= ~X_Node_State.OLD_CSSTEXT; if( !obj ){ // Opera7.5 未満? - delete that._cssText; + delete that[ '_cssText' ]; return ''; }; @@ -286,14 +286,14 @@ function X_Node_CSS_objToCssText( that, skipFilter ){ if( 0 <= n ){ // cssText には完全なものを控えるが、戻すのは filter を抜いたもの - that._cssText = css.join( ';' ); + that[ '_cssText' ] = css.join( ';' ); if( skipFilter ){ --css.length; return css.join( ';' ); }; - return that._cssText; + return that[ '_cssText' ]; }; - delete that._cssText; + delete that[ '_cssText' ]; return ''; }; @@ -301,19 +301,19 @@ var X_Node_CSS_FILTER_FIX_PROPS = X_UA[ 'ActiveX' ] && X_UA[ 'IE' ] < 9 && !X_UA[ 'MacIE' ] ? { - opacity : 2, - boxShadow : 3, - textShadow : 4, - transform : 5 + 'opacity' : 2, + 'boxShadow' : 3, + 'textShadow' : 4, + 'transform' : 5 } : X_UA[ 'ActiveX' ] && X_UA[ 'IE9' ] ? // == 9 { - textShadow : 4 + 'textShadow' : 4 } : null; function X_Node_CSS_objToIEFilterText( that, opt_css ){ - var obj = opt_css || that._css, + var obj = opt_css || that[ '_css' ], test = X_Node_CSS_FILTER_FIX_PROPS, filters = [], n = -1, @@ -393,7 +393,7 @@ function X_Node_CSS_objToIEFilterText( that, opt_css ){ }; if( afterUpdate ){ // AFTER_UPDATE 時に 再計算 - X_ViewPort.listenOnce( X_Event.AFTER_UPDATE, that, X_Node_CSS_onAfterUpdateForIEFilterFix ); + X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, that, X_Node_CSS_onAfterUpdateForIEFilterFix ); break; }; dir = Math.atan2( params[ 1 ] + params[ 3 ], params[ 0 ] + params[ 3 ] ) * 180 / Math.PI + 90; @@ -416,8 +416,8 @@ function X_Node_CSS_objToIEFilterText( that, opt_css ){ }; function X_Node_CSS_onAfterUpdateForIEFilterFix(){ - if( this._flags & X_Node_State.IN_TREE ){ // 要素があり、要素がツリーに属している - this._flags |= X_Node_State.DIRTY_IE_FILTER; + if( this[ '_flags' ] & X_Node_State.IN_TREE ){ // 要素があり、要素がツリーに属している + this[ '_flags' ] |= X_Node_State.DIRTY_IE_FILTER; X_Node_reserveUpdate(); }; }; @@ -505,17 +505,18 @@ function X_Node_CSS__splitValueAndUnit( v ){ // obj setter // name, value setter -Node.prototype.css = function( nameOrObj /* orUnitID, valuOrUnitOrName */ ){ +Node.prototype[ 'css' ] = function( nameOrObj /* orUnitID, valuOrUnitOrName */ ){ var args = arguments, - css = this._css, + css = this[ '_css' ], p, name, v, plain, camelize, flags; - if( !this._tag || X_Dom_DTD_MOVE_TO_HEAD[ this._tag ] || this._tag === 'SCRIPT' ) return this; + + if( !this[ '_tag' ] || X_Dom_DTD_MOVE_TO_HEAD[ this[ '_tag' ] ] || this[ '_tag' ] === 'SCRIPT' ) return this; // setter:object if( X_Type_isObject( nameOrObj ) ){ - if( !css ) css = this._css = {}; + if( !css ) css = this[ '_css' ] = {}; plain = X_EMPTY_OBJECT; camelize = X_Node_CSS_camelize; - flags = this._flags; + flags = this[ '_flags' ]; for( p in nameOrObj ){ if( plain[ p ] ) continue; name = camelize( p ); @@ -523,20 +524,20 @@ Node.prototype.css = function( nameOrObj /* orUnitID, valuOrUnitOrName */ ){ if( css[ name ] === v ) continue; flags = X_Node_CSS_setStyle( css, flags, name, v ); }; - this._flags |= X_Node_State.DIRTY_CSS | X_Node_State.OLD_CSSTEXT; - this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate(); - delete this._cssText; + this[ '_flags' ] |= X_Node_State.DIRTY_CSS | X_Node_State.OLD_CSSTEXT; + this[ '_flags' ] & X_Node_State.IN_TREE && X_Node_reserveUpdate(); + delete this[ '_cssText' ]; return this; } else if( 1 < args.length ){ // setter name, value - if( !css ) css = this._css = {}; + if( !css ) css = this[ '_css' ] = {}; name = X_Node_CSS_camelize( nameOrObj ); v = args[ 1 ]; if( css[ name ] === v ) return this; - this._flags = X_Node_CSS_setStyle( css, this._flags, name, v ) | X_Node_State.DIRTY_CSS | X_Node_State.OLD_CSSTEXT; - this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate(); - delete this._cssText; + this[ '_flags' ] = X_Node_CSS_setStyle( css, this[ '_flags' ], name, v ) | X_Node_State.DIRTY_CSS | X_Node_State.OLD_CSSTEXT; + this[ '_flags' ] & X_Node_State.IN_TREE && X_Node_reserveUpdate(); + delete this[ '_cssText' ]; return this; }; // getter @@ -611,34 +612,34 @@ function X_Node_CSS_setStyle( css, flags, name, newValue ){ return flags; }; -Node.prototype.cssText = function( v ){ +Node.prototype[ 'cssText' ] = function( v ){ var obj, i, l, attr, name; - if( v === this._cssText && ( this._flags & X_Node_State.OLD_CSSTEXT ) === 0 ){ + if( v === this[ '_cssText' ] && ( this[ '_flags' ] & X_Node_State.OLD_CSSTEXT ) === 0 ){ return this; }; if( v === '' ){ - delete this._css; - delete this._cssText; - this._flags |= X_Node_State.DIRTY_CSS | X_Node_State.DIRTY_IE_FILTER; - this._flags &= ~X_Node_State.OLD_CSSTEXT; - this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate(); + delete this[ '_css' ]; + delete this[ '_cssText' ]; + this[ '_flags' ] |= X_Node_State.DIRTY_CSS | X_Node_State.DIRTY_IE_FILTER; + this[ '_flags' ] &= ~X_Node_State.OLD_CSSTEXT; + this[ '_flags' ] & X_Node_State.IN_TREE && X_Node_reserveUpdate(); return this; } else if( X_Type_isString( v ) ){ - delete this._css; + delete this[ '_css' ]; obj = {}; - v = v.split( ';' ); // TODO content ";" などにも対応 <- 不要 :before :after 疑似要素には触らない + v = v.split( ';' ); // TODO content ";" などにも対応 <- 不要 :before :after 疑似要素には触らない for( i = 0, l = v.length; i < l; ++i ){ attr = v[ i ].split( ':' ); ( name = attr[ 0 ] ) && ( obj[ name ] = attr[ 1 ] || true ); }; - return this.css( obj ); + return this[ 'css' ]( obj ); }; // getter - this._flags & X_Node_State.OLD_CSSTEXT && X_Node_CSS_objToCssText( this ); - return this._cssText; + this[ '_flags' ] & X_Node_State.OLD_CSSTEXT && X_Node_CSS_objToCssText( this ); + return this[ '_cssText' ]; }; /* @@ -651,12 +652,12 @@ Node.prototype.cssText = function( v ){ */ var X_Node_CSS_getCharSize = - X_node_CSS_getComputedStyle ? + X_Node_CSS_getComputedStyle ? (function( that ){ X_Node_updateTimerID && X_Node_startUpdate(); if( that === X_Node_body && X_ViewPort_baseFontSize ) return X_ViewPort_baseFontSize; - if( that._fontSize ) return that._fontSize; - return that._fontSize = parseFloat( X_node_CSS_getComputedStyle( that._rawObject, null ).fontSize ); + if( that[ '_fontSize' ] ) return that[ '_fontSize' ]; + return that[ '_fontSize' ] = parseFloat( X_Node_CSS_getComputedStyle( that[ '_rawObject' ], null ).fontSize ); }) : 5 <= X_UA[ 'IE' ] ? @@ -664,29 +665,29 @@ X_Node_CSS_getCharSize = var font, vu, v, u, _v; X_Node_updateTimerID && X_Node_startUpdate(); if( that === X_Node_body && X_ViewPort_baseFontSize ) return X_ViewPort_baseFontSize; - if( that._fontSize ) return that._fontSize; + if( that[ '_fontSize' ] ) return that[ '_fontSize' ]; - font = that._rawObject.currentStyle.fontSize; - //font = that._css && that._css.fontSize || '1em'; + font = that[ '_rawObject' ].currentStyle.fontSize; + //font = that[ '_css' ] && that[ '_css' ].fontSize || '1em'; vu = X_Node_CSS__splitValueAndUnit( font ); v = vu[ 0 ]; u = vu[ 1 ]; if( v === 0 ){ - if( v = X_Node_CSS__FONT_SIZE_RATIO[ font ] ) return that._fontSize = v; + if( v = X_Node_CSS__FONT_SIZE_RATIO[ font ] ) return that[ '_fontSize' ] = v; } else { - if( _v = X_Node_CSS__UNIT_RATIO[ u ] ) return that._fontSize = v / _v; + if( _v = X_Node_CSS__UNIT_RATIO[ u ] ) return that[ '_fontSize' ] = v / _v; }; switch( u ){ case 'px' : - return that._fontSize = v; + return that[ '_fontSize' ] = v; case 'em' : // body まで辿ってしまった場合は? - if( that.parent ) return that._fontSize = X_Node_CSS_getCharSize( that.parent ) * v; + if( that.parent ) return that[ '_fontSize' ] = X_Node_CSS_getCharSize( that.parent ) * v; break; case '%' : // body まで辿ってしまった場合は? - if( that.parent ) return that._fontSize = X_Node_CSS_getCharSize( that.parent ) * v / 100; + if( that.parent ) return that[ '_fontSize' ] = X_Node_CSS_getCharSize( that.parent ) * v / 100; }; return 0; }) : @@ -695,52 +696,52 @@ X_Node_CSS_getCharSize = var elm, v; X_Node_updateTimerID && X_Node_startUpdate(); if( that === X_Node_body && X_ViewPort_baseFontSize ) return X_ViewPort_baseFontSize; - if( that._fontSize ) return that._fontSize; + if( that[ '_fontSize' ] ) return that[ '_fontSize' ]; - that._rawObject.appendChild( elm = document.createElement( 'span' ) ); + that[ '_rawObject' ].appendChild( elm = document.createElement( 'span' ) ); elm.style.cssText = 'display:block;position:absolute;top:0;left:0;visivility:hidden;line-height:1;height:1em;'; elm.innerHTML = 'X'; v = elm.offsetHeight; - that._rawObject.removeChild( elm ); - return that._fontSize = v; + that[ '_rawObject' ].removeChild( elm ); + return that[ '_fontSize' ] = v; }) : X_UA_DOM.IE4 ? (function( that ){ var font, vu, v, u, _v; X_Node_updateTimerID && X_Node_startUpdate(); if( that === X_Node_body && X_ViewPort_baseFontSize ) return X_ViewPort_baseFontSize; - if( that._fontSize ) return that._fontSize; + if( that[ '_fontSize' ] ) return that[ '_fontSize' ]; - if( that._css && ( font = that._css.fontSize ) ){ + if( that[ '_css' ] && ( font = that[ '_css' ].fontSize ) ){ vu = X_Node_CSS__splitValueAndUnit( font ); v = vu[ 0 ]; u = vu[ 1 ]; if( v === 0 ){ - if( _v = X_Node_CSS__FONT_SIZE_RATIO[ font ] ) return that._fontSize = _v; + if( _v = X_Node_CSS__FONT_SIZE_RATIO[ font ] ) return that[ '_fontSize' ] = _v; } else { - if( _v = X_Node_CSS__UNIT_RATIO[ u ] ) return that._fontSize = v / _v; + if( _v = X_Node_CSS__UNIT_RATIO[ u ] ) return that[ '_fontSize' ] = v / _v; }; } else { // 要素を生成して測定! - ( that._rawObject || X_Node__ie4getRawNode( that ) ).insertAdjacentHTML( 'BeforeEnd', '
    X
    ' ); + ( that[ '_rawObject' ] || X_Node__ie4getRawNode( that ) ).insertAdjacentHTML( 'BeforeEnd', '
    X
    ' ); elm = document.all[ 'ie4charsize' ]; v = elm.offsetHeight; elm.removeAttribute( 'id' ); // ? elm.outerHTML = ''; - return that._fontSize = v; + return that[ '_fontSize' ] = v; }; switch( u ){ case 'px' : - return that._fontSize = v; + return that[ '_fontSize' ] = v; case 'em' : // body まで辿ってしまった場合は? - if( that.parent ) return that._fontSize = X_Node_CSS_getCharSize( that.parent ) * v; + if( that.parent ) return that[ '_fontSize' ] = X_Node_CSS_getCharSize( that.parent ) * v; break; case '%' : // body まで辿ってしまった場合は? - if( that.parent ) return that._fontSize = X_Node_CSS_getCharSize( that.parent ) * v / 100; + if( that.parent ) return that[ '_fontSize' ] = X_Node_CSS_getCharSize( that.parent ) * v / 100; }; return 0; }) : @@ -750,7 +751,7 @@ var X_Node_CSS_Support = {}, X_Node_CSS_SPECIAL_FIX_PROP = { - transitionDuration : X_UA[ 'Android' ] && !X_UA[ 'Chrome' ] && function( v ){ // bad Android + 'transitionDuration' : X_UA[ 'Android' ] && !X_UA[ 'Chrome' ] && function( v ){ // bad Android return parseFloat( v ) === 0 ? '0.001s' : v; } @@ -760,13 +761,16 @@ var X_Node_CSS_Support = {}, }; -X.CSS = { +/** + * @namespace X.CSS + */ +X[ 'CSS' ] = { - VENDER_PREFIX : X_Node_CSS_VENDER_PREFIX, + 'VENDER_PREFIX' : X_Node_CSS_VENDER_PREFIX, // iscroll で使用 - uncamelize : X_Node_CSS_uncamelize, + 'uncamelize' : X_Node_CSS_uncamelize, - Support : X_Node_CSS_Support + 'Support' : X_Node_CSS_Support }; /* @@ -848,7 +852,7 @@ X.CSS = { })(); -X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_INIT, function(){ +X_ViewPort[ 'listenOnce' ]( X_EVENT_INIT, function(){ var xnode = X_Node_systemNode, output = X_Node_CSS__UNIT_RATIO, list = 'cm,mm,in,pt,pc'.split( ',' ), @@ -856,18 +860,18 @@ X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_INIT, function(){ for( i = list.length; i; ){ unit = list[ --i ]; - output[ unit ] = xnode.css( 'width', 10 + unit ).width() / 10; + output[ unit ] = xnode[ 'css' ]( 'width', 10 + unit )[ 'width' ]() / 10; }; output = X_Node_CSS__FONT_SIZE_RATIO, list = 'xx-large,x-large,large,larger,medium,small,smaller,x-small,xx-small'.split( ',' ); - xnode.css( { lineHeight : '100%', height : '1em' } ).text( 'X' ); + xnode[ 'css' ]( { lineHeight : '100%', height : '1em' } )[ 'text' ]( 'X' ); for( i = list.length; i; ){ size = list[ --i ]; - output[ size ] = xnode.css( 'fontSize', size ).height();// / base; + output[ size ] = xnode[ 'css' ]( 'fontSize', size )[ 'height' ]();// / base; }; - xnode.cssText( '' ).empty(); + xnode[ 'cssText' ]( '' )[ 'empty' ](); }); diff --git a/0.6.x/js/02_dom/07_XNodeList.js b/0.6.x/js/02_dom/07_XNodeList.js index fccfdb9..b6df535 100644 --- a/0.6.x/js/02_dom/07_XNodeList.js +++ b/0.6.x/js/02_dom/07_XNodeList.js @@ -10,7 +10,7 @@ function X_NodeList( v ){ }; if( ( l = args.length ) === 1 ) return new Node( args[ 0 ] ); - if( !this || this.append !== X_NodeList.prototype.append ) return new X_NodeList( args ); + if( !this || this[ 'append' ] !== X_NodeList.prototype[ 'append' ] ) return new X_NodeList( args ); for( i = 0; i < l; ++i ){ xnode = args[ i ]; @@ -31,7 +31,7 @@ function X_NodeList( v ){ }; X_NodeList.prototype.length = 0; -X_NodeList.prototype.each = function( func /* opt_args... */ ){ +X_NodeList.prototype[ 'each' ] = function( func /* opt_args... */ ){ var l = this.length, i = 0, args; diff --git a/0.6.x/js/02_dom/08_XNodeSelector.js b/0.6.x/js/02_dom/08_XNodeSelector.js index 0fd78c9..e7eded4 100644 --- a/0.6.x/js/02_dom/08_XNodeSelector.js +++ b/0.6.x/js/02_dom/08_XNodeSelector.js @@ -228,7 +228,7 @@ function X_Node_Selector__parse( query, last ){ }; // セレクター - X.Doc.find = X_shortcutFunction = Node.prototype.find = X_NodeList.prototype.find = function ( queryString ){ + X[ 'Doc' ][ 'find' ] = X_shortcutFunction = Node.prototype[ 'find' ] = X_NodeList.prototype[ 'find' ] = function ( queryString ){ var HTML = X_Node_html, scope = this.constructor === X_NodeList && this.length ? this : [ this.constructor === Node ? this : X_Node_body ], parents = scope, // 探索元の親要素 XNodeList の場合あり @@ -250,8 +250,8 @@ function X_Node_Selector__parse( query, last ){ links, className, attr, flag; /*@+debug[*/ - if( X_ViewPort_readyState < X_Event.XDOM_READY ){ - alert( 'not ready! use X.ViewPort.listenOnce( X_Event.XDOM_READY, callback )' ); + if( X_ViewPort_readyState < X_EVENT_XDOM_READY ){ + alert( 'not ready! use X.ViewPort.listenOnce( X_EVENT_XDOM_READY, callback )' ); return; }; /*]@+debug*/ @@ -319,17 +319,17 @@ function X_Node_Selector__parse( query, last ){ // > TagName|* case 2 : for( ; i < l; ++i ){ - for( xnode = parents[ i ].firstChild(); xnode; xnode = xnode.next() ){ - if( xnode._tag && ( isAll || tagName === xnode._tag ) ) xnodes[ ++n ] = xnode; + for( xnode = parents[ i ][ 'firstChild' ](); xnode; xnode = xnode[ 'next' ]() ){ + if( xnode[ '_tag' ] && ( isAll || tagName === xnode[ '_tag' ] ) ) xnodes[ ++n ] = xnode; }; }; break; // + TagName|* case 3 : for( ; i < l; ++i ){ - for( xnode = parents[ i ].next(); xnode; xnode = xnode.next() ){ - if( xnode._tag ){ - if( isAll || tagName === xnode._tag ) xnodes[ ++n ] = xnode; + for( xnode = parents[ i ][ 'next' ](); xnode; xnode = xnode[ 'next' ]() ){ + if( xnode[ '_tag' ] ){ + if( isAll || tagName === xnode[ '_tag' ] ) xnodes[ ++n ] = xnode; break; }; }; @@ -339,9 +339,9 @@ function X_Node_Selector__parse( query, last ){ case 4 : merge = {}; for( ; i < l; ++i ){ - for( xnode = parents[ i ].next(); xnode; xnode = xnode.next() ){ - if( xnode._tag && ( isAll || tagName === xnode._tag ) ){ - uid = xnode._uid; + for( xnode = parents[ i ][ 'next' ](); xnode; xnode = xnode[ 'next' ]() ){ + if( xnode[ '_tag' ] && ( isAll || tagName === xnode[ '_tag' ] ) ){ + uid = xnode[ '_uid' ]; if( merge[ uid ] ){ break; } else { @@ -360,7 +360,7 @@ function X_Node_Selector__parse( query, last ){ //console.log( l + ' > ' + xnodes.length + ' tag:' + tagName ); for( ; i < l; ++i ){ xnode = parents[ i ]; - xnode._xnodes && xnode._xnodes.length && X_Node_Selector__fetchElements( xnodes, xnode, isAll ? null : tagName ); + xnode[ '_xnodes' ] && xnode[ '_xnodes' ].length && X_Node_Selector__fetchElements( xnodes, xnode, isAll ? null : tagName ); }; //console.log( l + ' >> ' + xnodes.length + ' tag:' + tagName ); }; @@ -441,7 +441,7 @@ function X_Node_Selector__parse( query, last ){ if( !isXML && key === 'class' && op === 3 ){ val = _ + val + _; for( i = 0, n = -1; xnode = xnodes[ i ]; ++i ){ - className = xnode._className; + className = xnode[ '_className' ]; if( !!( className && ( _ + className + _ ).indexOf( val ) > -1 ) ^ isNot ) tmp[ ++n ] = xnode; }; } else { @@ -457,9 +457,9 @@ function X_Node_Selector__parse( query, last ){ for( i = 0, n = -1, l = xnodes.length; i < l; ++i ){ xnode = xnodes[ i ]; attr = - key === 'id' ? xnode._id : - key === 'class' ? xnode._className : - xnode._attrs && xnode._attrs[ key ]; + key === 'id' ? xnode[ '_id' ] : + key === 'class' ? xnode[ '_className' ] : + xnode[ '_attrs' ] && xnode[ '_attrs' ][ key ]; //flag_call ? // funcAttr( elem, key ) : //useName ? @@ -518,12 +518,12 @@ function X_Node_Selector__parse( query, last ){ for( i = 0, n = -1; i < l; ++i ){ //alert( 'multi:' + i ) xnode = ret[ i ]; - if( !merge[ uid = xnode._uid ] ){ + if( !merge[ uid = xnode[ '_uid' ] ] ){ merge[ uid ] = true; xnodes[ ++n ] = xnode; }; }; - X_Node_Selector__sortElementOrder( ret = [], xnodes, hasRoot ? [ HTML ] : HTML._xnodes ); + X_Node_Selector__sortElementOrder( ret = [], xnodes, hasRoot ? [ HTML ] : HTML[ '_xnodes' ] ); xnodes = ret; }; @@ -536,8 +536,8 @@ function X_Node_Selector__parse( query, last ){ j, child, _xnodes; for( ; i < l; ++i ){ child = xnodes[ i ]; - if( !child._tag ) continue; - //console.log( child._tag ); + if( !child[ '_tag' ] ) continue; + //console.log( child[ '_tag' ] ); if( ( j = list.indexOf( child ) ) !== -1 ){ newList[ newList.length ] = child; list.splice( j, 1 ); @@ -548,23 +548,23 @@ function X_Node_Selector__parse( query, last ){ }; if( list.length === 0 ) return true; }; - if( ( _xnodes = child._xnodes ) && X_Node_Selector__sortElementOrder( newList, list, _xnodes ) ){ + if( ( _xnodes = child[ '_xnodes' ] ) && X_Node_Selector__sortElementOrder( newList, list, _xnodes ) ){ return true; }; }; }; function X_Node_Selector__fetchElements( list, parent, tag ){ - var xnodes = parent._xnodes, + var xnodes = parent[ '_xnodes' ], l = xnodes.length, i = 0, child; for( ; i < l; ++i ){ child = xnodes[ i ]; - if( child._tag ){ - ( !tag || child._tag === tag ) && ( list[ list.length ] = child ); - //console.log( parent._tag + ' > ' + child._tag + ' == ' + tag+ ' l:' + list.length ); - child._xnodes && child._xnodes.length && X_Node_Selector__fetchElements( list, child, tag ); + if( child[ '_tag' ] ){ + ( !tag || child[ '_tag' ] === tag ) && ( list[ list.length ] = child ); + //console.log( parent[ '_tag' ] + ' > ' + child[ '_tag' ] + ' == ' + tag+ ' l:' + list.length ); + child[ '_xnodes' ] && child[ '_xnodes' ].length && X_Node_Selector__fetchElements( list, child, tag ); }; }; }; @@ -575,19 +575,19 @@ function X_Node_Selector__parse( query, last ){ i = 0, n = -1, xnode, node, tagName, tmp; for( ; xnode = xnodes[ i ]; ++i ){ - tagName = flag_all || xnode._tag; + tagName = flag_all || xnode[ '_tag' ]; tmp = null; if( /* tmp === null && */ type <= 0 ){ - for( node = xnode.prev(); node; node = node.prev() ){ - if( node._tag && ( flag_all || tagName === node._tag ) ){ + for( node = xnode[ 'prev' ](); node; node = node[ 'prev' ]() ){ + if( node[ '_tag' ] && ( flag_all || tagName === node[ '_tag' ] ) ){ tmp = false; break; }; }; }; if( tmp === null && 0 <= type ){ - for( node = xnode.next(); node; node = node.next() ){ - if( node._tag && ( flag_all || tagName === node._tag ) ){ + for( node = xnode[ 'next' ](); node; node = node[ 'next' ]() ){ + if( node[ '_tag' ] && ( flag_all || tagName === node[ '_tag' ] ) ){ tmp = false; break; }; @@ -606,13 +606,13 @@ function X_Node_Selector__parse( query, last ){ i = 0, n = -1, uid, c, xnode, tmp, node, tagName; for( ; xnode = xnodes[ i ]; ++i ){ - uid = xnode._uid; + uid = xnode[ '_uid' ]; tmp = checked[ uid ]; if( tmp === void 0 ){ - for( c = 0, node = xnode.parent[ pointer ](), tagName = flag_all || xnode._tag; node; node = node[ sibling ]() ){ - if( node._tag && ( flag_all || tagName === node._tag ) ){ + for( c = 0, node = xnode.parent[ pointer ](), tagName = flag_all || xnode[ '_tag' ]; node; node = node[ sibling ]() ){ + if( node[ '_tag' ] && ( flag_all || tagName === node[ '_tag' ] ) ){ ++c; - checked[ node._uid ] = a === 0 ? c === b : (c - b) % a === 0 && (c - b) / a >= 0; + checked[ node[ '_uid' ] ] = a === 0 ? c === b : (c - b) % a === 0 && (c - b) / a >= 0; }; }; tmp = checked[ uid ]; @@ -626,23 +626,23 @@ function X_Node_Selector__parse( query, last ){ flag_not = flag ? flags.not : !flags.not, i = 0, n = -1, xnode; for( ; xnode = xnodes[ i ]; ++i ){ - if( xnode._attrs && xnode._attrs[ prop ] ^ flag_not ) res[ ++n ] = xnode; + if( xnode[ '_attrs' ] && xnode[ '_attrs' ][ prop ] ^ flag_not ) res[ ++n ] = xnode; }; return res; }; var X_Node_Selector__filter = { - root : function( elem ){ + 'root' : function( elem ){ return elem === ( elem.ownerDocument || elem.document ).documentElement; }, - target : { + 'target' : { m : function( flags, xnodes ){ var res = [], hash = location.hash.slice( 1 ), flag_not = flags.not, i = 0, n = -1, xnode; for ( ; xnode = xnodes[ i ]; ++i ){ - if( ( ( xnode._id || xnode._attrs && xnode._attrs.name ) === hash ) ^ flag_not ) res[ ++n ] = xnode; + if( ( ( xnode[ '_id' ] || xnode[ '_attrs' ] && xnode[ '_attrs' ][ 'name' ] ) === hash ) ^ flag_not ) res[ ++n ] = xnode; }; return res; } @@ -677,15 +677,15 @@ var X_Node_Selector__filter = { 'nth-last-of-type' : { m : function( flags, xnodes, a, b ){ return X_Node_Selector__funcSelectorNth( 'lastChild', 'prev', false, flags, xnodes, a, b ); } }, - empty : { + 'empty' : { m : function( flags, xnodes ){ var res = [], flag_not = flags.not, i = 0, n = -1, xnode, tmp, node; for( ; xnode = xnodes[i]; ++i ){ tmp = true; - for( node = xnode.firstChild(); node; node = node.nextSibling() ){ - if( node._tag || ( !node._tag && node._text ) ){ + for( node = xnode[ 'firstChild' ](); node; node = node.nextSibling() ){ + if( node[ '_tag' ] || node[ '_text' ] ){ tmp = false; break; }; @@ -695,25 +695,24 @@ var X_Node_Selector__filter = { return res; } }, - link : { + 'link' : { m : function( flags, xnodes ){ - var links = ( xnodes[ 0 ].ownerDocument || xnodes[ 0 ].document ).links, - _data = funcData, + var links = document.links, res = [], checked, flag_not, i, link, xnode, n; if( !links ) return res; checked = {}; flag_not = flags.not; for( i = 0; link = links[ i ]; ++i ){ - checked[ ( new Node( link ) )._uid ] = true; + checked[ ( new Node( link ) )[ '_uid' ] ] = true; }; for( i = 0, n = -1; xnode = xnodes[ i ]; ++i ){ - if( checked[ xnode._uid ] ^ flag_not ) res[ ++n ] = xnode; + if( checked[ xnode[ '_uid' ] ] ^ flag_not ) res[ ++n ] = xnode; }; return res; } }, - lang : { + 'lang' : { m : function( flags, xnodes, arg ){ var res = [], //reg = new RegExp('^' + arg, 'i'), @@ -721,7 +720,7 @@ var X_Node_Selector__filter = { i = 0, n = -1, xnode, tmp, lang; arg = arg.toLowerCase(); for( ; tmp = xnode = xnodes[ i ]; ++i ){ - while( tmp && !( lang = tmp._attrs && tmp._attrs[ 'lang' ] ) ){ + while( tmp && !( lang = tmp[ '_attrs' ] && tmp[ '_attrs' ][ 'lang' ] ) ){ tmp = tmp.parent; }; //tmp = !!(tmp && reg.test(tmp.getAttribute('lang'))); @@ -730,22 +729,22 @@ var X_Node_Selector__filter = { return res; } }, - enabled : { + 'enabled' : { m : function( flags, xnodes ){ return X_Node_Selector__funcSelectorProp( 'disabled', false, flags, xnodes ); } }, - disabled : { + 'disabled' : { m : function( flags, xnodes ){ return X_Node_Selector__funcSelectorProp( 'disabled', true, flags, xnodes ); } }, - checked : { + 'checked' : { m : function( flags, xnodes ){ return X_Node_Selector__funcSelectorProp( 'checked', true, flags, xnodes ); } }, - contains : { + 'contains' : { m : function( flags, xnodes, arg ){ var res = [], flag_not = flags.not, i = 0, n = -1, xnode; for( ; xnode = xnodes[ i ]; ++i ){ - if ( ( -1 < ( xnode.text() ).indexOf( arg ) ) ^ flag_not ) res[ ++n ] = xnode; + if ( ( -1 < ( xnode[ 'text' ]() ).indexOf( arg ) ) ^ flag_not ) res[ ++n ] = xnode; }; return res; } diff --git a/0.6.x/js/02_dom/09_XHTMLParser.js b/0.6.x/js/02_dom/09_XHTMLParser.js index 2aff37d..b41eda9 100644 --- a/0.6.x/js/02_dom/09_XHTMLParser.js +++ b/0.6.x/js/02_dom/09_XHTMLParser.js @@ -127,7 +127,7 @@ var X_HTMLParser_CHARS = { if( async && startTime + 15 <= X_Timer_now() && html ){ handler.progress( 1 - html.length / async[ 0 ] ); - X.Timer.once( 0, X_HTMLParser_exec, [ html, handler, async ] ); + X_Timer_once( 0, X_HTMLParser_exec, [ html, handler, async ] ); return; }; @@ -318,7 +318,7 @@ var X_HTMLParser_htmlStringToXNode = { l = nest.length, attr, name, i, _attrs; //, toIndex; if( l ){ - xnode = nest[ l - 1 ].create( tagName ); + xnode = nest[ l - 1 ][ 'create' ]( tagName ); } else { xnode = flat[ flat.length ] = X_Doc_create( tagName ); }; @@ -344,12 +344,12 @@ var X_HTMLParser_htmlStringToXNode = { }, chars : function( text ){ if( X_HTMLParser_htmlStringToXNode.nest.length ){ - X_HTMLParser_htmlStringToXNode.nest[ X_HTMLParser_htmlStringToXNode.nest.length - 1 ].createText( text ); + X_HTMLParser_htmlStringToXNode.nest[ X_HTMLParser_htmlStringToXNode.nest.length - 1 ][ 'createText' ]( text ); } else { X_HTMLParser_htmlStringToXNode.flat[ X_HTMLParser_htmlStringToXNode.flat.length ] = X_Doc_createText( text ); }; }, - comment : X.emptyFunction + comment : X_emptyFunction }; function X_HtmlParser_parse( html, ignoreError ){ @@ -366,27 +366,27 @@ function X_HtmlParser_parse( html, ignoreError ){ var X_HTMLParser_asyncHtmlStringToXNode = { err : function( html ){ X_HTMLParser_htmlStringToXNode.err( html ); - this.asyncDispatch( X_Event.ERROR ); + this[ 'asyncDispatch' ]( X_EVENT_ERROR ); }, start : X_HTMLParser_htmlStringToXNode.start, end : X_HTMLParser_htmlStringToXNode.end, chars : X_HTMLParser_htmlStringToXNode.chars, - comment : X.emptyFunction, + comment : X_emptyFunction, progress : function( pct ){ - this.asyncDispatch( { type : X_Event.PROGRESS, percent : pct } ); + this[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, percent : pct } ); }, complete : function(){ var ret = X_HTMLParser_htmlStringToXNode.flat; delete X_HTMLParser_htmlStringToXNode.flat; - this.asyncDispatch( { type : X_Event.SUCCESS, xnodes : ret } ); + this[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS, xnodes : ret } ); } }; function X_HTMLParser_asyncParse( html, ignoreError ){ - var dispatcher = X_Class_override( new X.EventDispatcher(), X_HTMLParser_asyncHtmlStringToXNode ), + var dispatcher = X_Class_override( X_EventDispatcher(), X_HTMLParser_asyncHtmlStringToXNode ), worker = X_HTMLParser_htmlStringToXNode; - dispatcher.listenOnce( X_Event.SUCCESS, dispatcher, dispatcher.kill ); + dispatcher[ 'listenOnce' ]( X_EVENT_SUCCESS, dispatcher, dispatcher.kill ); worker.flat = []; worker.nest.length = 0; worker.ignoreError = ignoreError; diff --git a/0.6.x/js/02_dom/10_XNodeAnime.js b/0.6.x/js/02_dom/10_XNodeAnime.js index 06e0d70..ebdb856 100644 --- a/0.6.x/js/02_dom/10_XNodeAnime.js +++ b/0.6.x/js/02_dom/10_XNodeAnime.js @@ -85,9 +85,9 @@ var X_Node_ANIMATIONS = [], * TODO : filter * TODO 前回位置からの継続 */ -Node.prototype.animate = function( start, dest, duration, easing, wait ){ - var isNew = !this._anime, - obj = this._anime || ( this._anime = {} ); +Node.prototype[ 'animate' ] = function( start, dest, duration, easing, wait ){ + var isNew = !this[ '_anime' ], + obj = this[ '_anime' ] || ( this[ '_anime' ] = {} ); obj.duration = 0 <= duration && X_Type_isFinite( duration ) ? duration : 500; obj.easing = ease[ easing ] || ease.circular; @@ -115,7 +115,7 @@ Node.prototype.animate = function( start, dest, duration, easing, wait ){ if( X_Node_Anime_hasTransition ){ if( obj.gpuTimerID ){ - X.Timer.remove( obj.gpuTimerID ); + X_Timer_remove( obj.gpuTimerID ); delete obj.gpuTimerID; }; @@ -123,19 +123,19 @@ Node.prototype.animate = function( start, dest, duration, easing, wait ){ X_Node_Anime_reserveUpdate( true ); } else { - X_System.unlisten( X_Event.UPDATED, X_Node_Anime_updateAnimationsNoTransition ); - X_Node_Anime_updateTimerID || ( X_Node_Anime_updateTimerID = X.Timer.requestFrame( X_Node_Anime_updateAnimationsNoTransition ) ); + X_System[ 'unlisten' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition ); + X_Node_Anime_updateTimerID || ( X_Node_Anime_updateTimerID = X_Timer_requestFrame( X_Node_Anime_updateAnimationsNoTransition ) ); - isNew && this.dispatch( { type : X_Event.ANIME_START, gpu : false } ); + isNew && this[ 'dispatch' ]( { type : X_EVENT_ANIME_START, gpu : false } ); }; - console.log( 'animate ' + this._id + ' y:' + obj.startX + ' > ' + obj.destX + ' d:' + obj.duration ); + console.log( 'animate ' + this[ '_id' ] + ' y:' + obj.startX + ' > ' + obj.destX + ' d:' + obj.duration ); return this; }; -Node.prototype.stop = function(){ - var obj = this._anime; +Node.prototype[ 'stop' ] = function(){ + var obj = this[ '_anime' ]; if( !obj ) return; if( X_Node_Anime_hasTransition ){ obj.phase = 100; @@ -143,8 +143,8 @@ Node.prototype.stop = function(){ X_Node_Anime_reserveUpdate(); } else { X_Node_ANIMATIONS.splice( X_Node_ANIMATIONS.indexOf( this ), 1 ); - //obj.gpuTimerID && X.Timer.remove( obj.gpuTimerID ); - delete this._anime; + //obj.gpuTimerID && X_Timer_remove( obj.gpuTimerID ); + delete this[ '_anime' ]; }; return this; }; @@ -156,14 +156,14 @@ function X_Node_Anime_reserveUpdate( before ){ if( X_Node_updateTimerID ){ console.log( before ? '> BEFORE_UPDATE' : '> UPDATED' ); before = false; - X_System.listenOnce( before ? X_Event.BEFORE_UPDATE : X_Event.UPDATED, X_Node_Anime_updateAnimations ); + X_System[ 'listenOnce' ]( before ? X_EVENT_BEFORE_UPDATE : X_EVENT_UPDATED, X_Node_Anime_updateAnimations ); } else { console.log( '> Timer' ); // Opera12 requestAnimationFrame では transition が動かない、、、 X_Node_Anime_updateTimerID = X_UA[ 'Opera' ] ? - X.Timer.once( 0, X_Node_Anime_updateAnimations ) : - X.Timer.requestFrame( X_Node_Anime_updateAnimations ); + X_Timer_once( 0, X_Node_Anime_updateAnimations ) : + X_Timer_requestFrame( X_Node_Anime_updateAnimations ); }; }; }; @@ -179,12 +179,12 @@ function X_Node_Anime_updateAnimations( v, updateNow ){ for( ; i; ){ xnode = X_Node_ANIMATIONS[ --i ]; - //console.log( 'phase : ' + xnode._id + ' ' + xnode._anime.phase + ' ' + xnode._anime.duration ); + //console.log( 'phase : ' + xnode[ '_id' ] + ' ' + xnode[ '_anime' ].phase + ' ' + xnode[ '_anime' ].duration ); ret = X_Node_Anime_updateAnimation( xnode ); if( ret === true ){ X_Node_ANIMATIONS.splice( i, 1 ); - xnode._anime.gpuTimerID && X.Timer.remove( xnode._anime.gpuTimerID ); - delete xnode._anime; + xnode[ '_anime' ].gpuTimerID && X_Timer_remove( xnode[ '_anime' ].gpuTimerID ); + delete xnode[ '_anime' ]; } else if( ret !== false ){ c = true; @@ -200,7 +200,7 @@ function X_Node_Anime_updateAnimations( v, updateNow ){ }; }; -// TODO X.Timer.requestFrame 経由の BEFORE_UPDATE で更新を行う +// TODO X_Timer_requestFrame 経由の BEFORE_UPDATE で更新を行う function X_Node_Anime_detectAnimationLayers(){ var i = X_Node_ANIMATIONS.length, l = i, @@ -215,44 +215,44 @@ function X_Node_Anime_detectAnimationLayers(){ if( xnode.parent === _xnode.parent ){ continue; } else - if( _xnode.contains( xnode ) ){ - if( ( _xnode._anime.phase === 3 && _xnode._anime.gpuParent ) || _xnode._anime.phase === 10 ){ - _xnode._anime.phase = 15; + if( _xnode[ 'contains' ]( xnode ) ){ + if( ( _xnode[ '_anime' ].phase === 3 && _xnode[ '_anime' ].gpuParent ) || _xnode[ '_anime' ].phase === 10 ){ + _xnode[ '_anime' ].phase = 15; } else - if( xnode._anime.gpuParent ){ + if( xnode[ '_anime' ].gpuParent ){ parent = true; - xnode._anime.phase = xnode._anime.phase === 2 ? 6 : 15;// GPU レイヤーの解除 > アニメーションは継続, すでに終了フェイズなら破棄 + xnode[ '_anime' ].phase = xnode[ '_anime' ].phase === 2 ? 6 : 15;// GPU レイヤーの解除 > アニメーションは継続, すでに終了フェイズなら破棄 } else - if( [ 7, 8, 9, 13, 14 ].indexOf( xnode._anime.phase ) !== -1 ){// GPU レイヤーの中止 + if( [ 7, 8, 9, 13, 14 ].indexOf( xnode[ '_anime' ].phase ) !== -1 ){// GPU レイヤーの中止 parent = true; - xnode._anime.phase -= 8; + xnode[ '_anime' ].phase -= 8; }; break; } else - if( xnode.contains( _xnode ) ){ - if( ( xnode._anime.phase === 3 && xnode._anime.gpuParent ) || xnode._anime.phase === 10 ){ - xnode._anime.phase = 15; + if( xnode[ 'contains' ]( _xnode ) ){ + if( ( xnode[ '_anime' ].phase === 3 && xnode[ '_anime' ].gpuParent ) || xnode[ '_anime' ].phase === 10 ){ + xnode[ '_anime' ].phase = 15; } else - if( _xnode._anime.gpuParent ){ + if( _xnode[ '_anime' ].gpuParent ){ hasGPUChild = true; - _xnode._anime.phase = _xnode._anime.phase === 2 ? 6 : 15;// GPU レイヤーの解除 > アニメーションは継続, すでに終了フェイズなら破棄 + _xnode[ '_anime' ].phase = _xnode[ '_anime' ].phase === 2 ? 6 : 15;// GPU レイヤーの解除 > アニメーションは継続, すでに終了フェイズなら破棄 } else - if( [ 7, 8, 9, 13, 14 ].indexOf( _xnode._anime.phase ) !== -1 ){// GPU レイヤーの中止 + if( [ 7, 8, 9, 13, 14 ].indexOf( _xnode[ '_anime' ].phase ) !== -1 ){// GPU レイヤーの中止 hasGPUChild = true; - _xnode._anime.phase -= 8; + _xnode[ '_anime' ].phase -= 8; }; break; }; }; - if( !parent && xnode._anime.phase !== 15 ){ - if( xnode._anime.phase === 0 ){ + if( !parent && xnode[ '_anime' ].phase !== 15 ){ + if( xnode[ '_anime' ].phase === 0 ){ // 新規 - xnode._anime.phase = hasGPUChild ? 7 : 8;// 非GPU -> GPU 子に GPU アニメをもつなら、タイミングをずらす。 + xnode[ '_anime' ].phase = hasGPUChild ? 7 : 8;// 非GPU -> GPU 子に GPU アニメをもつなら、タイミングをずらす。 } else - if( [ 3, 4, 10, 100 ].indexOf( xnode._anime.phase ) === -1 ){ + if( [ 3, 4, 10, 100 ].indexOf( xnode[ '_anime' ].phase ) === -1 ){ // 非GPU -> GPU - xnode._anime.phase = hasGPUChild ? 13 : 14;// 非GPU -> GPU 子に GPU アニメをもつなら、タイミングをずらす。 + xnode[ '_anime' ].phase = hasGPUChild ? 13 : 14;// 非GPU -> GPU 子に GPU アニメをもつなら、タイミングをずらす。 }; }; }; @@ -264,7 +264,7 @@ function X_Node_Anime_detectAnimationLayers(){ * 0:無, 1:子のGPU解除待 2:GPU予約, 3:GPU now!, 4:GPU解除予約 */ function X_Node_Anime_updateAnimation( xnode ){ - var obj = xnode._anime, + var obj = xnode[ '_anime' ], phase = obj.phase, current, time; switch( phase ){ @@ -278,9 +278,9 @@ function X_Node_Anime_updateAnimation( xnode ){ break; case 0 : // 開始位置+アニメーションの設定 case 8 : - X_ViewPort.unlisten( X_Event.AFTER_UPDATE, xnode, X_Node_Anime_gpuReleased ); + X_ViewPort[ 'unlisten' ]( X_EVENT_AFTER_UPDATE, xnode, X_Node_Anime_gpuReleased ); - xnode.css({ + xnode[ 'css' ]({ //willChange : X_Node_Anime_transitionProps + ',opacity,width,height', backfaceVisibility : 'hidden', transitionTimingFunction : obj.easing.style, @@ -290,16 +290,16 @@ function X_Node_Anime_updateAnimation( xnode ){ console.log( '開始位置 ' + phase ); X_Node_Anime_updatePosition( xnode, obj.startX, obj.startY, obj.startA, phase === 8 ); - xnode.dispatch( { type : X_Event.ANIME_START, gpu : phase === 8 } ); + xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_START, gpu : phase === 8 } ); ++obj.phase; break; case 1 : case 9 : // 終了位置の設定 obj.gpuParent = phase === 9; if( obj.duration ){ - xnode.listenOnce( 'transitionend', X_Node_Anime_onTransitionEnd ); + xnode[ 'listenOnce' ]( 'transitionend', X_Node_Anime_onTransitionEnd ); - xnode.css({ + xnode[ 'css' ]({ transitionProperty : X_Node_Anime_transitionProps + ',opacity,width,height', transitionDuration : obj.duration + 'ms' }); @@ -316,7 +316,7 @@ function X_Node_Anime_updateAnimation( xnode ){ obj.phase = obj.gpuParent ? 10 : 4; // このタイミングで animation 関連の css を削除したところ(X_Node_Anime_clearTransition)、iOS3、4 で再描画忘れが度々起きるように、、、 if( !obj.gpuParent ) X_Node_Anime_clearTransition( xnode ); - xnode.dispatch( { type : X_Event.ANIME_END, gpu : obj.gpuParent } ); + xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_END, gpu : obj.gpuParent } ); break; case 4 : @@ -329,7 +329,7 @@ function X_Node_Anime_updateAnimation( xnode ){ //X_Node_Anime_clearTransition( xnode ); // TODO X_Node_Anime_releaseGPULayer に移動? if( !obj.gpuTimerID ){ if( obj.wait ){ - obj.gpuTimerID = X.Timer.once( obj.wait, xnode, X_Node_Anime_releaseGPULayer ); + obj.gpuTimerID = X_Timer_once( obj.wait, xnode, X_Node_Anime_releaseGPULayer ); } else { X_Node_Anime_releaseGPULayer.call( xnode ); }; @@ -351,7 +351,7 @@ function X_Node_Anime_updateAnimation( xnode ){ X_Node_Anime_clearTransition( xnode ); X_Node_Anime_updatePosition( xnode, obj.destX, obj.destY, obj.destA, phase === 14 ); obj.phase = phase === 14 ? 10 : 4; - xnode.dispatch( { type : X_Event.ANIME_END, gpu : obj.gpuParent } ); + xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_END, gpu : obj.gpuParent } ); } else { current = X_Node_Anime_getComputedPosition( xnode ); obj.startX = current.x; @@ -366,12 +366,12 @@ function X_Node_Anime_updateAnimation( xnode ){ case 15 : // GPU有効で停止(待機)している xnode の解除 - //console.log( 'GPU有効で停止(待機)している xnode の解除' + xnode._tag + xnode.getOrder() ); + //console.log( 'GPU有効で停止(待機)している xnode の解除' + xnode[ '_tag' ] + xnode[ 'getOrder' ]() ); console.log( 'GPU有効で停止(待機)している xnode のGPU解除' ); X_Node_Anime_clearTransition( xnode ); X_Node_Anime_updatePosition( xnode, obj.destX, obj.destY, obj.destA, false ); - obj.gpuTimerID && X.Timer.remove( obj.gpuTimerID ); - X_ViewPort.listenOnce( X_Event.AFTER_UPDATE, xnode, X_Node_Anime_gpuReleased ); + obj.gpuTimerID && X_Timer_remove( obj.gpuTimerID ); + X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, xnode, X_Node_Anime_gpuReleased ); return true; case 100 : // stop() : アニメーションを中断して削除 @@ -388,7 +388,7 @@ function X_Node_Anime_updateAnimation( xnode ){ }; function X_Node_Anime_getComputedPosition( that ) { - var matrix = X_node_CSS_getComputedStyle( that._rawObject, null ), + var matrix = X_Node_CSS_getComputedStyle( that[ '_rawObject' ], null ), x, y; if ( X_Node_Anime_hasTransform ) { @@ -404,13 +404,13 @@ function X_Node_Anime_getComputedPosition( that ) { }; function X_Node_Anime_onTransitionEnd( e ){ - if( !this._anime || this._anime.phase !== 2 ) return X.Callback.PREVENT_DEFAULT | X.Callback.STOP_PROPAGATION; - this._anime.phase = 3; + if( !this[ '_anime' ] || this[ '_anime' ].phase !== 2 ) return X_Callback_PREVENT_DEFAULT | X_Callback_STOP_PROPAGATION; + this[ '_anime' ].phase = 3; console.log( 'トランジション終了' ); X_Node_Anime_onTransition = true; - this.dispatch( { type : X_Event.ANIME_END, gpu : this._anime.gpuParent } ); + this[ 'dispatch' ]( { type : X_EVENT_ANIME_END, gpu : this[ '_anime' ].gpuParent } ); X_Node_Anime_onTransition = false; X_Node_Anime_needsDetection = true; @@ -418,11 +418,11 @@ function X_Node_Anime_onTransitionEnd( e ){ // win+Gecko は不可 X_Node_Anime_updateAnimations( 0, X_Node_updateOnTransitionEnd ); - return X.Callback.PREVENT_DEFAULT | X.Callback.STOP_PROPAGATION; + return X_Callback_PREVENT_DEFAULT | X_Callback_STOP_PROPAGATION; }; function X_Node_Anime_releaseGPULayer(){ - var obj = this._anime, tmp; + var obj = this[ '_anime' ], tmp; if( !obj ){ console.log( '_anime無' ); return; @@ -431,24 +431,24 @@ function X_Node_Anime_releaseGPULayer(){ X_Node_Anime_updatePosition( this, obj.destX, obj.destY, obj.destA, false ); X_Node_ANIMATIONS.splice( X_Node_ANIMATIONS.indexOf( this ), 1 ); delete obj.gpuTimerID; - delete this._anime; + delete this[ '_anime' ]; console.log( 'GPUレイヤーの破棄を指示' ); - X_ViewPort.listenOnce( X_Event.AFTER_UPDATE, this, X_Node_Anime_gpuReleased ); + X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this, X_Node_Anime_gpuReleased ); }; function X_Node_Anime_gpuReleased(){ console.log( 'GPU レイヤーが解放されました' ); - this.dispatch( { type : X_Event.GPU_RELEASED, gpu : true } ); + this[ 'dispatch' ]( { type : X_EVENT_GPU_RELEASED, gpu : true } ); }; function X_Node_Anime_clearTransition( xnode ){ // 開始座標のセット(新規のみ) // アニメーション指定のセット(または解除)(対象のみ) // 目標座標のセット - xnode.unlisten( 'transitionend', X_Node_Anime_onTransitionEnd ); + xnode[ 'unlisten' ]( 'transitionend', X_Node_Anime_onTransitionEnd ); - xnode.css({ + xnode[ 'css' ]({ //willChange : '', backfaceVisibility : '', transitionTimingFunction : '', @@ -460,12 +460,12 @@ function X_Node_Anime_clearTransition( xnode ){ function X_Node_Anime_updatePosition( xnode, x, y, opacity, useGPU ){ //console.log( 'y : ' + y + ' gpu : ' + !!useGPU ); if( X_Node_Anime_hasTransform ){ - xnode.css({ + xnode[ 'css' ]({ transform : 'translate(' + ( x | 0 ) + 'px,' + ( y | 0 ) + 'px)' + ( useGPU ? X_Node_Anime_translateZ : '' ), opacity : opacity }); } else { - xnode.css({ + xnode[ 'css' ]({ left : ( x | 0 ) + 'px', top : ( y | 0 ) + 'px', opacity : opacity @@ -474,22 +474,22 @@ function X_Node_Anime_updatePosition( xnode, x, y, opacity, useGPU ){ if( X_Node_Anime_translateZ ){ if( useGPU ){ - if( xnode._flags & X_Node_State.GPU_RELEASE_RESERVED ){ - xnode._flags &= X_Node_BitMask_RESET_GPU; - xnode._flags |= X_Node_State.GPU_NOW; + if( xnode[ '_flags' ] & X_Node_State.GPU_RELEASE_RESERVED ){ + xnode[ '_flags' ] &= X_Node_BitMask_RESET_GPU; + xnode[ '_flags' ] |= X_Node_State.GPU_NOW; } else - if( xnode._flags & X_Node_State.GPU_NOW ){ + if( xnode[ '_flags' ] & X_Node_State.GPU_NOW ){ } else { - xnode._flags &= X_Node_BitMask_RESET_GPU; - xnode._flags |= X_Node_State.GPU_RESERVED; + xnode[ '_flags' ] &= X_Node_BitMask_RESET_GPU; + xnode[ '_flags' ] |= X_Node_State.GPU_RESERVED; }; } else { - if( xnode._flags & X_Node_State.GPU_NOW ){ - xnode._flags &= X_Node_BitMask_RESET_GPU; - xnode._flags |= X_Node_State.GPU_RELEASE_RESERVED; + if( xnode[ '_flags' ] & X_Node_State.GPU_NOW ){ + xnode[ '_flags' ] &= X_Node_BitMask_RESET_GPU; + xnode[ '_flags' ] |= X_Node_State.GPU_RELEASE_RESERVED; } else - if( xnode._flags & X_Node_State.GPU_RESERVED ){ - xnode._flags &= X_Node_BitMask_RESET_GPU; + if( xnode[ '_flags' ] & X_Node_State.GPU_RESERVED ){ + xnode[ '_flags' ] &= X_Node_BitMask_RESET_GPU; }; }; }; @@ -504,16 +504,16 @@ function X_Node_Anime_updateAnimationsNoTransition(){ for( ; i; ){ xnode = X_Node_ANIMATIONS[ --i ]; - obj = xnode._anime; + obj = xnode[ '_anime' ]; if( obj.destTime <= now ){ X_Node_Anime_updatePosition( xnode, obj.destX, obj.destY, obj.destA, false ); - delete xnode._anime; + delete xnode[ '_anime' ]; X_Node_ANIMATIONS.splice( i, 1 ); // filter な 親が解除されないと子要素への filter が反映されない - xnode.asyncDispatch( { type : X_Event.ANIME_END, gpu : false } ); + xnode[ 'asyncDispatch' ]( { type : X_EVENT_ANIME_END, gpu : false } ); } else { easing = obj.easing.fn( ( now - obj.startTime ) / obj.duration ); newX = ( obj.destX - obj.startX ) * easing + obj.startX; @@ -529,10 +529,10 @@ function X_Node_Anime_updateAnimationsNoTransition(){ if( c ){ if( X_Node_updateTimerID ){ - X_System.listen( X_Event.UPDATED, X_Node_Anime_updateAnimationsNoTransition ); + X_System[ 'listen' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition ); X_Node_Anime_updateTimerID = 0; } else { - X_Node_Anime_updateTimerID = X.Timer.requestFrame( X_Node_Anime_updateAnimationsNoTransition ); + X_Node_Anime_updateTimerID = X_Timer_requestFrame( X_Node_Anime_updateAnimationsNoTransition ); }; } else { X_Node_Anime_updateTimerID = 0; diff --git a/0.6.x/js/02_dom/22_XTreeBuilder.js b/0.6.x/js/02_dom/22_XTreeBuilder.js index 78aab37..9e883b2 100644 --- a/0.6.x/js/02_dom/22_XTreeBuilder.js +++ b/0.6.x/js/02_dom/22_XTreeBuilder.js @@ -22,7 +22,7 @@ if( X_UA[ 'MacIE' ] ){ //node.data = ''; l = X_TEMP._removalTextNodes.length; if( parent ){ - //!l && X.Timer.once( 0, X_TEMP._timerRemove ); + //!l && X_Timer_once( 0, X_TEMP._timerRemove ); //X_TEMP._removalTextNodes[ l ] = node; //var str=[],p; //for( p in node ){ @@ -56,7 +56,7 @@ if( X_UA[ 'MacIE' ] ){ parent.parentNode.insertBefore( clone, parent ); parent.style.display = 'none'; if( xnode ){ - xnode.parent.parent._rawObject = clone; + xnode.parent.parent[ '_rawObject' ] = clone; }; } else { // ignore @@ -82,7 +82,7 @@ if( X_UA[ 'MacIE' ] ){ }; }; - //nodes.length && X.Timer.once( 1000, X_TEMP._timerRemove ); + //nodes.length && X_Timer_once( 1000, X_TEMP._timerRemove ); }; } else @@ -105,11 +105,11 @@ if( X_UA[ 'Opera7' ] ){ * http://kojs.sukobuto.com/docs/visible-binding * IE6 には、「空の span エレメントに続く空白は無視される」という謎な癖があります。 */ -X.ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_PRE_INIT, +X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, X_UA_DOM.W3C ? (function(){ var r = X_Node_body, - body = r._rawObject, + body = r[ '_rawObject' ], copy, i, l, node, html, elmProgress; @@ -194,28 +194,29 @@ X.ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_PRE_INIT, elmProgress.setAttribute( 'style', 'position:absolute;top:0;left:0;z-index:9999;width:0;height:0.5em;background:#00f;overflow:hidden;' ); X_HTMLParser_asyncParse( html, true ) - .listen( X_Event.PROGRESS, - function(e){ + [ 'listen' ]( X_EVENT_PROGRESS, + function( e ){ elmProgress.style.width = ( e.percent * 100 | 0 ) + '%'; } ) - .listenOnce( X_Event.SUCCESS, function( e ){ - var xnodes = X_Node_body._xnodes = [], t; - xnodes.push.apply( xnodes, e.xnodes ); - elmProgress.style.width = '100%'; - - X_TEMP.asyncCreateTree( X_Node_body, body.childNodes, elmProgress ); - } ); + [ 'listenOnce' ]( X_EVENT_SUCCESS, + function( e ){ + var xnodes = X_Node_body[ '_xnodes' ] = [], t; + xnodes.push.apply( xnodes, e.xnodes ); + elmProgress.style.width = '100%'; + + X_TEMP.asyncCreateTree( X_Node_body, body.childNodes, elmProgress ); + } + ); }) : X_UA_DOM.IE4 ? (function(){ var r = X_Node_body, - body = r._rawObject, + body = r[ '_rawObject' ], elmProgress = '_xdom_builder_progress', html; - if( !X_TEMP.X_Dom_useBuilder ) return; /* @@ -229,14 +230,14 @@ X_UA_DOM.IE4 ? elmProgress = document.all[ elmProgress ]; X_HTMLParser_asyncParse( html, true ) - .listen( X_Event.PROGRESS, + [ 'listen' ]( X_EVENT_PROGRESS, function( e ){ elmProgress.style.width = ( e.percent * 100 | 0 ) + '%'; } ) - .listenOnce( X_Event.SUCCESS, + [ 'listenOnce' ]( X_EVENT_SUCCESS, function( e ){ - var xnodes = X_Node_body._xnodes = [], t; + var xnodes = X_Node_body[ '_xnodes' ] = [], t; xnodes.push.apply( xnodes, e.xnodes ); elmProgress.style.width = '100%'; @@ -248,8 +249,8 @@ X_UA_DOM.IE4 ? }) ); -X_TEMP.asyncCreateTree = function ( parent, elems, elmProgress, async ){ - var xnodes = async ? 0 : X_Object_cloneArray( parent._xnodes ), +X_TEMP.asyncCreateTree = function( parent, elems, elmProgress, async ){ + var xnodes = async ? 0 : X_Object_cloneArray( parent[ '_xnodes' ] ), l = async ? 0 : xnodes.length, stack = async ? async.stack : [], done = async ? async.done : 0, @@ -297,7 +298,7 @@ X_TEMP.asyncCreateTree = function ( parent, elems, elmProgress, async ){ async.done = done; }; //alert( 'koko?' ); - X.Timer.once( 0, X_TEMP.asyncCreateTree, [ null, null, elmProgress, async || { stack : stack, current : i < l && current, done : done } ] ); + X_Timer_once( 0, X_TEMP.asyncCreateTree, [ null, null, elmProgress, async || { stack : stack, current : i < l && current, done : done } ] ); // progress elmProgress.style.width = ( ( 1 - done / X_Node_CHASHE.length ) * 100 | 0 ) + '%'; return; @@ -307,7 +308,7 @@ X_TEMP.asyncCreateTree = function ( parent, elems, elmProgress, async ){ current = null; }; // complete - X_ViewPort.asyncDispatch( X_TEMP.SYSTEM_EVENT_XTREE ); + X_ViewPort[ 'asyncDispatch' ]( X_EVENT_XTREE_READY ); elmProgress.parentNode ? elmProgress.parentNode.removeChild( elmProgress ) : ( elmProgress.outerHTML = '' ); delete X_TEMP.asyncCreateTree; delete X_TEMP.bindElementToXnode; @@ -342,7 +343,7 @@ X_TEMP.bindElementToXnode = continue; }; - if( xnode._tag ){ + if( xnode[ '_tag' ] ){ if( elm.nodeType === 3 ){ if( !( text = elm.data ) || ( text = X_String_cleanupWhiteSpace( text ) ) === ' ' ){ //alert( text.charCodeAt( 0 ) ); @@ -353,41 +354,41 @@ X_TEMP.bindElementToXnode = }; continue; }; - alert( '1:[' +parent._tag + '>' +xnode._tag + '] !== ' + elm.nodeType + '\n' + ( elm.data ) ); + alert( '1:[' +parent[ '_tag' ] + '>' +xnode[ '_tag' ] + '] !== ' + elm.nodeType + '\n' + ( elm.data ) ); } else if( X_Dom_DTD_MOVE_TO_HEAD[ tag ] ){ alert( tag ); continue; } else - if( xnode._tag !== tag ){ - alert( '2:[' +parent._tag + '>' +xnode._tag + ' len:' + (xnode._xnodes ? xnode._xnodes.length : '' ) + '] !== ' + tag + ' ' + (elm.childNodes ? elm.childNodes.length : '' ) + '\n' + elm.outerHTML ); + if( xnode[ '_tag' ] !== tag ){ + alert( '2:[' +parent[ '_tag' ] + '>' +xnode[ '_tag' ] + ' len:' + (xnode[ '_xnodes' ] ? xnode[ '_xnodes' ].length : '' ) + '] !== ' + tag + ' ' + (elm.childNodes ? elm.childNodes.length : '' ) + '\n' + elm.outerHTML ); } else { - xnode._rawObject = elm; + xnode[ '_rawObject' ] = elm; //if( ( doc = elm.ownerDocument || elm.document ) && ( doc.createElement( 'p' ).tagName === doc.createElement( 'P' ).tagName ) ){ if( tag.charAt( 0 ) === '/' ) tag = tag.slice( 1 ); - xnode._tag = tag; + xnode[ '_tag' ] = tag; //}; - xnode._flags |= X_Node_State.IN_TREE; - xnode._flags &= X_Node_BitMask_RESET_DIRTY; - elm.UID = xnode._uid; + xnode[ '_flags' ] |= X_Node_State.IN_TREE; + xnode[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; + elm[ 'UID' ] = xnode[ '_uid' ]; current.xtext = null; if( tag === 'TEXTAREA' ){ - xnode.attr( 'value', xnode.html() ).empty(); + xnode.attr( 'value', xnode[ 'html' ]() )[ 'empty' ](); } else if( elm.childNodes && elm.childNodes.length ){ - //alert( '[' +parent._tag + '>' + xnode._tag + ' ' + (xnode._xnodes ? xnode._xnodes.length : '' ) + '] === ' + tag + ' ' + (elm.childNodes ? elm.childNodes.length : '' ) + ' Hit\n' + elm.outerHTML ); + //alert( '[' +parent[ '_tag' ] + '>' + xnode[ '_tag' ] + ' ' + (xnode[ '_xnodes' ] ? xnode[ '_xnodes' ].length : '' ) + '] === ' + tag + ' ' + (elm.childNodes ? elm.childNodes.length : '' ) + ' Hit\n' + elm.outerHTML ); //current.xtext = null; ++current.j; return { me : xnode, - xnodes : X_Object_cloneArray( xnode._xnodes ), + xnodes : X_Object_cloneArray( xnode[ '_xnodes' ] ), xtext : null, flag : 0, i : 0, - l : xnode._xnodes.length, + l : xnode[ '_xnodes' ].length, elems : X_Object_cloneArray( elm.childNodes ), j : 0, skipCleanup : skipCleanup || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ] @@ -401,41 +402,41 @@ X_TEMP.bindElementToXnode = }; if( elm.nodeType !== 3 ){ - if( !( text = xnode._text ) || ( text = X_String_cleanupWhiteSpace( text ) ) === ' ' ){ - console.log( '[' +parent._tag + '> UID:' + xnode._uid + ' len:' + xnode._text.length + ' code : ' + xnode._text.charCodeAt( 0 ) + ',' + xnode._text.charCodeAt( 1 ) + '] destroyed.' ); + if( !( text = xnode[ '_text' ] ) || ( text = X_String_cleanupWhiteSpace( text ) ) === ' ' ){ + console.log( '[' +parent[ '_tag' ] + '> UID:' + xnode[ '_uid' ] + ' len:' + xnode[ '_text' ].length + ' code : ' + xnode[ '_text' ].charCodeAt( 0 ) + ',' + xnode[ '_text' ].charCodeAt( 1 ) + '] destroyed.' ); xnode.destroy(); break; }; - alert( parent._tag + ' > ' + '"' + xnode._text + '" !== ' + tag + '\n' + - 'prev : ' + ( xnode.prev() && xnode.prev().html() ) + '\n' + - 'next : ' + ( xnode.next() && xnode.next().html() ) + '\n' + + alert( parent[ '_tag' ] + ' > ' + '"' + xnode[ '_text' ] + '" !== ' + tag + '\n' + + 'prev : ' + ( xnode[ 'prev' ]() && xnode[ 'prev' ]()[ 'html' ]() ) + '\n' + + 'next : ' + ( xnode[ 'next' ]() && xnode[ 'next' ]()[ 'html' ]() ) + '\n' + 'html : ' + elm.outerHTML ); break; }; ++current.j; - xnode._rawObject = elm; - xnode._flags |= X_Node_State.IN_TREE; - xnode._flags &= X_Node_BitMask_RESET_DIRTY; - xnode._text = elm.data; // 正確 + xnode[ '_rawObject' ] = elm; + xnode[ '_flags' ] |= X_Node_State.IN_TREE; + xnode[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; + xnode[ '_text' ] = elm.data; // 正確 if( !skipCleanup ){ - if( !( text = xnode._text ) || ( text = X_String_cleanupWhiteSpace( text ) ) === ' ' ){ - console.log( '[' +parent._tag + '>' + xnode._uid + '] destroy ... ' ); + if( !( text = xnode[ '_text' ] ) || ( text = X_String_cleanupWhiteSpace( text ) ) === ' ' ){ + console.log( '[' +parent[ '_tag' ] + '>' + xnode[ '_uid' ] + '] destroy ... ' ); xnode.destroy(); }; if( xtext ){ - xtext.text( xtext._text + text ); - console.log( '[' +parent._tag + '>' + xnode._uid + '] xtext,destroy ... ' ); + xtext[ 'text' ]( xtext[ '_text' ] + text ); + console.log( '[' +parent[ '_tag' ] + '>' + xnode[ '_uid' ] + '] xtext,destroy ... ' ); xnode.destroy(); } else { - //alert( parent._tag + '>' + '"' + text + '"\n' + elm.data ); - xnode.text( text ); + //alert( parent[ '_tag' ] + '>' + '"' + text + '"\n' + elm.data ); + xnode[ 'text' ]( text ); }; } else if( xtext ){ - xtext.text( xtext._text + xnode._text ); - console.log( '[' +parent._tag + '>' + xnode._uid + '] xtext,destroy ... ' ); + xtext[ 'text' ]( xtext[ '_text' ] + xnode[ '_text' ] ); + console.log( '[' +parent[ '_tag' ] + '>' + xnode[ '_uid' ] + '] xtext,destroy ... ' ); xnode.destroy(); }; current.xtext = xtext || xnode; @@ -452,32 +453,32 @@ X_TEMP.bindElementToXnode = xnode.parent = parent; - if( !xnode._tag ){ - xnode._flags |= X_Node_State.IN_TREE; - xnode._flags &= X_Node_BitMask_RESET_DIRTY; - //alert( X_String_cleanupWhiteSpace( xnode._text ) ); + if( !xnode[ '_tag' ] ){ + xnode[ '_flags' ] |= X_Node_State.IN_TREE; + xnode[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; + //alert( X_String_cleanupWhiteSpace( xnode[ '_text' ] ) ); if( !skipCleanup ){ - if( !( text = xnode._text ) || ( text = X_String_cleanupWhiteSpace( text ) ) === ' ' ){ + if( !( text = xnode[ '_text' ] ) || ( text = X_String_cleanupWhiteSpace( text ) ) === ' ' ){ xnode.destroy(); xnode = null; } else if( xtext ){ //alert( 'xtext ' + text.charCodeAt( 0 ) + ' : ' + text.length ); - xtext.text( xtext._text + text ); + xtext[ 'text' ]( xtext[ '_text' ] + text ); xnode.destroy(); } else { //alert( 'xnode ' + text.charCodeAt( 0 ) + ' : ' + text.length ); - xnode.text( text ); + xnode[ 'text' ]( text ); }; } else { if( xtext ){ //alert( 'skip ' + text.charCodeAt( 0 ) + ' : ' + text.length ); - xtext.text( xtext._text + xnode._text ); + xtext[ 'text' ]( xtext[ '_text' ] + xnode[ '_text' ] ); xnode.destroy(); }; }; current.xtext = xtext || xnode; - parent._flags |= X_Node_State.IE4_HAS_TEXTNODE; + parent[ '_flags' ] |= X_Node_State.IE4_HAS_TEXTNODE; return; }; @@ -491,42 +492,42 @@ X_TEMP.bindElementToXnode = //alert( '## ' + tag ); continue; } else - if( xnode._tag !== tag ){ - alert( xnode._tag + ' ' + ' !== ' + tag + '\nxnode.html():' + xnode.attr('cite') + '\nelm.outerHTML:' + elm.outerHTML ); + if( xnode[ '_tag' ] !== tag ){ + alert( xnode[ '_tag' ] + ' ' + ' !== ' + tag + '\nxnode.html():' + xnode.attr('cite') + '\nelm.outerHTML:' + elm.outerHTML ); } else { ++current.j; - xnode._rawObject = elm; - xnode._flags |= X_Node_State.IN_TREE; - xnode._flags &= X_Node_BitMask_RESET_DIRTY; - //xnode._tag = X_Dom_DTD_TAG_FIX[ tag ] || tag; - if( X_TEMP._isCleanupTarget( elm ) ){ //!xnode.hasClass( 'skip-cleanup' ) && ( X_Dom_DTD_CLEANUP_TAGS[ tag ] || xnode.hasClass( 'cleanup-target' ) ) ){ + xnode[ '_rawObject' ] = elm; + xnode[ '_flags' ] |= X_Node_State.IN_TREE; + xnode[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; + //xnode[ '_tag' ] = X_Dom_DTD_TAG_FIX[ tag ] || tag; + if( X_TEMP._isCleanupTarget( elm ) ){ //!xnode[ 'hasClass' ]( 'skip-cleanup' ) && ( X_Dom_DTD_CLEANUP_TAGS[ tag ] || xnode[ 'hasClass' ]( 'cleanup-target' ) ) ){ xnode.destroy(); break; }; - !xnode._id && elm.setAttribute( 'id', 'ie4uid' + xnode._uid ); - elm.setAttribute( 'UID', xnode._uid ); + !xnode[ '_id' ] && elm.setAttribute( 'id', 'ie4uid' + xnode[ '_uid' ] ); + elm.setAttribute( 'UID', xnode[ '_uid' ] ); tag === 'INPUT' && ( - !xnode._attrs ? - ( xnode._attrs = { type : 'text' } ) : - xnode._attrs.type || ( xnode._attrs.type = 'text' ) + !xnode[ '_attrs' ] ? + ( xnode[ '_attrs' ] = { type : 'text' } ) : + xnode[ '_attrs' ].type || ( xnode[ '_attrs' ].type = 'text' ) ); - parent._flags |= X_Node_State.IE4_HAS_ELEMENT; + parent[ '_flags' ] |= X_Node_State.IE4_HAS_ELEMENT; current.xtext = null; if( tag === 'TEXTAREA' ){ - xnode.attr( 'value', xnode.html() ).empty(); + xnode.attr( 'value', xnode[ 'html' ]() )[ 'empty' ](); } else - if( xnode._xnodes && xnode._xnodes.length ){ + if( xnode[ '_xnodes' ] && xnode[ '_xnodes' ].length ){ return { me : xnode, - xnodes : X_Object_cloneArray( xnode._xnodes ), + xnodes : X_Object_cloneArray( xnode[ '_xnodes' ] ), xtext : null, flag : 0, i : 0, - l : xnode._xnodes.length, + l : xnode[ '_xnodes' ].length, elems : X_Object_cloneArray( elm.children ), j : 0, skipCleanup : skipCleanup || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ] @@ -536,8 +537,8 @@ X_TEMP.bindElementToXnode = }; }; // for - if( !xnode._rawObject ){ - alert( xnode._tag + ' ' + xnode._id + ' !== none...' ); + if( !xnode[ '_rawObject' ] ){ + alert( xnode[ '_tag' ] + ' ' + xnode[ '_id' ] + ' !== none...' ); }; }); diff --git a/0.6.x/js/03_plugin/00_XPlugin.js b/0.6.x/js/03_plugin/00_XPlugin.js index 2a9495c..1a65f93 100644 --- a/0.6.x/js/03_plugin/00_XPlugin.js +++ b/0.6.x/js/03_plugin/00_XPlugin.js @@ -76,7 +76,10 @@ var X_Pulgin_FLASH_VERSION = navigator.mimeTypes[ 'application/x-googlegears' ].enabledPlugin ); -X.Pulgin = { +/** + * @namespace X.Pulgin + */ +X[ 'Pulgin' ] = { Flash : X_Pulgin_FLASH_VERSION, diff --git a/0.6.x/js/05_util/00_XUtil.js b/0.6.x/js/05_util/00_XUtil.js index 896284e..7a70e86 100644 --- a/0.6.x/js/05_util/00_XUtil.js +++ b/0.6.x/js/05_util/00_XUtil.js @@ -1 +1 @@ -X.Util = {}; +X[ 'Util' ] = {}; diff --git a/0.6.x/js/05_util/01_XNinjaIframe.js b/0.6.x/js/05_util/01_XNinjaIframe.js index a0ffddd..3c25676 100644 --- a/0.6.x/js/05_util/01_XNinjaIframe.js +++ b/0.6.x/js/05_util/01_XNinjaIframe.js @@ -4,7 +4,7 @@ */ // TODO Node.inherits -X.Util.NinjaIframe = X.EventDispatcher.inherits( +X[ 'Util' ][ 'NinjaIframe' ] = X_EventDispatcher[ 'inherits' ]( 'NinjaIframe', { autoRefresh : 0, @@ -17,12 +17,12 @@ X.Util.NinjaIframe = X.EventDispatcher.inherits( _name : '', _ready : false, - Constructor : function( html ){ + 'Constructor' : function( html ){ this._name = 'hidden-iframe-' + X_Timer_now(); // https://github.com/polygonplanet/Pot.js/blob/master/src/Worker.js - this.xnodeIframe = X_Node_body.create( + this.xnodeIframe = X_Node_body[ 'create' ]( 'iframe', { className : 'hidden-iframe', @@ -35,7 +35,7 @@ X.Util.NinjaIframe = X.EventDispatcher.inherits( } ); - X_ViewPort.listenOnce( X_Event.AFTER_UPDATE, this ); + X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this ); // http://nanto.asablo.jp/blog/2011/12/08/6237308 // IE 6/7 で文書間通信を実現するための一案 @@ -44,23 +44,23 @@ X.Util.NinjaIframe = X.EventDispatcher.inherits( }; // Safari 2.0.* bug: iframe's absolute position and src set. if( !X_UA[ 'Webkit' ] ){ - this.xnodeIframe.css( { position : 'absolute' } ); + this.xnodeIframe[ 'css' ]( { position : 'absolute' } ); }; if( html ) this._contentHTML = html; }, - handleEvent : function( e ){ - var raw = this.xnodeIframe._rawObject; + 'handleEvent' : function( e ){ + var raw = this.xnodeIframe[ '_rawObject' ]; switch( e.type ){ - case X_Event.AFTER_UPDATE : + case X_EVENT_AFTER_UPDATE : this._iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ this._name ]; // http://d.hatena.ne.jp/NeoCat/20080921/1221940658 // こちらに名前をsetしないとtargetが動作しない if( X_UA[ 'IE' ] ) this._iwin.name = this._name; - this.xnodeIframe.listen( [ X_UA[ 'IE' ] < 9 ? 'readystatechange' : 'load', 'error' ], this ); + this.xnodeIframe[ 'listen' ]( [ X_UA[ 'IE' ] < 9 ? 'readystatechange' : 'load', 'error' ], this ); if( !( X_UA[ 'IE' ] < 9 ) ){ this._contentHTML && X_Util_NinjaIframe_writeToIframe( this ); @@ -79,18 +79,18 @@ X.Util.NinjaIframe = X.EventDispatcher.inherits( // onload case 'load' : console.log( 'iframe load.' ); - this.asyncDispatch( X_Event.SUCCESS ); + this[ 'asyncDispatch' ]( X_EVENT_SUCCESS ); break; case 'error' : - this.asyncDispatch( X_Event.ERROR ); + this[ 'asyncDispatch' ]( X_EVENT_ERROR ); break; }; - return X.Callback.STOP_PROPAGATION; + return X_Callback_STOP_PROPAGATION; }, - refresh : function( opt_contentHTML ){ - var raw = this.xnodeIframe._rawObject, + 'refresh' : function( opt_contentHTML ){ + var raw = this.xnodeIframe[ '_rawObject' ], idoc; this._ready = false; @@ -114,9 +114,9 @@ X.Util.NinjaIframe = X.EventDispatcher.inherits( return this; }, - close : function(){ - X_ViewPort.unlisten( X_Event.AFTER_UPDATE, this ); - this.xnodeIframe.call( 'close' ); + 'close' : function(){ + X_ViewPort[ 'unlisten' ]( X_EVENT_AFTER_UPDATE, this ); + this.xnodeIframe[ 'call' ]( 'close' ); this.xnodeIframe.destroy(); } @@ -124,7 +124,7 @@ X.Util.NinjaIframe = X.EventDispatcher.inherits( ); function X_Util_NinjaIframe_writeToIframe( that ){ - var raw = that.xnodeIframe._rawObject, + var raw = that.xnodeIframe[ '_rawObject' ], idoc = raw.contentDocument || that._iwin.document, html = that._contentHTML; diff --git a/0.6.x/js/05_util/03_XUtilImage.js b/0.6.x/js/05_util/03_XUtilImage.js index 840b0b5..cd5e1d9 100644 --- a/0.6.x/js/05_util/03_XUtilImage.js +++ b/0.6.x/js/05_util/03_XUtilImage.js @@ -1,8 +1,8 @@ var X_Util_Image_actualSize = {}; -X.Util.Image = { - getActualDimension : X_Util_Image_getActualDimension +X[ 'Util' ][ 'Image' ] = { + 'getActualDimension' : X_Util_Image_getActualDimension // Alpha Image, data uri ong ... }; @@ -22,7 +22,7 @@ function X_Util_Image_getActualDimension( XnodeOrImageElemOrSrc ){ if( X_Type_isString( XnodeOrImageElemOrSrc ) ){ if( ret = X_Util_Image_actualSize[ X_URL_toAbsolutePath( XnodeOrImageElemOrSrc ) ] ) return ret; - xnode = X_Node_systemNode.create( + xnode = X_Node_systemNode[ 'create' ]( 'img', { src : XnodeOrImageElemOrSrc @@ -32,19 +32,19 @@ function X_Util_Image_getActualDimension( XnodeOrImageElemOrSrc ){ } ); X_Node_startUpdate(); - img = X_UA_DOM.IE4 ? X_Node__ie4getRawNode( xnode ) : xnode._rawObject; + img = X_UA_DOM.IE4 ? X_Node__ie4getRawNode( xnode ) : xnode[ '_rawObject' ]; remove = true; } else { if( XnodeOrImageElemOrSrc.constructor === X.Node ){ xnode = XnodeOrImageElemOrSrc; - img = X_UA_DOM.IE4 ? X_Node__ie4getRawNode( xnode )._rawObject : xnode._rawObject; + img = X_UA_DOM.IE4 ? X_Node__ie4getRawNode( xnode )[ '_rawObject' ] : xnode[ '_rawObject' ]; } else if( X_Type_isHTMLElement( XnodeOrImageElemOrSrc ) ){ img = XnodeOrImageElemOrSrc; } else - if( XnodeOrImageElemOrSrc.constructor === X.EventDispatcher && X_Type_isImage( XnodeOrImageElemOrSrc._rawObject ) ){ + if( XnodeOrImageElemOrSrc.constructor === X_EventDispatcher && X_Type_isImage( XnodeOrImageElemOrSrc[ '_rawObject' ] ) ){ xnode = XnodeOrImageElemOrSrc; - img = xnode._rawObject; + img = xnode[ '_rawObject' ]; } else { return; }; diff --git a/0.6.x/js/06_net/00_XNet.js b/0.6.x/js/06_net/00_XNet.js index 03d336a..b9cff54 100644 --- a/0.6.x/js/06_net/00_XNet.js +++ b/0.6.x/js/06_net/00_XNet.js @@ -3,38 +3,38 @@ // http://bugs.jquery.com/ticket/2709 // がある場合、