elem.style.position = "relative";
}
- curOffset = curElem.offset();
+ curOffset = curElem.offset() || { top: 0, left: 0 };
curCSSTop = jQuery.css( elem, "top" );
curCSSLeft = jQuery.css( elem, "left" );
calculatePosition = ( position === "absolute" || position === "fixed" ) &&
});
}
- var docElem, win,
+ var docElem, win, rect,
elem = this[ 0 ],
- box = { top: 0, left: 0 },
doc = elem && elem.ownerDocument;
if ( !doc ) {
return;
}
- docElem = doc.documentElement;
+ rect = elem.getBoundingClientRect();
- // Make sure it's not a disconnected DOM node
- if ( !jQuery.contains( docElem, elem ) ) {
- return box;
- }
+ // Make sure element is not hidden (display: none) or disconnected
+ if ( rect.width || rect.height || elem.getClientRects().length ) {
+ win = getWindow( doc );
+ docElem = doc.documentElement;
- box = elem.getBoundingClientRect();
- win = getWindow( doc );
- return {
- top: box.top + win.pageYOffset - docElem.clientTop,
- left: box.left + win.pageXOffset - docElem.clientLeft
- };
+ return {
+ top: rect.top + win.pageYOffset - docElem.clientTop,
+ left: rect.left + win.pageXOffset - docElem.clientLeft
+ };
+ }
},
position: function() {
equal( result.left, 0, "Check left" );
});
-test("disconnected node", function() {
- expect(2);
+test("disconnected element", function() {
+ expect(1);
- var result = jQuery( document.createElement("div") ).offset();
+ var result;
- equal( result.top, 0, "Check top" );
- equal( result.left, 0, "Check left" );
+ try {
+ result = jQuery( document.createElement("div") ).offset();
+ } catch ( e ) {}
+
+ ok( !result, "no position for disconnected element" );
+});
+
+test("hidden (display: none) element", function() {
+ expect(1);
+
+ var result,
+ node = jQuery("<div style='display: none' />").appendTo("#qunit-fixture");
+
+ try {
+ result = node.offset();
+ } catch ( e ) {}
+
+ node.remove();
+
+ ok( !result, "no position for hidden (display: none) element" );
});
testIframe("offset/absolute", "absolute", function($, iframe) {