Changeset 8723
- Timestamp:
- 01/25/08 22:02:12 (8 months ago)
- Files:
-
- spinoffs/prototype/trunk/CHANGELOG (modified) (1 diff)
- spinoffs/prototype/trunk/src/dom.js (modified) (3 diffs)
- spinoffs/prototype/trunk/test/unit/dom.html (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
spinoffs/prototype/trunk/CHANGELOG
r8722 r8723 1 1 *SVN* 2 3 * Ensure positionedOffset properly considers "position: fixed" elements. Also ensures IE reports offsets correctly by triggering hasLayout when a "static" element has a "fixed" element as an offset parent. Closes #10644. [heygrady, kangax, Andrew Dupont] 2 4 3 5 * Roll back the fix for #9609, since it does not work in Opera. Instead, avoid using "valueOf" or "toString" as field names in forms. spinoffs/prototype/trunk/src/dom.js
r8703 r8723 520 520 if (element.tagName == 'BODY') break; 521 521 var p = Element.getStyle(element, 'position'); 522 if (p == 'relative' || p == 'absolute') break;522 if (p !== 'static') break; 523 523 } 524 524 } while (element); … … 713 713 714 714 else if (Prototype.Browser.IE) { 715 $w('positionedOffset getOffsetParent viewportOffset').each(function(method) { 715 // IE doesn't report offsets correctly for static elements, so we change them 716 // to "relative" to get the values, then change them back. 717 Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( 718 function(proceed, element) { 719 element = $(element); 720 var position = element.getStyle('position'); 721 if (position !== 'static') return proceed(element); 722 element.setStyle({ position: 'relative' }); 723 var value = proceed(element); 724 element.setStyle({ position: position }); 725 return value; 726 } 727 ); 728 729 $w('positionedOffset viewportOffset').each(function(method) { 716 730 Element.Methods[method] = Element.Methods[method].wrap( 717 731 function(proceed, element) { 718 732 element = $(element); 719 733 var position = element.getStyle('position'); 720 if (position != 'static') return proceed(element); 734 if (position !== 'static') return proceed(element); 735 // Trigger hasLayout on the offset parent so that IE6 reports 736 // accurate offsetTop and offsetLeft values for position: fixed. 737 var offsetParent = element.getOffsetParent(); 738 if (offsetParent && offsetParent.getStyle('position') === 'fixed') 739 offsetParent.setStyle({ zoom: 1 }); 721 740 element.setStyle({ position: 'relative' }); 722 741 var value = proceed(element); … … 726 745 ); 727 746 }); 728 747 729 748 Element.Methods.getStyle = function(element, style) { 730 749 element = $(element); spinoffs/prototype/trunk/test/unit/dom.html
r8703 r8723 368 368 <div id="absolute_relative_undefined">XYZ</div> 369 369 </div> 370 </div> 370 <div id="absolute_fixed" style="position: fixed; top: 10px; left: 10px"> 371 <span id="absolute_fixed_absolute" style="position: absolute; top: 10px; left: 10px">foo</span> 372 <span id="absolute_fixed_undefined" style="display:block">bar</span> 373 </div></div> 371 374 <div id="notInlineAbsoluted"></div> 372 375 <div id="inlineAbsoluted" style="position: absolute"></div> … … 1092 1095 assert($('great-grand-child').descendantOf('child'), 'great-grand-child < child'); 1093 1096 1094 window.debug = true;1095 1097 assert($('sibling').descendantOf('ancestor'), 'sibling < ancestor'); 1096 1098 assert($('grand-sibling').descendantOf('sibling'), 'grand-sibling < sibling'); … … 1098 1100 1099 1101 assert($('grand-sibling').descendantOf(document.body), 'grand-sibling < body'); 1100 window.debug = false;1101 1102 1102 1103 assert(!$('great-grand-child').descendantOf('great-grand-child'), 'great-grand-child < great-grand-child'); … … 1106 1107 assert(!$('child').descendantOf('not-in-the-family'), 'child < not-in-the-family'); 1107 1108 1108 assert(!$(document.body).descendantOf('great-grand-child')); 1109 assert(!$(document.body).descendantOf('great-grand-child')); 1109 1110 }}, 1110 1111 … … 1605 1606 assertEnumEqual([0,10], 1606 1607 $('absolute_relative_undefined').positionedOffset()); 1608 assertEnumEqual([10,10], 1609 $('absolute_fixed_absolute').positionedOffset()); 1610 1611 var afu = $('absolute_fixed_undefined'); 1612 assertEnumEqual([afu.offsetLeft, afu.offsetTop], 1613 afu.positionedOffset()); 1607 1614 }}, 1608 1615