Make sure that .offset() doesn't fail against disconnected DOM nodes. Fixes #4996.
authorJohn Resig <jeresig@gmail.com>
Tue, 28 Sep 2010 14:55:48 +0000 (10:55 -0400)
committerJohn Resig <jeresig@gmail.com>
Tue, 28 Sep 2010 14:55:48 +0000 (10:55 -0400)
src/offset.js
test/unit/offset.js

index 650cc08..39763ee 100644 (file)
@@ -5,7 +5,7 @@ var rtable = /^t(?:able|d|h)$/i,
 
 if ( "getBoundingClientRect" in document.documentElement ) {
        jQuery.fn.offset = function( options ) {
-               var elem = this[0];
+               var elem = this[0], box;
 
                if ( options ) { 
                        return this.each(function( i ) {
@@ -21,8 +21,14 @@ if ( "getBoundingClientRect" in document.documentElement ) {
                        return jQuery.offset.bodyOffset( elem );
                }
 
-               var box = elem.getBoundingClientRect(),
-                       doc = elem.ownerDocument,
+               try {
+                       box = elem.getBoundingClientRect();
+
+               } catch(e) {
+                       box = { top: elem.offsetTop, left: elem.offsetLeft };
+               }
+
+               var doc = elem.ownerDocument,
                        body = doc.body,
                        docElem = doc.documentElement,
                        win = getWindow(doc),
index ed3d962..8797531 100644 (file)
@@ -1,5 +1,14 @@
 module("offset");
 
+test("disconnected node", function() {
+       expect(2);
+
+       var result = jQuery( document.createElement("div") ).offset();
+
+       equals( result.top, 0, "Check top" );
+       equals( result.left, 0, "Check left" );
+});
+
 var supportsScroll = false;
 
 testoffset("absolute"/* in iframe */, function($, iframe) {