From a3b8ac413f9c55994922c20b39223ab9ae6d1afa Mon Sep 17 00:00:00 2001 From: John Resig Date: Sun, 19 Jul 2009 13:04:18 +0000 Subject: [PATCH 1/1] Rewrote .offsetParent() to work against the full jQuery set, added tests. Fixes #4922. --- src/offset.js | 12 +++++++----- test/unit/offset.js | 27 ++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/offset.js b/src/offset.js index dab0c2b..6e22ce3 100644 --- a/src/offset.js +++ b/src/offset.js @@ -147,11 +147,13 @@ jQuery.fn.extend({ }, offsetParent: function() { - var offsetParent = this[0].offsetParent || document.body; - while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') === 'static') ) { - offsetParent = offsetParent.offsetParent; - } - return jQuery( offsetParent ); + return this.map(function(){ + var offsetParent = this.offsetParent || document.body; + while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') === 'static') ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent; + }); } }); diff --git a/test/unit/offset.js b/test/unit/offset.js index b6c50ff..f9747de 100644 --- a/test/unit/offset.js +++ b/test/unit/offset.js @@ -145,7 +145,32 @@ testoffset("body", function( jQuery ) { equals( jQuery('body').offset().left, 1, "jQuery('#body').offset().left" ); }); +test("offsetParent", function(){ + expect(11); + var body = jQuery("body").offsetParent(); + equals( body.length, 1, "Only one offsetParent found." ); + equals( body[0], document.body, "The body is its own offsetParent." ); + + var header = jQuery("#header").offsetParent(); + equals( header.length, 1, "Only one offsetParent found." ); + equals( header[0], document.body, "The body is the offsetParent." ); + + var div = jQuery("#nothiddendivchild").offsetParent(); + equals( div.length, 1, "Only one offsetParent found." ); + equals( div[0], document.body, "The body is the offsetParent." ); + + jQuery("#nothiddendiv").css("position", "relative"); + + div = jQuery("#nothiddendivchild").offsetParent(); + equals( div.length, 1, "Only one offsetParent found." ); + equals( div[0], jQuery("#nothiddendiv")[0], "The div is the offsetParent." ); + + div = jQuery("body, #nothiddendivchild").offsetParent(); + equals( div.length, 2, "Two offsetParent found." ); + equals( div[0], document.body, "The body is the offsetParent." ); + equals( div[1], jQuery("#nothiddendiv")[0], "The div is the offsetParent." ); +}); function testoffset(name, fn) { @@ -177,4 +202,4 @@ function testoffset(name, fn) { iframe.contentWindow.location = src; return iframe; } -} \ No newline at end of file +} -- 1.7.10.4