]> source.dussan.org Git - jquery.git/commitdiff
Offset: report offset for 0 sized elements
authorJason Bedard <jason+github@jbedard.ca>
Tue, 13 Dec 2016 06:32:11 +0000 (22:32 -0800)
committerGitHub <noreply@github.com>
Tue, 13 Dec 2016 06:32:11 +0000 (22:32 -0800)
Fixes gh-3267
Closes gh-3367

src/offset.js
test/unit/offset.js

index 54442eb45c9aa10a284bc270031f2faff3ea789d..5baefdb21f4a5269de6b6b2861da3c63e99a74f6 100644 (file)
@@ -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() {
index c0df5f1ca58fb1fbb3ea603089b071aef4fcd2d2..5b73ede603b85946de944f4e1ee658e668a59476 100644 (file)
@@ -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( "<div style='display: none' />" ).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( "<div style='margin: 5px; width: 0; height: 0' />" ).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( "<div style='margin: 5px; visibility: hidden' />" ).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 ) {