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

Ticket #11142: elementgetdimensions_disnone_anc_performance.diff

File elementgetdimensions_disnone_anc_performance.diff, 7.0 kB (added by staaky, 2 years ago)
  • C:/svn/prototype/src/dom.js

    old new  
    172172    return result + '>'; 
    173173  }, 
    174174   
    175   recursivelyCollect: function(element, property) { 
     175  recursivelyCollect: function(element, property, iterator) { 
    176176    element = $(element); 
    177     var elements = []
     177    var elements = [], iterator = iterator || function(){ return true; }
    178178    while (element = element[property]) 
    179       if (element.nodeType == 1
     179      if (element.nodeType == 1 && iterator(element)
    180180        elements.push(Element.extend(element)); 
    181181    return elements; 
    182182  }, 
    183    
    184   ancestors: function(element) { 
    185     return $(element).recursivelyCollect('parentNode'); 
     183 
     184  ancestors: function(element, iterator) { 
     185    return $(element).recursivelyCollect('parentNode', iterator); 
    186186  }, 
    187    
     187 
    188188  descendants: function(element) { 
    189189    return $(element).select("*"); 
    190190  }, 
    191    
     191 
    192192  firstDescendant: function(element) { 
    193193    element = $(element).firstChild; 
    194194    while (element && element.nodeType != 1) element = element.nextSibling; 
     
    194194    while (element && element.nodeType != 1) element = element.nextSibling; 
    195195    return $(element); 
    196196  }, 
    197    
     197 
    198198  immediateDescendants: function(element) { 
    199199    if (!(element = $(element).firstChild)) return []; 
    200200    while (element && element.nodeType != 1) element = element.nextSibling; 
     
    202202    return []; 
    203203  }, 
    204204 
    205   previousSiblings: function(element) { 
    206     return $(element).recursivelyCollect('previousSibling'); 
     205  previousSiblings: function(element, iterator) { 
     206    return $(element).recursivelyCollect('previousSibling', iterator); 
    207207  }, 
    208    
    209   nextSiblings: function(element) { 
    210     return $(element).recursivelyCollect('nextSibling'); 
     208 
     209  nextSiblings: function(element, iterator) { 
     210    return $(element).recursivelyCollect('nextSibling', iterator); 
    211211  }, 
    212212   
    213213  siblings: function(element) { 
     
    431431      (value < 0.00001) ? 0 : value; 
    432432    return element; 
    433433  }, 
    434    
     434 
    435435  getDimensions: function(element) { 
    436436    element = $(element); 
    437     var display = $(element).getStyle('display'); 
    438     if (display != 'none' && display != null) // Safari bug 
    439       return {width: element.offsetWidth, height: element.offsetHeight}; 
    440      
    441     // All *Width and *Height properties give 0 on elements with display none, 
    442     // so enable the element temporarily 
    443     var els = element.style; 
    444     var originalVisibility = els.visibility; 
    445     var originalPosition = els.position; 
    446     var originalDisplay = els.display; 
    447     els.visibility = 'hidden'; 
    448     els.position = 'absolute'; 
    449     els.display = 'block'; 
    450     var originalWidth = element.clientWidth; 
    451     var originalHeight = element.clientHeight; 
    452     els.display = originalDisplay; 
    453     els.position = originalPosition; 
    454     els.visibility = originalVisibility; 
    455     return {width: originalWidth, height: originalHeight};     
     437    var dimensions = {width: element.clientWidth, height: element.clientHeight}; 
     438 
     439    if ((dimensions.width || dimensions.height) == 0) { 
     440      // All *Width and *Height properties give 0 on elements with display none, 
     441      // or when ancestors have display none, so enable those temporarily 
     442      var restore = element.ancestors(function(element) { return !element.visible() }), 
     443      styles = []; 
     444      restore.push(element); 
     445 
     446      restore.each(function(r) { 
     447        styles.push({ 
     448          display: r.getStyle('display'), 
     449          position: r.getStyle('position'), 
     450          visibility: r.getStyle('visibility') 
     451        }); 
     452        r.setStyle({display: 'block', position: 'absolute', visibility: 'visible'}); 
     453      }); 
     454 
     455      dimensions = {width: element.clientWidth, height: element.clientHeight}; 
     456      restore.each(function(r, index) { 
     457        r.setStyle(styles[index]); 
     458      }); 
     459    } 
     460    return dimensions; 
    456461  }, 
    457462   
    458463  makePositioned: function(element) { 
  • C:/svn/prototype/test/unit/dom.html

    old new  
    8383        width: 20em; 
    8484    } 
    8585 
     86    .getDimensionsBox { 
     87      float: left; 
     88      clear: both; 
     89      width: 200px; 
     90      height: 200px; 
     91      background: #1d8bcb; 
     92    } 
     93    .getDimensionsBox div { float: left; } 
     94    .getDimensionsBox .deep { height: 150px; width: 150px; background: #21bacc; } 
     95    .getDimensionsBox .deeper { height: 130px; width: 130px; background: #94dee6; } 
     96    .getDimensionsBox .deepest { height: 100px; width: 100px; background: #cbeff3; } 
     97 
    8698    #notInlineAbsoluted { position: absolute; } 
    8799     
    88100    #elementToViewportDimensions { 
     
    388400 
    389401<div id='elementToViewportDimensions' style='display: none'></div> 
    390402 
     403<div class='getDimensionsBox' id='getDimensionsBox1'> 
     404  <div class='deep'> 
     405    <div class='deeper'> 
     406      <div class='deepest' style='display:none'></div> 
     407    </div> 
     408  </div> 
     409</div> 
     410 
     411<div class='getDimensionsBox' id='getDimensionsBox2'> 
     412  <div class='deep'> 
     413    <div class='deeper' style='display:none'> 
     414      <div class='deepest'></div> 
     415    </div> 
     416  </div> 
     417</div> 
     418 
     419<div class='getDimensionsBox' id='getDimensionsBox3'> 
     420  <div class='deep' style='display:none'> 
     421    <div class='deeper' style='display:none'> 
     422      <div class='deepest'></div> 
     423    </div> 
     424  </div> 
     425</div> 
     426 
     427<div class='getDimensionsBox' id='getDimensionsBox4' style='display:none'> 
     428  <div class='deep' style='display:none'> 
     429    <div class='deeper' style='display:none'> 
     430      <div class='deepest'></div> 
     431    </div> 
     432  </div> 
     433</div> 
     434 
    391435<!-- Tests follow --> 
    392436<script type="text/javascript" language="javascript" charset="utf-8"> 
    393437// <![CDATA[ 
     
    14951539      $('dimensions-table').hide(); 
    14961540      assertIdentical(100, $('dimensions-table').getDimensions().height); 
    14971541      assertIdentical(200, $('dimensions-table').getDimensions().width); 
     1542 
     1543      // display:none ancestors 
     1544      $R(1, 4).each(function(num) { 
     1545        assertIdentical(200, $('getDimensionsBox'+num).getDimensions().height); 
     1546        assertIdentical(200, $('getDimensionsBox'+num).getDimensions().width); 
     1547        assertIdentical(150, $('getDimensionsBox'+num).down('.deep').getDimensions().height); 
     1548        assertIdentical(150, $('getDimensionsBox'+num).down('.deep').getDimensions().width); 
     1549        assertIdentical(130, $('getDimensionsBox'+num).down('.deeper').getDimensions().height); 
     1550        assertIdentical(130, $('getDimensionsBox'+num).down('.deeper').getDimensions().width); 
     1551        assertIdentical(100, $('getDimensionsBox'+num).down('.deepest').getDimensions().height); 
     1552        assertIdentical(100, $('getDimensionsBox'+num).down('.deepest').getDimensions().width); 
     1553      }); 
    14981554    }}, 
    14991555         
    15001556    testDOMAttributesHavePrecedenceOverExtendedElementMethods: function() {with(this) {