From 1777899a747647f3fa839eea4b0bb695d3b60f06 Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Mon, 12 Dec 2016 22:32:11 -0800 Subject: [PATCH] Offset: report offset for 0 sized elements Fixes gh-3267 Closes gh-3367 --- src/offset.js | 21 ++++++++------------- test/unit/offset.js | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/offset.js b/src/offset.js index 54442eb45..5baefdb21 100644 --- a/src/offset.js +++ b/src/offset.js @@ -93,6 +93,7 @@ jQuery.fn.extend( { return; } + // Return zeros for disconnected and hidden (display: none) elements (gh-2310) // Support: IE <=11 only // Running getBoundingClientRect on a // disconnected node in IE throws an error @@ -102,20 +103,14 @@ jQuery.fn.extend( { rect = elem.getBoundingClientRect(); - // Make sure element is not hidden (display: none) - if ( rect.width || rect.height ) { - doc = elem.ownerDocument; - win = getWindow( doc ); - docElem = doc.documentElement; + doc = elem.ownerDocument; + win = getWindow( doc ); + docElem = doc.documentElement; - return { - top: rect.top + win.pageYOffset - docElem.clientTop, - left: rect.left + win.pageXOffset - docElem.clientLeft - }; - } - - // Return zeros for disconnected and hidden elements (gh-2310) - return rect; + return { + top: rect.top + win.pageYOffset - docElem.clientTop, + left: rect.left + win.pageXOffset - docElem.clientLeft + }; }, position: function() { diff --git a/test/unit/offset.js b/test/unit/offset.js index c0df5f1ca..5b73ede60 100644 --- a/test/unit/offset.js +++ b/test/unit/offset.js @@ -42,7 +42,7 @@ QUnit.test( "empty set", function( assert ) { } ); QUnit.test( "disconnected element", function( assert ) { - assert.expect( 2 ); + assert.expect( 3 ); var result = jQuery( document.createElement( "div" ) ).offset(); @@ -51,10 +51,11 @@ QUnit.test( "disconnected element", function( assert ) { // valid input, but will return zeros for back-compat assert.equal( result.top, 0, "Retrieving offset on disconnected elements returns zeros (gh-2310)" ); assert.equal( result.left, 0, "Retrieving offset on disconnected elements returns zeros (gh-2310)" ); + assert.equal( Object.keys( result ).length, 2, "Retrieving offset on disconnected elements returns offset object (gh-3167)" ); } ); QUnit.test( "hidden (display: none) element", function( assert ) { - assert.expect( 2 ); + assert.expect( 3 ); var node = jQuery( "
" ).appendTo( "#qunit-fixture" ), result = node.offset(); @@ -66,6 +67,33 @@ QUnit.test( "hidden (display: none) element", function( assert ) { // valid input, but will return zeros for back-compat assert.equal( result.top, 0, "Retrieving offset on hidden elements returns zeros (gh-2310)" ); assert.equal( result.left, 0, "Retrieving offset on hidden elements returns zeros (gh-2310)" ); + assert.equal( Object.keys( result ).length, 2, "Retrieving offset on hidden elements returns offset object (gh-3167)" ); +} ); + +QUnit.test( "0 sized element", function( assert ) { + assert.expect( 3 ); + + var node = jQuery( "
" ).appendTo( "#qunit-fixture" ), + result = node.offset(); + + node.remove(); + + assert.notEqual( result.top, 0, "Retrieving offset on 0 sized elements (gh-3167)" ); + assert.notEqual( result.left, 0, "Retrieving offset on 0 sized elements (gh-3167)" ); + assert.equal( Object.keys( result ).length, 2, "Retrieving offset on 0 sized elements returns offset object (gh-3167)" ); +} ); + +QUnit.test( "hidden (visibility: hidden) element", function( assert ) { + assert.expect( 3 ); + + var node = jQuery( "
" ).appendTo( "#qunit-fixture" ), + result = node.offset(); + + node.remove(); + + assert.notEqual( result.top, 0, "Retrieving offset on visibility:hidden elements (gh-3167)" ); + assert.notEqual( result.left, 0, "Retrieving offset on visibility:hidden elements (gh-3167)" ); + assert.equal( Object.keys( result ).length, 2, "Retrieving offset on visibility:hidden elements returns offset object (gh-3167)" ); } ); testIframe( "absolute", "offset/absolute.html", function( assert, $, iframe ) {