Changeset 5102
- Timestamp:
- 09/13/06 19:31:42 (4 years ago)
- Files:
-
- spinoffs/prototype/CHANGELOG (modified) (1 diff)
- spinoffs/prototype/src/dom.js (modified) (1 diff)
- spinoffs/prototype/src/prototype.js (modified) (1 diff)
- spinoffs/prototype/test/unit/dom.html (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
spinoffs/prototype/CHANGELOG
r5093 r5102 1 *SVN* 2 3 * Performance improvements for document.getElementsByClassName, including querying with XPath in supported browsers. [Andrew Dupont] 4 1 5 * Make Form.getElements() return elements in the correct order, fix broken Form.serialize return, fixes #4249, #6172 [lars@pinds.com, Thomas Fuchs, john] 2 6 spinoffs/prototype/src/dom.js
r5048 r5102 10 10 } 11 11 12 if (Prototype.BrowserFeatures.XPath) { 13 document._getElementsByXPath = function(expression, parentElement) { 14 var results = []; 15 var query = document.evaluate(expression, $(parentElement) || document, 16 null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 17 for (var i = 0, len = query.snapshotLength; i < len; i++) 18 results.push(query.snapshotItem(i)); 19 return results; 20 } 21 } 22 12 23 document.getElementsByClassName = function(className, parentElement) { 13 var children = ($(parentElement) || document.body).getElementsByTagName('*'); 14 return $A(children).inject([], function(elements, child) { 15 if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) 16 elements.push(Element.extend(child)); 24 if (Prototype.BrowserFeatures.XPath) { 25 var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]"; 26 return document._getElementsByXPath(q, parentElement); 27 } else { 28 var children = ($(parentElement) || document.body).getElementsByTagName('*'); 29 var elements = [], child; 30 for (var i = 0, len = children.length; i < len; i++) { 31 child = children[i]; 32 if (child.className.length == 0) continue; 33 if (child.className == className || 34 child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) 35 elements.push(Element.extend(child)); 36 } 17 37 return elements; 18 } );38 } 19 39 } 20 40 spinoffs/prototype/src/prototype.js
r4880 r5102 3 3 var Prototype = { 4 4 Version: '<%= PROTOTYPE_VERSION %>', 5 BrowserFeatures: { 6 XPath: !!document.evaluate 7 }, 8 5 9 ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 6 7 10 emptyFunction: function() {}, 8 K: function(x) { return x}11 K: function(x) { return x } 9 12 } 10 13 spinoffs/prototype/test/unit/dom.html
r5092 r5102 67 67 <div id="nav_test_first_sibling"></div> 68 68 <div></div> 69 <p class="test"></p>69 <p id="nav_test_p" class="test"></p> 70 70 <span id="nav_test_prev_sibling"></span> 71 71 … … 88 88 </div> 89 89 90 <div id="class_names"> 91 <p class="A"> 92 <ul class="A B" id="class_names_ul"> 93 <li class="C"></li> 94 <li class="A C"></li> 95 </ul> 96 <div class="B C D"></div> 97 </div> 98 90 99 <!-- Tests follow --> 91 100 <script type="text/javascript" language="javascript" charset="utf-8"> … … 106 115 assertIdentical(elt, $(elt)); 107 116 assertRespondsTo('hide', elt); 117 }}, 118 119 testGetElementsByClassName: function() {with(this) { 120 assertElementsMatch(document.getElementsByClassName('A'), 'p.A', 'ul#class_names_ul.A', 'li.A.C'); 121 assertElementsMatch(document.getElementsByClassName('A', 'class_names_ul'), 'li.A.C'); 122 assertElementsMatch(document.getElementsByClassName('B', 'class_names'), 'ul#class_names_ul.A.B', 'div.B.C.D'); 123 assertElementsMatch(document.getElementsByClassName('B', 'class_names_ul')); 108 124 }}, 109 125