\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
*/\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
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
};\r
};\r
},\r
+ \r
+ // Super\r
+ // SuperCall\r
+ \r
instanceOf : function( klass ){\r
var Super = this;\r
if( this.constructor === klass ) return true;\r
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
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
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
};\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
}\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
} 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
}; \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
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
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
\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
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
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
// 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
};\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
};\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