For .show() with no arguments, only set display of elements in the second loop if they don't have style.display already set or if style.display isn't none. Fixes #7315.

This commit is contained in:
Karl Swedberg 2010-10-26 14:37:44 -07:00 committed by John Resig
parent 7066bb384b
commit 6ab402dced
2 changed files with 30 additions and 6 deletions

21
src/effects.js vendored
View file

@ -15,28 +15,39 @@ var elemdisplay = {},
jQuery.fn.extend({ jQuery.fn.extend({
show: function( speed, easing, callback ) { show: function( speed, easing, callback ) {
var elem, display;
if ( speed || speed === 0 ) { if ( speed || speed === 0 ) {
return this.animate( genFx("show", 3), speed, easing, callback); return this.animate( genFx("show", 3), speed, easing, callback);
} else { } else {
for ( var i = 0, j = this.length; i < j; i++ ) { for ( var i = 0, j = this.length; i < j; i++ ) {
elem = this[i];
display = elem.style.display;
// Reset the inline display of this element to learn if it is // Reset the inline display of this element to learn if it is
// being hidden by cascaded rules or not // being hidden by cascaded rules or not
if ( !jQuery.data(this[i], "olddisplay") && this[i].style.display === "none" ) { if ( !jQuery.data(elem, "olddisplay") && display === "none" ) {
this[i].style.display = ""; elem.style.display = "";
} }
// Set elements which have been overridden with display: none // Set elements which have been overridden with display: none
// in a stylesheet to whatever the default browser style is // in a stylesheet to whatever the default browser style is
// for such an element // for such an element
if ( this[i].style.display === "" && jQuery.css( this[i], "display" ) === "none" ) { if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
jQuery.data(this[i], "olddisplay", defaultDisplay(this[i].nodeName)); jQuery.data(elem, "olddisplay", defaultDisplay(elem.nodeName));
} }
} }
// Set the display of most of the elements in a second loop // Set the display of most of the elements in a second loop
// to avoid the constant reflow // to avoid the constant reflow
for ( i = 0; i < j; i++ ) { for ( i = 0; i < j; i++ ) {
this[i].style.display = jQuery.data(this[i], "olddisplay") || ""; elem = this[i];
display = elem.style.display;
if ( display === "" || display === "none" ) {
elem.style.display = jQuery.data(elem, "olddisplay") || "";
}
} }
return this; return this;

15
test/unit/effects.js vendored
View file

@ -6,7 +6,20 @@ test("sanity check", function() {
}); });
test("show()", function() { test("show()", function() {
expect(23); expect(26);
var hiddendiv = jQuery("div.hidden");
equal(jQuery.css( hiddendiv[0], "display"), "none", "hiddendiv is display: none");
hiddendiv.css("display", "block");
equal(jQuery.css( hiddendiv[0], "display"), "block", "hiddendiv is display: block");
hiddendiv.show();
equal(jQuery.css( hiddendiv[0], "display"), "block", "hiddendiv is display: block");
hiddendiv.css("display","");
var pass = true, div = jQuery("#main div"); var pass = true, div = jQuery("#main div");
div.show().each(function(){ div.show().each(function(){
if ( this.style.display == "none" ) pass = false; if ( this.style.display == "none" ) pass = false;