OSDN Git Service

Version 0.6.70, bugfix.
authoritozyun <itozyun@user.sourceforge.jp>
Fri, 29 Aug 2014 04:41:32 +0000 (13:41 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Fri, 29 Aug 2014 04:41:32 +0000 (13:41 +0900)
0.6.x/js/00_core/00_X.js
0.6.x/js/00_core/02_XType.js
0.6.x/js/00_core/04_XClass.js
0.6.x/js/00_core/05_XTimer.js
0.6.x/js/00_core/06_XEventDispatcher.js
0.6.x/js/01_dom/11_XDomNode.js
0.6.x/js/01_dom/12_XDomEvent.js
0.6.x/js/01_dom/14_XDomAttr.js
0.6.x/js/01_dom/17_XDomNodeList.js

index a382553..2f1e63b 100644 (file)
@@ -14,8 +14,9 @@ X.VERSION = '0.6.50';
                \r
 X.bootTime = + new Date;\r
                \r
-X.getTime = Date.now ? new Function( 'return Date.now()' ) : new Function( 'return +new Date' );\r
-               \r
+X.getTime = new Function( Date.now ? 'return Date.now()' : 'return +new Date' );\r
+\r
+\r
 X.emptyFunction = new Function;\r
 \r
                // defer の場合もあるので、document.readyState を見る MacIE で false\r
index 43316dd..c8e1980 100644 (file)
@@ -5,50 +5,68 @@
  */\r
 \r
 X.Type = {\r
-       isObject : function(v) {\r
-               return v !== null && typeof v === 'object';\r
+       isObject : function( v ){\r
+               return v && typeof v === 'object'; // typeof null === 'object' に対策\r
        },\r
        \r
-       isFunction : function(v) {\r
+       isFunction : function( v ){\r
                return typeof v === 'function';\r
        },\r
+       \r
+       isUnknown : function( v ){\r
+               return typeof v === 'unknown'; // ie の XHR.open など\r
+       },\r
+       \r
        isArray :\r
                new Function( 'v',\r
-                       X.UA.IE < 5.5 ? 'return v && v.push === Array.prototype.push;' : // win ie5-, MacIE5.2\r
-                       X.UA.IE ? 'return v && Object.prototype.toString.call(v) === "[object Array]"' :\r
-                               'return v instanceof Array;'\r
+                       X.UA.IE < 5.5 ?\r
+                               'return v&&v.push===Array.prototype.push' : // win ie5-, MacIE5.2\r
+                       X.UA.IE ?\r
+                               'return v&&Object.prototype.toString.call(v)==="[object Array]"' :\r
+                               'return v instanceof Array'\r
                ),\r
                \r
-       isBoolean : function(v) {\r
-               return typeof v === 'boolean'; // v === true || v === false;\r
+       isBoolean : function( v ){\r
+               return v === true || v === false;\r
        },\r
-       isString : function(v) {\r
+       \r
+       isString : function( v ){\r
                return typeof v === 'string';\r
        },\r
-       isNumber : function(v) {\r
-               return typeof v === 'number';\r
+       \r
+       isNumber : function( v ){\r
+               return typeof v === 'number'; v !== v || v + 0 === v;\r
        },\r
-       isFinite : function(v){\r
-               return typeof v === 'number' && isFinite(v);\r
+       \r
+       isFinite : function( v ){\r
+               return typeof v === 'number' && isFinite( v ); // isFinite( '123' ) とかに対策\r
        },\r
-       isNaN : function(v){\r
-               return typeof v === 'number' && v !== v;\r
+       \r
+       isNaN : function( v ){\r
+               return v !== v; // isNaN( 'NaN' ) になってしまう\r
        },\r
+       \r
        isHTMLElement :\r
-               // ie4 or MacIE5.23\r
-               ( X.UA.IE4 || X.UA.MacIE ) ? (function(v){ return v && v.tagName && v.all;}) :\r
-               window['HTMLElement'] ? (new Function('v', 'return v instanceof HTMLElement')) :\r
-               (function(v){ return v && v.nodeType === 1 && v.appendChild;}),\r
+               new Function( 'v',\r
+                       ( X.UA.IE4 || X.UA.MacIE ) ?\r
+                               'return v&&v.tagName&&v.all' :// ie4 or MacIE5.23\r
+                       window[ 'HTMLElement' ] ?\r
+                               'return v instanceof HTMLElement' :\r
+                       //window[ 'Element' ] ?\r
+                       //      'return v instanceof Element' : // error @ie8\r
+                               'return v&&v.nodeType===1&&v.appendChild'\r
+               ),\r
        /*\r
        isElementCollection : function(v) {\r
                return (Object.prototype.toString.call(v) === "[object HTMLCollection]");\r
        },\r
        */\r
-       isNull : function(v) {\r
+       isNull : function( v ){\r
                return v === null;\r
        },\r
-       isUndefined : function(v) {\r
-               return typeof v === 'undefined';\r
+       \r
+       isUndefined : function( v ){\r
+               return v === void 0;\r
        }\r
 };\r
 \r
index e5e8b40..f4497b0 100644 (file)
@@ -98,6 +98,7 @@ X.Class = ( function(){
                        killPrivateFlag = false; // onKill 内で PrivateInstance.kill() を防ぐため\r
                        // onKill() === false の場合、kill のキャンセル\r
                        // private      は false での キャンセル は無視される\r
+                       // TODO kill instance event\r
                        if( X.Type.isFunction( instance.onKill ) && instance.onKill() === false && !def.isPrivate ){\r
                                return;\r
                        };\r
@@ -120,6 +121,10 @@ X.Class = ( function(){
                                };\r
                        };\r
                },\r
+               \r
+               // Super\r
+               // SuperCall\r
+               \r
                instanceOf : function( klass ){\r
                        var Super = this;\r
                        if( this.constructor === klass ) return true;\r
@@ -139,7 +144,7 @@ X.Class = ( function(){
                var klass    = this,\r
                        def      = X.Class._getClassDef( klass ),\r
                        dataUser = def._tempUser,\r
-                       instance,\r
+                       instance, obj,\r
                        userDef;\r
                if( def.Abstract === true ){\r
                        X.Notification.critical( 'AbstractClass!' );\r
@@ -162,14 +167,18 @@ X.Class = ( function(){
                        def.live && def.live.push( instance );\r
                };\r
                if( def.Super ){\r
-                       // klass.prototype に移動\r
+                       // TODO klass.prototype に移動\r
                        instance.Super = def.SuperProto;\r
                        instance.SuperConstructor = superConstructor;\r
                };\r
-               def[ CONSTRUCTOR ] ?\r
-                       def[ CONSTRUCTOR ].apply( instance, args ) :\r
-               def.SuperConstructor &&\r
-                       def.SuperConstructor.apply( instance, args );\r
+               obj = def[ CONSTRUCTOR ] ?\r
+                               def[ CONSTRUCTOR ].apply( instance, args ) :\r
+                       def.SuperConstructor &&\r
+                               def.SuperConstructor.apply( instance, args );\r
+               if( X.Type.isObject( obj ) ){\r
+                       instance.kill();\r
+                       return obj;\r
+               };\r
                return instance;\r
        };\r
        \r
index 1e90787..a5873d8 100644 (file)
@@ -26,7 +26,8 @@ X.Timer = {
        endTime        : 0, // iOS\r
        next           : 0,\r
        busy           : false, // for Opera7\r
-\r
+       //frameBusy      : false,\r
+       \r
        REQ_FRAME_LIST : [],\r
        requestID      : 0,\r
        \r
@@ -87,24 +88,29 @@ X.Timer = {
            };\r
        },\r
        \r
+       // ページを読み込んでからの時間\r
        _onEnterFrame : function ( time ){\r
                var list = X.Timer.REQ_FRAME_LIST,\r
-                       i    = list.length,\r
-                       q;\r
-               time = time || ( Date.now ? Date.now() : +new Date );\r
-           for( ; i; ){\r
-               q = list[ --i ];\r
+                       l    = list.length,\r
+                       i    = 0, q;\r
+               //this.frameBusy = true;\r
+               time = time || X.getTime();\r
+               console.log( X.getTime() + ' , ' + time );\r
+           for( ; i < l; ++i ){\r
+               q = list[ i ];\r
                \r
                        if( q.k ){\r
                                q.a = [ time ];\r
                                X.Callback._proxyCallback( q );\r
                        } else {\r
-                               q.f( time );\r
+                               q( time );\r
                        };\r
                //delete f.uid;\r
                //f.kill && f.kill();\r
            };\r
-           list.length = 0;\r
+           //this.frameBusy = false;\r
+           list.splice( 0, l );\r
+           if( list.length ) X.Timer.requestID = _enterFrame( X.Timer._onEnterFrame );\r
        },\r
        \r
        add : function( time, opt_count, args1, args2, args3 ){\r
index 7128f9b..067e217 100644 (file)
@@ -260,6 +260,9 @@ X.EventDispatcher =
                }\r
        );\r
 \r
+X.EventDispatcher.prototype.on  = X.EventDispatcher.prototype.listen;\r
+X.EventDispatcher.prototype.off = X.EventDispatcher.prototype.unlisten;\r
+\r
 X.EventDispatcher._once = false;\r
 \r
 console.log( 'X.Core.EventDispatcher' );\r
index e92d637..ec7a949 100644 (file)
@@ -90,8 +90,9 @@ X.Dom.Node = X.EventDispatcher.inherits(
                        } else {\r
                                if( 1 < arguments.length ) return new X.Dom.NodeList( arguments );\r
                                if( X.Type.isArray( v ) && v.length ) return new X.Dom.NodeList( v );\r
-                               if( !this || this.append !== Node.prototype.append ) return new Node( v );\r
-               \r
+                               //if( !this || this.append !== Node.prototype.append ){\r
+                               //       return new Node( v );\r
+                               //};\r
                                switch( Node._getType( v ) ){\r
                                        case Node.IS_XNODE :\r
                                        case Node.IS_XNODE_LIST :\r
@@ -184,7 +185,7 @@ Node._getType = function( v ){
        };      \r
        if( v.constructor === Node ) return Node.IS_XNODE;\r
        if( v.constructor === X.Dom.NodeList ) return Node.IS_XNODE_LIST;\r
-       if( v.tagName ) return Node.IS_RAW_HTML;\r
+       if( X.Type.isHTMLElement( v ) ) return Node.IS_RAW_HTML;\r
        if( v.nodeType === 3 ) return Node.IS_RAW_TEXT;\r
        if( typeof v === 'string' ){\r
                return '<' === v.charAt( 0 ) && v.charAt( v.length - 1 ) === '>' ? Node.IS_HTML_STRING : Node.IS_STRING;\r
@@ -758,7 +759,7 @@ Node._outerFlag = null;
 Node.prototype.html = function( html ){\r
        var _ = '', q = '"', xnodes, n, i, l;\r
        // setter\r
-       if( X.Type.isString( html ) ){\r
+       if( html !== undefined ){ // String 以外に Number や false null なども許可\r
                if( this._xnodeType === 3 ) return this.text( html );\r
                return html ? this.empty().append.apply( this, X.Dom.parse( html, true ) ) : this.empty();\r
        };\r
@@ -825,8 +826,57 @@ Node.prototype.text = function( text ){
        return this._text;\r
 };\r
 \r
-Node.prototype.each = function( func ){\r
-       func.call( this, 0 );\r
+/*\r
+ * HTML要素に対して name の関数を実行しその戻り値を返す。関数に渡す引数も任意に設定できる。\r
+ */\r
+Node.prototype.call = function( name /*, opt_args... */ ){\r
+       var raw  = this._rawNode || this._ie4getRawNode && this._ie4getRawNode(),\r
+               l    = arguments.length - 1,\r
+               func, args, params, i;\r
+       if( !raw ) return;\r
+       func = raw[ name ];\r
+       if( X.Type.isFunction( func ) ){\r
+               if( l ){\r
+                       args = X.copyArray( arguments );\r
+                       args.shift();\r
+                       return func.apply( raw, args );\r
+               };\r
+               return raw[ name ]();           \r
+       } else\r
+       if( X.Type.isUnknown( func ) ){\r
+               // typeof func === unknown に対策\r
+               // http://la.ma.la/blog/diary_200509031529.htm          \r
+               if( l ){\r
+                       args = X.copyArray( arguments );\r
+                       args.shift();\r
+                       \r
+               params = [];\r
+               for( i = 0; i < l; ++i ){\r
+                       params[ i ] = '_' + i;\r
+               };\r
+               params = params.join( ',' );\r
+               return Function(\r
+                       params,\r
+                   [ 'return this.', name, '(', params, ')' ].join( '' )\r
+               ).apply( raw, args );\r
+               };\r
+               return raw[ name ]();\r
+       };\r
+};\r
+\r
+/*\r
+ * xnode を this として関数を実行する。 NodeList.each と動作を合わせてあるため関数の戻り値は破棄される。\r
+ * 関数に渡す引数も任意に設定できる。\r
+ */\r
+Node.prototype.each = function( func /*, opt_args */ ){\r
+       var args;\r
+       if( 1 < arguments.length ){\r
+               args = X.copyArray( arguments );\r
+               args[ 0 ] = 0;          \r
+               func.apply( this, args );\r
+       } else {\r
+               func.call( this, 0 );\r
+       };\r
        return this;\r
 };\r
 \r
index 35a2f70..7c25930 100644 (file)
@@ -38,6 +38,7 @@ if( !X.UA.IE || 9 <= X.UA.IE ){
                \r
                // http://www.programming-magic.com/20090127231544/\r
                this.which         = e.which || ( e.button + 1 ); // 左:1, 中:2, 右:3\r
+               this.button        = e.button;\r
                \r
                // https://developer.mozilla.org/ja/docs/DOM/DOM_event_reference/mousewheel\r
                \r
@@ -154,6 +155,7 @@ if( !X.UA.IE || 9 <= X.UA.IE ){
                                        btn & 4 ? 2 :\r
                                        btn & 2 ? 3 : 0; // 左:1(click:0), 中:4, 右:2\r
                };\r
+               this.button      = this.which - 1;\r
                this.wheelDeltaX = this.wheelDeltaY = e.wheelDelta / 12;\r
        };\r
 };\r
@@ -194,17 +196,22 @@ X.Dom.Event._LOAD_FIX_TAGS = {
 X.Dom.Event.Rename = {};\r
 X.Dom.Event.RenameTo = {};\r
 // https://github.com/georgeadamson/jQuery.prefixfree-events/blob/master/jQuery.prefixfree-events.js\r
+// https://developer.mozilla.org/en-US/docs/Web/Events/wheel\r
+// \r
 \r
 // DOMMoseScroll\r
 if( X.UA.Gecko && window.MouseScrollEvent ){\r
        if( 2 <= X.UA.Gecko || ( 1.9 < X.UA.Gecko && 1 <= X.UA.GeckoPatch ) ){ // Gecko 1.9.1+ (firefox3.5+)\r
-               console.log( 'mousewheel <= MozMousePixelScroll' );\r
+               console.log( 'wheel <= MozMousePixelScroll' );\r
                X.Dom.Event.Rename[ 'mousewheel' ] = 'MozMousePixelScroll';\r
        } else\r
        if( 0.9 < X.UA.Gecko && 7 <= X.UA.GeckoPatch ){ // Gecko 0.9.7+ (NN6.2+?)\r
-               console.log( 'mousewheel <= DOMMouseScroll' );\r
-               X.Dom.Event.Rename[ 'mousewheel' ] = 'DOMMouseScroll';\r
+               console.log( 'wheel <= DOMMouseScroll' );\r
+               X.Dom.Event.Rename[ 'wheel' ] = 'DOMMouseScroll';\r
        };\r
+} else\r
+if( document.onmousewheel !== undefined ){\r
+       X.Dom.Event.Rename[ 'wheel' ] = 'mousewheel';\r
 };\r
 \r
 if( window.onwebkitanimationend !== undefined && window.onanimationend === undefined ){\r
index 77d8600..04a1891 100644 (file)
@@ -118,7 +118,7 @@ X.Dom.Node.prototype.attr = function( nameOrObj /* v */ ){
                // getter\r
                switch( nameOrObj ){\r
                        case 'id' :\r
-                               return this._tag;\r
+                               return this._id;\r
                        case 'class' :\r
                        case 'className' :\r
                                return this._className;\r
@@ -146,18 +146,26 @@ X.Dom.Node.prototype.attr = function( nameOrObj /* v */ ){
        };\r
 };\r
 X.Dom.Node.prototype._setAttr = function( attrs, newAttrs, name, v ){\r
-       if( name === 'UID' ) return;\r
-       if( name === 'id' ){\r
-               v = ( v !== 'ie4uid' + this._uid ) ? v : undefined;\r
-               if( v !== this._id ){\r
-                       this._id = v;\r
-                       this._dirty |= X.Dom.Dirty.ID;\r
-                       this._root && this._reserveUpdate();\r
-               };\r
-               return;\r
-       };      \r
-       if( name === 'class' ) return this.className( v );      \r
-       if( name === 'style' ) return this.cssText( v );\r
+       switch( name ){\r
+               case 'UID' :\r
+               case 'tag' :\r
+               case 'tagName' :\r
+                       return;\r
+               case 'id' :\r
+                       v = ( v !== 'ie4uid' + this._uid ) ? v : undefined;\r
+                       if( v !== this._id ){\r
+                               this._id = v;\r
+                               this._dirty |= X.Dom.Dirty.ID;\r
+                               this._root && this._reserveUpdate();\r
+                       };\r
+                       return; \r
+               case 'class' :\r
+               case 'className' :\r
+                       return this.className( v );\r
+               case 'style' :\r
+               case 'cssText' :\r
+                       return this.cssText( v );\r
+       };\r
        \r
        if( name.indexOf( 'on' ) === 0 ){\r
                X.Notification.warn( 'xnode.attr("' + name + '") is wrong, xnode.listen() & xnode.unlisten().' );\r
index d55d60b..9bf5312 100644 (file)
@@ -31,11 +31,20 @@ X.Dom.NodeList = function( v ){
 };\r
 X.Dom.NodeList.prototype.length = 0;\r
 \r
-X.Dom.NodeList.prototype.each = function( func ){\r
+X.Dom.NodeList.prototype.each = function( func /* opt_args... */ ){\r
        var l = this.length,\r
-               i = 0;\r
-       for( i = 0, l = this.length; i < l; ++i ){\r
-               if( func.call( this[ i ], i ) === false ) break;\r
+               i = 0, args;\r
+\r
+       if( 1 < arguments.length ){\r
+               args = X.copyArray( arguments );\r
+               for( ; i < l; ++i ){\r
+                       args[ 0 ] = i;\r
+                       if( func.apply( this[ i ], args ) === false ) break;\r
+               };\r
+       } else {\r
+               for( ; i < l; ++i ){\r
+                       if( func.call( this[ i ], i ) === false ) break;\r
+               };\r
        };\r
        return this;\r
 };\r