Rewrote .offsetParent() to work against the full jQuery set, added tests. Fixes ...
authorJohn Resig <jeresig@gmail.com>
Sun, 19 Jul 2009 13:04:18 +0000 (13:04 +0000)
committerJohn Resig <jeresig@gmail.com>
Sun, 19 Jul 2009 13:04:18 +0000 (13:04 +0000)
src/offset.js
test/unit/offset.js

index dab0c2b..6e22ce3 100644 (file)
@@ -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;
+               });
        }
 });
 
index b6c50ff..f9747de 100644 (file)
@@ -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
+}