From 21c0be8496127df3f0ad652e582133148430cc41 Mon Sep 17 00:00:00 2001 From: John Resig Date: Sun, 17 Apr 2011 11:07:42 -0700 Subject: [PATCH] Make sure that hide or show don't fail when operating on non-Element nodes. Fixes #6135. --- src/effects.js | 38 +++++++++++++++++++++++--------------- test/unit/effects.js | 4 ++++ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/effects.js b/src/effects.js index 2c7b44cb..162de126 100644 --- a/src/effects.js +++ b/src/effects.js @@ -28,19 +28,22 @@ jQuery.fn.extend({ } 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(elem, "olddisplay") && display === "none" ) { - display = elem.style.display = ""; - } + if ( elem.style ) { + display = 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 ( display === "" && jQuery.css( elem, "display" ) === "none" ) { - jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName)); + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !jQuery._data(elem, "olddisplay") && display === "none" ) { + display = 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 ( display === "" && jQuery.css( elem, "display" ) === "none" ) { + jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName)); + } } } @@ -48,10 +51,13 @@ jQuery.fn.extend({ // to avoid the constant reflow for ( i = 0; i < j; i++ ) { elem = this[i]; - display = elem.style.display; - if ( display === "" || display === "none" ) { - elem.style.display = jQuery._data(elem, "olddisplay") || ""; + if ( elem.style ) { + display = elem.style.display; + + if ( display === "" || display === "none" ) { + elem.style.display = jQuery._data(elem, "olddisplay") || ""; + } } } @@ -75,7 +81,9 @@ jQuery.fn.extend({ // Set the display of the elements in a second loop // to avoid the constant reflow for ( i = 0; i < j; i++ ) { - this[i].style.display = "none"; + if ( this[i].style ) { + this[i].style.display = "none"; + } } return this; diff --git a/test/unit/effects.js b/test/unit/effects.js index 8b7cf467..ec177454 100644 --- a/test/unit/effects.js +++ b/test/unit/effects.js @@ -88,6 +88,10 @@ test("show()", function() { var elem = jQuery(selector, "#show-tests").show(); 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("
test
text test").show().remove(); + jQuery("
test
text test").hide().remove(); }); test("show(Number) - other displays", function() {