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 172 172 return result + '>'; 173 173 }, 174 174 175 recursivelyCollect: function(element, property ) {175 recursivelyCollect: function(element, property, iterator) { 176 176 element = $(element); 177 var elements = [] ;177 var elements = [], iterator = iterator || function(){ return true; }; 178 178 while (element = element[property]) 179 if (element.nodeType == 1 )179 if (element.nodeType == 1 && iterator(element)) 180 180 elements.push(Element.extend(element)); 181 181 return elements; 182 182 }, 183 184 ancestors: function(element ) {185 return $(element).recursivelyCollect('parentNode' );183 184 ancestors: function(element, iterator) { 185 return $(element).recursivelyCollect('parentNode', iterator); 186 186 }, 187 187 188 188 descendants: function(element) { 189 189 return $(element).select("*"); 190 190 }, 191 191 192 192 firstDescendant: function(element) { 193 193 element = $(element).firstChild; 194 194 while (element && element.nodeType != 1) element = element.nextSibling; … … 194 194 while (element && element.nodeType != 1) element = element.nextSibling; 195 195 return $(element); 196 196 }, 197 197 198 198 immediateDescendants: function(element) { 199 199 if (!(element = $(element).firstChild)) return []; 200 200 while (element && element.nodeType != 1) element = element.nextSibling; … … 202 202 return []; 203 203 }, 204 204 205 previousSiblings: function(element ) {206 return $(element).recursivelyCollect('previousSibling' );205 previousSiblings: function(element, iterator) { 206 return $(element).recursivelyCollect('previousSibling', iterator); 207 207 }, 208 209 nextSiblings: function(element ) {210 return $(element).recursivelyCollect('nextSibling' );208 209 nextSiblings: function(element, iterator) { 210 return $(element).recursivelyCollect('nextSibling', iterator); 211 211 }, 212 212 213 213 siblings: function(element) { … … 431 431 (value < 0.00001) ? 0 : value; 432 432 return element; 433 433 }, 434 434 435 435 getDimensions: function(element) { 436 436 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; 456 461 }, 457 462 458 463 makePositioned: function(element) { -
C:/svn/prototype/test/unit/dom.html
old new 83 83 width: 20em; 84 84 } 85 85 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 86 98 #notInlineAbsoluted { position: absolute; } 87 99 88 100 #elementToViewportDimensions { … … 388 400 389 401 <div id='elementToViewportDimensions' style='display: none'></div> 390 402 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 391 435 <!-- Tests follow --> 392 436 <script type="text/javascript" language="javascript" charset="utf-8"> 393 437 // <![CDATA[ … … 1495 1539 $('dimensions-table').hide(); 1496 1540 assertIdentical(100, $('dimensions-table').getDimensions().height); 1497 1541 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 }); 1498 1554 }}, 1499 1555 1500 1556 testDOMAttributesHavePrecedenceOverExtendedElementMethods: function() {with(this) {