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

Changeset 6562

Show
Ignore:
Timestamp:
04/24/07 06:06:44 (1 year ago)
Author:
sam
Message:

prototype: Add Element#firstDescendant to retrieve the first non-text child node of an element. Optimize DOM navigation methods (Element#up, Element#down, Element#previous, Element#next) for no-argument calls. Closes #7848.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • spinoffs/prototype/trunk/CHANGELOG

    r6561 r6562  
    11*SVN* 
     2 
     3* Optimize DOM navigation methods (Element#up, Element#down, Element#previous, Element#next) for no-argument calls.  Closes #7848.  [haraldmartin, sam] 
     4 
     5* Add Element#firstDescendant to retrieve the first non-text child node of an element.  [sam] 
    26 
    37* Element.addMethods should add methods to Element as well as Element.Methods.  Closes #7888.  [Andrew Dupont] 
  • spinoffs/prototype/trunk/src/dom.js

    r6561 r6562  
    153153  }, 
    154154   
     155  firstDescendant: function(element) { 
     156    element = $(element).firstChild; 
     157    while (element && element.nodeType != 1) element = element.nextSibling; 
     158    return $(element); 
     159  }, 
     160   
    155161  immediateDescendants: function(element) { 
    156162    if (!(element = $(element).firstChild)) return []; 
     
    180186   
    181187  up: function(element, expression, index) { 
    182     var ancestors = $(element).ancestors(); 
     188    element = $(element); 
     189    if (arguments.length == 1) return $(element.parentNode); 
     190    var ancestors = element.ancestors(); 
    183191    return expression ? Selector.findElement(ancestors, expression, index) : 
    184192      ancestors[index || 0]; 
     
    186194   
    187195  down: function(element, expression, index) { 
    188     var descendants = $(element).descendants(); 
     196    element = $(element); 
     197    if (arguments.length == 1) return element.firstDescendant(); 
     198    var descendants = element.descendants(); 
    189199    return expression ? Selector.findElement(descendants, expression, index) : 
    190200      descendants[index || 0]; 
     
    192202 
    193203  previous: function(element, expression, index) { 
    194     var previousSiblings = $(element).previousSiblings(); 
     204    element = $(element); 
     205    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); 
     206    var previousSiblings = element.previousSiblings(); 
    195207    return expression ? Selector.findElement(previousSiblings, expression, index) : 
    196208      previousSiblings[index || 0]; 
     
    198210   
    199211  next: function(element, expression, index) { 
    200     var nextSiblings = $(element).nextSiblings(); 
     212    element = $(element); 
     213    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); 
     214    var nextSiblings = element.nextSiblings(); 
    201215    return expression ? Selector.findElement(nextSiblings, expression, index) : 
    202216      nextSiblings[index || 0]; 
  • spinoffs/prototype/trunk/test/unit/dom.html

    r6561 r6562  
    480480    }}, 
    481481     
     482    testElementFirstDescendant: function() {with(this) { 
     483      assertElementMatches($('navigation_test').firstDescendant(), 'li.first'); 
     484      assertNull($('navigation_test_next_sibling').firstDescendant()); 
     485    }}, 
     486     
    482487    testElementImmediateDescendants: function() {with(this) { 
    483488      assertElementsMatch($('navigation_test').immediateDescendants(),