Skip to content
Permalink
Browse files
For .show() with no arguments, only set display of elements in the se…
…cond loop if they don't have style.display already set or if style.display isn't none. Fixes #7315.
  • Loading branch information
kswedberg authored and jeresig committed Oct 26, 2010
1 parent 7066bb3 commit 6ab402dced3339d24ad007ecf3a6c3f5af3e7610
Showing 2 changed files with 30 additions and 6 deletions.
@@ -15,28 +15,39 @@ var elemdisplay = {},

jQuery.fn.extend({
show: function( speed, easing, callback ) {
var elem, display;

if ( speed || speed === 0 ) {
return this.animate( genFx("show", 3), speed, easing, callback);

} else {
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
// being hidden by cascaded rules or not
if ( !jQuery.data(this[i], "olddisplay") && this[i].style.display === "none" ) {
this[i].style.display = "";
if ( !jQuery.data(elem, "olddisplay") && display === "none" ) {
elem.style.display = "";
}

// Set elements which have been overridden with display: none
// in a stylesheet to whatever the default browser style is
// for such an element
if ( this[i].style.display === "" && jQuery.css( this[i], "display" ) === "none" ) {
jQuery.data(this[i], "olddisplay", defaultDisplay(this[i].nodeName));
if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
jQuery.data(elem, "olddisplay", defaultDisplay(elem.nodeName));
}
}

// Set the display of most of the elements in a second loop
// to avoid the constant reflow
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;
@@ -6,7 +6,20 @@ test("sanity check", 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");
div.show().each(function(){
if ( this.style.display == "none" ) pass = false;

4 comments on commit 6ab402d

@Enideo
Copy link

@Enideo Enideo commented on 6ab402d Oct 27, 2010

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've spotted a bug, I guess it's from this commit.
Tried to make the simplest scenario here: http://jsfiddle.net/JYFuV/2/
Using Firefox 3.6.11

@kswedberg
Copy link
Member Author

@kswedberg kswedberg commented on 6ab402d Oct 27, 2010

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, that's really strange. I see the problem in your linked jsfiddle page, but I can't reproduce it locally in the test suite or in a standalone page with a simple test case: http://test.learningjquery.com/hide-show/

Is my test case doing something obviously different from yours that I'm not seeing?

@jeresig
Copy link
Member

@jeresig jeresig commented on 6ab402d Oct 27, 2010

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Karl: I was able to reproduce it in the test suite and fixed it as well, just now:
http://bugs.jquery.com/ticket/7331

@kswedberg
Copy link
Member Author

@kswedberg kswedberg commented on 6ab402d Oct 27, 2010

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah. Cool deal. Thanks, John!

Please sign in to comment.