From 0229b83f7e5bf64edb2888ab349bedcd1a45e7c1 Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Tue, 5 Oct 2010 13:23:10 -0500 Subject: [PATCH] Fix :visible does not work properly when display:none is set directly on an element in IE8. Fixes #4512. --- src/css.js | 11 +++-------- src/support.js | 15 ++++++++++++++- test/unit/css.js | 13 +++++++++++++ 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/css.js b/src/css.js index 4bf818e..8751860 100644 --- a/src/css.js +++ b/src/css.js @@ -280,14 +280,9 @@ function getWH( elem, name, extra ) { if ( jQuery.expr && jQuery.expr.filters ) { jQuery.expr.filters.hidden = function( elem ) { - var width = elem.offsetWidth, height = elem.offsetHeight, - skip = elem.nodeName.toLowerCase() === "tr"; - - return width === 0 && height === 0 && !skip ? - true : - width > 0 && height > 0 && !skip ? - false : - (elem.style.display || jQuery.css( elem, "display" )) === "none"; + var width = elem.offsetWidth, height = elem.offsetHeight; + + return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none"); }; jQuery.expr.filters.visible = function( elem ) { diff --git a/src/support.js b/src/support.js index d35dbed..299fbd2 100644 --- a/src/support.js +++ b/src/support.js @@ -65,7 +65,8 @@ checkClone: false, scriptEval: false, noCloneEvent: true, - boxModel: null + boxModel: null, + reliableHiddenOffsets: true }; // Make sure that the options inside disabled selects aren't marked as disabled @@ -117,6 +118,18 @@ document.body.appendChild( div ); jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = '
t
'; + jQuery.support.reliableHiddenOffsets = div.getElementsByTagName('td')[0].offsetHeight === 0; + div.innerHTML = ''; + document.body.removeChild( div ).style.display = 'none'; div = null; }); diff --git a/test/unit/css.js b/test/unit/css.js index 468f763..cfffb78 100644 --- a/test/unit/css.js +++ b/test/unit/css.js @@ -256,3 +256,16 @@ test("jQuery.css(elem, 'height') doesn't clear radio buttons (bug #1095)", funct ok( !! jQuery(":checkbox:first", $checkedtest).attr("checked"), "Check first checkbox still checked." ); ok( ! jQuery(":checkbox:last", $checkedtest).attr("checked"), "Check last checkbox still NOT checked." ); }); + +test(":visible selector works properly on table elements (bug #4512)", function () { + expect(1); + + jQuery('#table').html('cellcell'); + equals(jQuery('#table td:visible').length, 1, "hidden cell is not perceived as visible"); +}); + +test(":visible selector works properly on children with a hidden parent (bug #4512)", function () { + expect(1); + jQuery('#table').css('display', 'none').html('cellcell'); + equals(jQuery('#table td:visible').length, 0, "hidden cell children not perceived as visible"); +}); \ No newline at end of file -- 1.7.10.4