1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
Selectors.Cache = {
getParam: function(items, separator, context, tag, id, classNames, attributes, pseudos){
var tmp = '';
if (separator){
tmp += 'found = []; j = elements.length;';
switch (separator){
case ' ':
tmp += 'for (i = 0; i < j; i++) found.extend(elements[i].getElementsByTagName("'+tag+'"));';
break;
case '>':
tmp += 'for (i = 0; i < j; i++){'
+'var children = elements[i].childNodes;'
+'for (var k = 0, l = children.length; k < l; k++){'
+' if (Selectors.Filter.hasTag(children[k], "'+tag+'")) found.push(children[k]);'
+'}'
+'}';
break;
default:
throw new Exception('not jet implemented');
tmp += '';
var all = (separator == '~');
for (i = 0; i < j; i++){
var next = items[i].nextSibling;
while (next){
if (Selectors.Filter.hasTag(next, tag)){
found.push(next);
if (!all) break;
}
next = next.nextSibling;
}
}
}
tmp += (id) ? 'elements = Elements.filterById(found, id, true);' : 'elements = found;';
} else {
if (id){
console.log(tag);
tmp += 'var el = context.getElementById("'+id+'");';
tmp += 'if (!el || (("'+tag+'" != "*") && (el.tagName.toLowerCase() != "'+tag+'"))) return false;';
tmp += 'elements = [el];';
} else {
tmp += 'elements = $A(context.getElementsByTagName("'+tag+'"));';
}
}
for (i = classNames.length; i--; i) tmp += 'elements = Elements.filterByClass(elements, "'+classNames[i]+'", true);';
for (i = attributes.length; i--; i){
var bits = attributes[i];
tmp += 'elements = Elements.filterByAttribute(elements, "'+bits[0]+'", "'+bits[1]+'","'+bits[2]+'", true);';
}
items.push(tmp);
return items;
},
getItems: function(items, context, nocash){
console.log('getItems');
var fn = new Function('context', 'var elements=[],found,i,j;' + items.join('') + 'return elements;');
console.log(fn.toSource());
var elements = fn(context);
return (nocash) ? elements : new Elements(elements);
},
hasTag: function(el, tag){
return (el.nodeName && el.nodeType == 1 && (tag == '*' || el.tagName.toLowerCase() == tag));
}
};
Selectors.Method = Selectors.Cache;
|