OSDN Git Service

Fix the bug of X.NodeAnime.
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 04_XType.js
1         /**\r
2          * Array か?判定する。argumnets 等のフェイク Array は false なので注意。\r
3          * @function\r
4          * @alias X.Type.isArray\r
5          */\r
6 var X_Type_isArray =\r
7                 new Function( 'v',\r
8                         X_UA[ 'IE' ] < 5.5 || X_UA[ 'NetFront' ] < 4 ? // netfront3.4 は html に  instanceof をすると error になる\r
9                                 'return v&&v.push===Array.prototype.push' : // win ie5-, MacIE5.2\r
10                         X_UA[ 'IE' ] ?\r
11                                 'return v&&Object.prototype.toString.call(v)==="[object Array]"' :\r
12                                 'return v instanceof Array'\r
13                 ),\r
14 \r
15         /**\r
16          * HTMLElement か?判定する。ちなみに return v instanceof Element は ie8 でエラー。\r
17          * @function\r
18          * @alias X.Type.isHTMLElement\r
19          */\r
20         X_Type_isHTMLElement =\r
21                 new Function( 'v',\r
22                         ( X_UA[ 'IE4' ] || X_UA[ 'MacIE' ] ) ?\r
23                                 'return v&&v.tagName&&v.insertAdjacentHTML&&!0' : // ie4 or MacIE5.23, v.all <- error\r
24                         X_UA[ 'NetFront' ] < 4 ?\r
25                                 'return v&&v.nodeType===1' : // instanceof not a function. netfront3.4 は html に  instanceof をすると error になる\r
26                         window[ 'HTMLElement' ] ?\r
27                                 'return v instanceof HTMLElement' :\r
28                                 'return v&&v.appendChild&&v.nodeType===1'\r
29                 );\r
30 \r
31 \r
32 \r
33 /**\r
34  * <p>ビルトイン型の判定に使用する関数を集めたもの。ブラウザのネイティブな判定関数には不可解な挙動があるので、X.Type を使用するほうがよい。\r
35  * <a href="http://pettanr.sourceforge.jp/test/type.html">http://pettanr.sourceforge.jp/test/type.html</a>\r
36  * @namespace X.Type\r
37  * @alias X.Type\r
38  */\r
39 X[ 'Type' ] = {\r
40         'isObject'      : X_Type_isObject,\r
41         'isFunction'    : X_Type_isFunction,\r
42         'isUnknown'     : X_Type_isUnknown,\r
43         'isArray'       : X_Type_isArray,\r
44         'isBoolean'     : X_Type_isBoolean,\r
45         'isString'      : X_Type_isString,\r
46         'isNumber'      : X_Type_isNumber,\r
47         'isFinite'      : X_Type_isFinite,\r
48         'isNaN'         : X_Type_isNaN,\r
49         'isHTMLElement' : X_Type_isHTMLElement,\r
50         'isImage'       : X_Type_isImage,\r
51         'isNull'        : X_Type_isNull,\r
52         'isUndefined'   : X_Type_isUndefined\r
53 };\r
54 \r
55         /**\r
56          * <p>Object か?判定する。\r
57          * <p>typeof null === 'object' に対策済なので null は Object ではない。\r
58          * <p>new String(), new Number(), new Boolean() も typeof object なので対策\r
59          * @alias X.Type.isObject\r
60          */\r
61         function X_Type_isObject( v ){\r
62                 return v && typeof v === 'object' && v !== v + '' && v !== v + 0 && v !== true; // typeof null === 'object' に対策\r
63         };\r
64         /**\r
65          * Function か?判定する。\r
66          * @alias X.Type.isFunction\r
67          */\r
68         function X_Type_isFunction( v ){\r
69                 return typeof v === 'function';\r
70         };\r
71         /**\r
72          * ie の XHR.open 等ビルトインオブジェクトか?判定する。\r
73          * @alias X.Type.isUnknown\r
74          */\r
75         function X_Type_isUnknown( v ){\r
76                 return typeof v === 'unknown';\r
77         };\r
78 \r
79         /**\r
80          * 真偽値か?判定する。\r
81          * @alias X.Type.isBoolean\r
82          */\r
83         function X_Type_isBoolean( v ){\r
84                 return v === true || v === false;\r
85         };\r
86         /**\r
87          * 文字列か?判定する。\r
88          * @alias X.Type.isString\r
89          */\r
90         function X_Type_isString( v ){\r
91                 return /* typeof v === 'string'; */ v === v + ''; // 文字列の加算は IE で遅いかも。\r
92         };\r
93         /**\r
94          * 数値か?判定する。\r
95          * @alias X.Type.isNumber\r
96          */\r
97         function X_Type_isNumber( v ){\r
98                 return /* typeof v === 'number'; */ v + 0 === v || v !== v;\r
99         };\r
100         /**\r
101          * finite か?判定する。isFinite( '123' ) === true に対策済。\r
102          * @alias X.Type.isFinite\r
103          */\r
104         function X_Type_isFinite( v ){\r
105                 return v + 0 === v && isFinite( v );\r
106         };\r
107         /**\r
108          * NaN か?判定する。isNaN( 'NaN' ) === true に対策済。\r
109          * @alias X.Type.isNaN\r
110          */\r
111         function X_Type_isNaN( v ){\r
112                 return v !== v;\r
113         };\r
114 \r
115         \r
116         /**\r
117          * new Image した場合に HTMLImageElement が作られるブラウザと,そうでないブラウザ(IE8-)がある\r
118          * @alias X.Type.isImage\r
119          */     \r
120         function X_Type_isImage( v ){\r
121                 if( v && v.constructor === window.Image ) return true;\r
122                 if( v && window.HTMLImageElement && v.constructor === window.HTMLImageElement ) return true; // ie6- は constructor が undef、HTMLImageElement が undef なので、HTMLElement の存在確認が必要\r
123                 if( X_UA[ 'WebKit' ] < 525.13 ){ // Safari3-\r
124                         if( v && v.src !== undefined && v.onload !== undefined && X_Type_isNumber( v.height ) && X_Type_isNumber( v.width ) && X_Type_isBoolean( v.complete ) ){\r
125                                 return true;\r
126                         };\r
127                 };\r
128                 return false;\r
129         };\r
130         /*\r
131         isElementCollection : function(v) {\r
132                 return (Object.prototype.toString.call(v) === "[object HTMLCollection]");\r
133         },\r
134         */\r
135         /**\r
136          * Null か?判定する。\r
137          * @alias X.Type.isNull\r
138          */\r
139         function X_Type_isNull( v ){\r
140                 return v === null;\r
141         };\r
142         /**\r
143          * undefined か?判定する。\r
144          * @alias X.Type.isUndefined\r
145          */\r
146         function X_Type_isUndefined( v ){\r
147                 return v === undefined;\r
148         };\r
149 \r
150 console.log( 'X.Core.Type' );\r