OSDN Git Service

Vesion 0.6.4
[pettanr/clientJs.git] / 0.6.x / js / core / 11_XDom.js
1 /**\r
2  * use X.Callback\r
3  */\r
4 var X = X || {};\r
5 \r
6 X.Dom = {\r
7         getElementById :\r
8                 document.getElementById ?\r
9                         (function( id ){\r
10                                 return document.getElementById( id );\r
11                         }) :\r
12                 document.all ?\r
13                         (function( id ){\r
14                                 return document.all[ id ];\r
15                         }) :\r
16                         (function(){}),\r
17         getElementsByTagName :\r
18                 document.getElementsByTagName ?\r
19                         (function( parent, tagName ){\r
20                                 return parent.getElementsByTagName( tagName.toUpperCase() );\r
21                         }) :\r
22                 document.all ?\r
23                         (function( parent, tagName ){\r
24                                 return parent.all.tags( tagName.toUpperCase() );\r
25                         }) :\r
26                         (function(){}),\r
27         getElementsByClassName :\r
28                 document.getElementsByClassName ?\r
29                         (function( parent, className ){\r
30                                 return parent.getElementsByClassName( className );\r
31                         }) :\r
32                 document.getElementsByTagName ?\r
33                         (function( parent, className ){\r
34                                 var self  = X.Dom,\r
35                                         live  = parent.getElementsByTagName( '*' ),\r
36                                         nodes = [],\r
37                     node, i;\r
38                 for( i = live.length; i; ){\r
39                         nodes[ --i ] = live[ i ];\r
40                 };\r
41                                 for( i = nodes.length; i; ){\r
42                                         node = nodes[ --i ];\r
43                                         ( node.nodeType !== 1 || !node.className || !node.className.length || self.hasClass( node, className ) === false ) && nodes.splice( i, 1 );\r
44                                 };\r
45                                 return nodes;\r
46                         }) :\r
47                 document.all ?\r
48                         (function( parent, className ){\r
49                                 var self  = X.Dom,\r
50                                         live  = parent.all,\r
51                                         nodes = [],\r
52                     node, i;\r
53                 for( i = live.length; i; ){\r
54                         nodes[ --i ] = live[ i ];\r
55                 };\r
56                                 for( i = nodes.length; i; ){\r
57                                         node = nodes[ --i ];\r
58                                         ( !node.className || !node.className.length || self.hasClass( node, className ) === false ) && nodes.splice( i, 1 );\r
59                                 };\r
60                                 return nodes;\r
61                         }) :\r
62                         (function(){}),\r
63         hasClass : function( elm, className ){\r
64                 var cnames  = ( elm.className || '' ).split( ' ' ),\r
65                         _cnames = className.split( ' ' ),\r
66                         cname,\r
67                         i = _cnames.length;\r
68                 for( ; i; ){\r
69                         cname = _cnames[ --i ];\r
70                         if( cname === '' ) continue;\r
71                         if( cnames.indexOf( cname ) === -1 ) return false;\r
72                 };\r
73                 return true;\r
74         },\r
75         appendChild :\r
76                 document.appendChild ?\r
77                         (function( target, elm ){\r
78                                 return target.appendChild( elm );\r
79                         }) :\r
80                 document.all ?\r
81                         (function( target, elm ){\r
82                                 return target.insertAdjacentHTML( 'BeforeEnd', elm.outerHTML || elm ); // elm の場合と string の場合がある\r
83                         }) :\r
84                         (function(){}),\r
85         removeChild :\r
86                 document.removeChild ?\r
87                         (function( parent, elm ){\r
88                                 return target.removeChild( elm );\r
89                         }) :\r
90                 document.all ?\r
91                         (function( parent, elm ){\r
92                                 var children = X.Dom.getChildNodes( parent ),\r
93                                         l        = children.length,\r
94                                         html     = [],\r
95                                         i        = 0,\r
96                                         child, update;\r
97                                 for( ; i < l; ++i ){\r
98                                         child = children[ i ];\r
99                                         if( child !== elm ){\r
100                                                 html[ html.length ] = child.outerHTML || child;\r
101                                         } else {\r
102                                                 update = true;\r
103                                         };\r
104                                 };\r
105                                 if( !update ) return;\r
106                                 parent.innerHTML = html.join( '' );\r
107                         }) :\r
108                         (function(){}),\r
109         insertBefore :\r
110                 document.insertBefore ?\r
111                         (function( parent, elm, elmAfter ){\r
112                                 return parent.insertBefore( elm, elmAfter );\r
113                         }) :\r
114                 document.all ?\r
115                         (function( parent, elm, elmAfter ){\r
116                                 return elmAfter.insertAdjacentHTML( 'BeforeBegin', elm.outerHTML );\r
117                         }) :\r
118                         (function(){})\r
119 };\r
120 \r
121 if( X.UA.IE && X.UA.IE < 5 ){\r
122         /*\r
123          * ie4 に TextNode は存在しない。 Element.children にテキストノードは無視される。\r
124          * そこでテキストノードを判定して控える操作が必要になる。\r
125          */\r
126         X.Dom.getChildNodes = function( elm ){\r
127                 var html     = elm.innerHTML,\r
128                         children = elm.children,\r
129                         l        = children.length - 1,\r
130                         _        = '',\r
131                         cr       = X.Dom.getCRChars( html ),\r
132                         i, j, child, outer, index, parts, ret, text;\r
133                 if( l < 0 ){\r
134                         if( html.length ) return [ html ]; // new X.Dom.TextNode( html );\r
135                         return [];\r
136                 };\r
137                 ret = [];\r
138                 j   = -1;\r
139                 html = html.split( cr ).join( _ );\r
140                 for( i = 0; i <= l; ++i ){\r
141                         child = children[ i ];\r
142                         outer = child.outerHTML.split( cr ).join( _ );\r
143                         index = html.indexOf( outer );\r
144                         if( index === -1 ){\r
145                                 alert( 'X.Dom.getChildNodes\n' + outer + '\n' + html.substr( 0, 100 ) );\r
146                                 continue;\r
147                         };\r
148                         if( 0 < index ){\r
149                                 ret[ ++j ] = html.substr( 0, index ); // new X.Dom.TextNode( html );\r
150                         };\r
151                         ret[ ++j ] = child;\r
152                         html = html.substr( index + outer.length );\r
153                         if( i === l && html.length ){\r
154                                 ret[ ++j ] = html; // new X.Dom.TextNode( html );\r
155                                 break;\r
156                         };\r
157                 };\r
158                 return ret;\r
159         };\r
160         X.Dom.getCRChars = function( src ){\r
161                 return 0 <= src.indexOf( '\r\n' ) ? '\r\n' :\r
162                         0 <= src.indexOf( '\n' ) ? '\n' :\r
163                         0 <= src.indexOf( '\r' ) ? '\r' : '\n';\r
164         };\r
165 };