Landing pull request 477. 1.7 jQuery.offset.supportsFixedPosition. Fixes #6809.

More Details:
 - https://github.com/jquery/jquery/pull/477
 - http://bugs.jquery.com/ticket/6809
This commit is contained in:
Rick Waldron
2011-09-19 21:03:41 -04:00
committed by timmywil
parent 9ecdb2472b
commit f60213648c
3 changed files with 57 additions and 40 deletions

View File

@@ -63,8 +63,6 @@ if ( "getBoundingClientRect" in document.documentElement ) {
return jQuery.offset.bodyOffset( elem );
}
jQuery.offset.initialize();
var computedStyle,
offsetParent = elem.offsetParent,
prevOffsetParent = elem,
@@ -120,46 +118,22 @@ if ( "getBoundingClientRect" in document.documentElement ) {
};
}
jQuery.offset = {
initialize: function() {
var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
jQuery.offset = {};
jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
jQuery.each(
( "doesAddBorderForTableAndCells doesNotAddBorder " +
"doesNotIncludeMarginInBodyOffset subtractsBorderForOverflowNotVisible " +
"supportsFixedPosition" ).split(" "), function( i, prop ) {
container.innerHTML = html;
body.insertBefore( container, body.firstChild );
innerDiv = container.firstChild;
checkDiv = innerDiv.firstChild;
td = innerDiv.nextSibling.firstChild.firstChild;
jQuery.offset[ prop ] = jQuery.support[ prop ];
});
this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
checkDiv.style.position = "fixed";
checkDiv.style.top = "20px";
// safari subtracts parent border width here which is 5px
this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
checkDiv.style.position = checkDiv.style.top = "";
innerDiv.style.overflow = "hidden";
innerDiv.style.position = "relative";
this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
body.removeChild( container );
jQuery.offset.initialize = jQuery.noop;
},
jQuery.extend( jQuery.offset, {
bodyOffset: function( body ) {
var top = body.offsetTop,
left = body.offsetLeft;
jQuery.offset.initialize();
if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
top += parseFloat( jQuery.css(body, "marginTop") ) || 0;
left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
@@ -210,10 +184,11 @@ jQuery.offset = {
curElem.css( props );
}
}
};
});
jQuery.fn.extend({
position: function() {
if ( !this[0] ) {
return null;

View File

@@ -20,7 +20,8 @@ jQuery.support = (function() {
events,
eventName,
i,
isSupported;
isSupported,
offsetSupport;
// Preliminary tests
div.setAttribute("className", "t");
@@ -249,6 +250,49 @@ jQuery.support = (function() {
}
}
// Determine fixed-position support early
offsetSupport = (function( body, container ) {
var outer, inner, table, td, supports,
bodyMarginTop = parseFloat( body.style.marginTop ) || 0,
ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;",
style = "style='" + ptlm + "margin:0;border:5px solid #000;padding:0;'",
html = "<div " + style + "><div></div></div>" +
"<table " + style + " cellpadding='0' cellspacing='0'>" +
"<tr><td></td></tr></table>";
container.style.cssText = ptlm + "border:0;visibility:hidden";
container.innerHTML = html;
body.insertBefore( container, body.firstChild );
outer = container.firstChild;
inner = outer.firstChild;
td = outer.nextSibling.firstChild.firstChild;
supports = {
doesNotAddBorder: (inner.offsetTop !== 5),
doesAddBorderForTableAndCells: (td.offsetTop === 5)
}
inner.style.position = "fixed";
inner.style.top = "20px";
// safari subtracts parent border width here which is 5px
supports.supportsFixedPosition = (inner.offsetTop === 20 || inner.offsetTop === 15);
inner.style.position = inner.style.top = "";
outer.style.overflow = "hidden";
outer.style.position = "relative";
supports.subtractsBorderForOverflowNotVisible = (inner.offsetTop === -5);
supports.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
return supports;
})( testElement, div );
jQuery.extend( support, offsetSupport );
// Null connected elements to avoid leaks in IE
testElement = fragment = select = opt = body = marginDiv = div = input = null;