Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 5102

Show
Ignore:
Timestamp:
09/13/06 19:31:42 (4 years ago)
Author:
sam
Message:

prototype: Performance improvements for document.getElementsByClassName, including querying with XPath in supported browsers.

Files:

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 
    15* Make Form.getElements() return elements in the correct order, fix broken Form.serialize return, fixes #4249, #6172 [lars@pinds.com, Thomas Fuchs, john] 
    26 
  • spinoffs/prototype/src/dom.js

    r5048 r5102  
    1010} 
    1111 
     12if (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 
    1223document.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    } 
    1737    return elements; 
    18   }); 
     38  } 
    1939} 
    2040 
  • spinoffs/prototype/src/prototype.js

    r4880 r5102  
    33var Prototype = { 
    44  Version: '<%= PROTOTYPE_VERSION %>', 
     5  BrowserFeatures: { 
     6    XPath: !!document.evaluate 
     7  }, 
     8   
    59  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 
    6    
    710  emptyFunction: function() {}, 
    8   K: function(x) {return x
     11  K: function(x) { return x
    912} 
    1013 
  • spinoffs/prototype/test/unit/dom.html

    r5092 r5102  
    6767  <div id="nav_test_first_sibling"></div> 
    6868  <div></div> 
    69   <p class="test"></p> 
     69  <p id="nav_test_p" class="test"></p> 
    7070  <span id="nav_test_prev_sibling"></span> 
    7171   
     
    8888</div> 
    8989 
     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 
    9099<!-- Tests follow --> 
    91100<script type="text/javascript" language="javascript" charset="utf-8"> 
     
    106115      assertIdentical(elt, $(elt)); 
    107116      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')); 
    108124    }}, 
    109125