1 /* --------------------------------------
5 document.getElementById ?
7 return new X.Dom.Node( document.getElementById( id ) );
11 return new X.Dom.Node( document.all[ id ] );
15 /* --------------------------------------
18 Node.prototype.getByTag =
19 document.getElementsByTagName ?
21 var parent = this.parent, elm, tags;
22 if( !parent || this._xnodeType !== -1 ) return;
23 if( !( elm = this._rawNode ) ) return;
24 return new X.Dom.NodeList( document.getElementsByTagName( tag ) );
28 var parent = this.parent, elm, tags;
29 if( !parent || this._xnodeType !== -1 ) return;
30 if( !( elm = this._ie4getRawNode() ) ) return;
31 Node.root._ie4reserved === true && Node.root._ie4startUpdate();
32 return new X.Dom.NodeList( elm.all.tags( tag ) );
36 /* --------------------------------------
39 Node.prototype.getByClass =
40 document.getElementsByClassName ?
41 (function( className ){
42 var parent = this.parent, elm;
44 if( !( elm = this._rawNode ) || elm.nodeType !== 1 ) return;
45 return new X.Dom.NodeList( elm.getElementsByClassName( className ) );
47 document.getElementsByTagName ?
48 (function( className ){
49 var parent = this.parent,
50 live = parent.getElementsByTagName( '*' ),
54 className = className.split( ' ' );
55 for( i = live.length; i; ){
56 nodes[ --i ] = live[ i ];
58 for( i = nodes.length; i; ){
60 ( node.nodeType !== 1 || !node.className || !node.className.length || !test( node.className.split( ' ' ), className ) ) && nodes.splice( i, 1 );
62 return new X.Dom.NodeList( nodes );
65 (function( parent, className ){
66 var live = parent.all,
70 for( i = live.length; i; ){
71 nodes[ --i ] = live[ i ];
73 for( i = nodes.length; i; ){
75 ( !node.className || !node.className.length || !test( node.className.split( ' ' ), className ) ) && nodes.splice( i, 1 );
77 return new X.Dom.NodeList( nodes );
81 X.Dom.find = Node.prototype.find = function( v ){
82 var root = this.cnstructor === Node ? this : Node.root,
83 selectors = X.Dom.Query._parse( v ),
84 l, i, nodes, _nodes, selector,
85 name, key, operator, value,
88 if( !selectors ) return;
94 selector = selectors[ i ];
95 if( 2 <= selector.length ){
96 operator = selector[ 2 ];
97 value = selector[ 3 ];
98 name = key = selector[ 1 ];
99 selector = selector[ 0 ];
103 nodes = [ X.Dom.getById( name ) ];
105 case 5 : // . classname
107 for( j = 0, m = nodes.length; j < m; ++j ){
108 _nodes = _nodes.concat( nodes[ j ].getByClass( name ) );
112 case 6 : // :focus, :disabled ...
119 case 'only-of-type' :
127 case 'first-letter' :
138 case 8 : // . tagname
140 for( j = 0, m = nodes.length ; j < m; ++j ){
141 _nodes = _nodes.concat( nodes[ j ].getByTag( name ) );
147 return new X.Dom.NodeList( nodes );
154 X.Dom.Query._parse = function( query ){
155 var HASH_SELECTOR = {
168 var OPERATORS = { "!=": 2, "~=": 3, "^=": 4, "$=": 5, "*=": 6, "|=": 7 };
169 var ALPHABET = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-0123456789\\';
178 chr, index, start, name, key, value, operator, nameChr, name1st, escape;
180 chr = query.charAt( i );
181 index = ALPHABET.indexOf( chr );
182 nameChr = index !== -1;
183 name1st = nameChr && index < 52;
189 ( ( selector = 8 ) && ( phase = 2 ) && ( start = i ) ) :
190 ( index = HASH_SELECTOR.indexOf( chr ) ) === 7 ? // [
191 ( ( selector = 7 ) && ( phase = 3 ) ) :
193 ( ( selector = index ) && ( phase = index < 4 ? 9 : 1 ) ) :
199 ( ( start = i ) && ( phase = 2 ) ) :
204 !( escape && ( selector === 4 || selector === 5 ) && ( chr === ':' || chr === '.' ) ) // id or class の場合 : . を直前にエスケープした場合に限り使える
205 && ( name = query.substring( start, i ) ) && ( phase = 9 );
207 case 3 : // start attr filter
209 ( ( phase = 4 ) && ( start = i ) ) :
212 case 4 : // attr filter key
214 ( ( operator = 1 ) && ( phase = 5 ) && ( key = query.substring( start, i ) ) && ( start = i ) ) :
215 ( index = OPERATORS[ query.substr( i, 2 ) ] ) ?
216 ( ( operator = index ) && ( phase = 5 ) && ( key = query.substring( start, i ) ) && ( start = i ) && ++i ) :
220 case 5 : // attr filter value
222 ( ( phase = 9 ) && ( value = query.substring( start, i ) ) ) :
228 //alert( chr + ' ' + phase + ' ' + selector + ' ' + name + ' ' + name1st )
230 if( last < 4 && selector < 4 ){
232 result[ result.length - 1 ] = selector; // override
237 } else { // 前回今回とも子孫セレクタの場合、保存しない
238 result[ result.length ] =
242 [ selector, key, operator, value ] :
243 [ selector, name.split( '\\' ).join( '' ) ];
249 if( phase === 99 ) return;
251 escape = chr === '\\' && !escape;