Make sure that hide or show don't fail when operating on non-Element nodes. Fixes #6135.

This commit is contained in:
John Resig 2011-04-17 11:07:42 -07:00
parent 728a70c036
commit 21c0be8496
2 changed files with 27 additions and 15 deletions

8
src/effects.js vendored
View file

@ -28,6 +28,8 @@ jQuery.fn.extend({
} 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]; elem = this[i];
if ( elem.style ) {
display = elem.style.display; 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
@ -43,17 +45,21 @@ jQuery.fn.extend({
jQuery._data(elem, "olddisplay", defaultDisplay(elem.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++ ) {
elem = this[i]; elem = this[i];
if ( elem.style ) {
display = elem.style.display; display = elem.style.display;
if ( display === "" || display === "none" ) { if ( display === "" || display === "none" ) {
elem.style.display = jQuery._data(elem, "olddisplay") || ""; elem.style.display = jQuery._data(elem, "olddisplay") || "";
} }
} }
}
return this; return this;
} }
@ -75,8 +81,10 @@ jQuery.fn.extend({
// Set the display of the elements in a second loop // Set the display 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++ ) {
if ( this[i].style ) {
this[i].style.display = "none"; this[i].style.display = "none";
} }
}
return this; return this;
} }

View file

@ -88,6 +88,10 @@ test("show()", function() {
var elem = jQuery(selector, "#show-tests").show(); var elem = jQuery(selector, "#show-tests").show();
equals( elem.css("display"), expected, "Show using correct display type for " + selector ); equals( elem.css("display"), expected, "Show using correct display type for " + selector );
}); });
// Make sure that showing or hiding a text node doesn't cause an error
jQuery("<div>test</div> text <span>test</span>").show().remove();
jQuery("<div>test</div> text <span>test</span>").hide().remove();
}); });
test("show(Number) - other displays", function() { test("show(Number) - other displays", function() {