Commit f6021364 authored by Rick Waldron's avatar Rick Waldron Committed by timmywil

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
parent 9ecdb247
...@@ -63,8 +63,6 @@ if ( "getBoundingClientRect" in document.documentElement ) { ...@@ -63,8 +63,6 @@ if ( "getBoundingClientRect" in document.documentElement ) {
return jQuery.offset.bodyOffset( elem ); return jQuery.offset.bodyOffset( elem );
} }
jQuery.offset.initialize();
var computedStyle, var computedStyle,
offsetParent = elem.offsetParent, offsetParent = elem.offsetParent,
prevOffsetParent = elem, prevOffsetParent = elem,
...@@ -120,46 +118,22 @@ if ( "getBoundingClientRect" in document.documentElement ) { ...@@ -120,46 +118,22 @@ if ( "getBoundingClientRect" in document.documentElement ) {
}; };
} }
jQuery.offset = { 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.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
container.innerHTML = html;
body.insertBefore( container, body.firstChild );
innerDiv = container.firstChild;
checkDiv = innerDiv.firstChild;
td = innerDiv.nextSibling.firstChild.firstChild;
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"; jQuery.each(
innerDiv.style.position = "relative"; ( "doesAddBorderForTableAndCells doesNotAddBorder " +
"doesNotIncludeMarginInBodyOffset subtractsBorderForOverflowNotVisible " +
"supportsFixedPosition" ).split(" "), function( i, prop ) {
this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5); jQuery.offset[ prop ] = jQuery.support[ prop ];
});
this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
body.removeChild( container ); jQuery.extend( jQuery.offset, {
jQuery.offset.initialize = jQuery.noop;
},
bodyOffset: function( body ) { bodyOffset: function( body ) {
var top = body.offsetTop, var top = body.offsetTop,
left = body.offsetLeft; left = body.offsetLeft;
jQuery.offset.initialize();
if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) { if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
top += parseFloat( jQuery.css(body, "marginTop") ) || 0; top += parseFloat( jQuery.css(body, "marginTop") ) || 0;
left += parseFloat( jQuery.css(body, "marginLeft") ) || 0; left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
...@@ -210,10 +184,11 @@ jQuery.offset = { ...@@ -210,10 +184,11 @@ jQuery.offset = {
curElem.css( props ); curElem.css( props );
} }
} }
}; });
jQuery.fn.extend({ jQuery.fn.extend({
position: function() { position: function() {
if ( !this[0] ) { if ( !this[0] ) {
return null; return null;
......
...@@ -20,7 +20,8 @@ jQuery.support = (function() { ...@@ -20,7 +20,8 @@ jQuery.support = (function() {
events, events,
eventName, eventName,
i, i,
isSupported; isSupported,
offsetSupport;
// Preliminary tests // Preliminary tests
div.setAttribute("className", "t"); div.setAttribute("className", "t");
...@@ -249,6 +250,49 @@ jQuery.support = (function() { ...@@ -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 // Null connected elements to avoid leaks in IE
testElement = fragment = select = opt = body = marginDiv = div = input = null; testElement = fragment = select = opt = body = marginDiv = div = input = null;
......
...@@ -267,8 +267,6 @@ testoffset("static", function( jQuery ) { ...@@ -267,8 +267,6 @@ testoffset("static", function( jQuery ) {
testoffset("fixed", function( jQuery ) { testoffset("fixed", function( jQuery ) {
expect(30); expect(30);
jQuery.offset.initialize();
var tests = [ var tests = [
{ id: "#fixed-1", top: 1001, left: 1001 }, { id: "#fixed-1", top: 1001, left: 1001 },
{ id: "#fixed-2", top: 1021, left: 1021 } { id: "#fixed-2", top: 1021, left: 1021 }
...@@ -403,8 +401,8 @@ testoffset("scroll", function( jQuery, win ) { ...@@ -403,8 +401,8 @@ testoffset("scroll", function( jQuery, win ) {
testoffset("body", function( jQuery ) { testoffset("body", function( jQuery ) {
expect(2); expect(2);
equals( jQuery("body").offset().top, 1, "jQuery('#body').offset().top" ); equals( jQuery("body").offset().top, 0, "jQuery('#body').offset().top" );
equals( jQuery("body").offset().left, 1, "jQuery('#body').offset().left" ); equals( jQuery("body").offset().left, 0, "jQuery('#body').offset().left" );
}); });
test("Chaining offset(coords) returns jQuery object", function() { test("Chaining offset(coords) returns jQuery object", function() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment