]> source.dussan.org Git - jquery.git/commitdiff
Fix #13310. Get the right display value for disconnected nodes. Close gh-1156.
authorOleg <markelog@gmail.com>
Fri, 1 Feb 2013 13:22:08 +0000 (17:22 +0400)
committerDave Methvin <dave.methvin@gmail.com>
Mon, 4 Feb 2013 20:22:07 +0000 (15:22 -0500)
src/css.js
test/data/testsuite.css
test/index.html
test/unit/css.js

index 9cd38b287bba008fba980cfe8390d50d4a5a59f6..e8edd9f73372de7c2bc98ab78f90297ebb499408 100644 (file)
@@ -54,7 +54,7 @@ function getStyles( elem ) {
 }
 
 function showHide( elements, show ) {
-       var elem,
+       var display, elem, hidden,
                values = [],
                index = 0,
                length = elements.length;
@@ -64,11 +64,13 @@ function showHide( elements, show ) {
                if ( !elem.style ) {
                        continue;
                }
+
                values[ index ] = jQuery._data( elem, "olddisplay" );
+               display = elem.style.display;
                if ( show ) {
                        // Reset the inline display of this element to learn if it is
                        // being hidden by cascaded rules or not
-                       if ( !values[ index ] && elem.style.display === "none" ) {
+                       if ( !values[ index ] && display === "none" ) {
                                elem.style.display = "";
                        }
 
@@ -78,8 +80,15 @@ function showHide( elements, show ) {
                        if ( elem.style.display === "" && isHidden( elem ) ) {
                                values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
                        }
-               } else if ( !values[ index ] && !isHidden( elem ) ) {
-                       jQuery._data( elem, "olddisplay", jQuery.css( elem, "display" ) );
+               } else {
+
+                       if ( !values[ index ] ) {
+                               hidden = isHidden( elem );
+
+                               if ( display && display !== "none" || !hidden ) {
+                                       jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+                               }
+                       }
                }
        }
 
index 6bb3a5ded4fbfd66660562e91327e25125e08170..1dfa7cd344dfb238089887ff072ab23d365fada3 100644 (file)
@@ -151,3 +151,5 @@ section { background:#f0f; display:block; }
 
 /* #11971 */
 #foo { background: url(1x1.jpg) right bottom no-repeat; }
+
+#display { display: list-item !important; }
index 918d7d2d705415998d83ec7543c50def2750581c..f073054d8f66ff5725b261635bfb7b5c09ec0cd2 100644 (file)
@@ -318,6 +318,7 @@ Z</textarea>
                        </div>
 
                        <div id="fx-tests"></div>
+                       <span id="display"></span>
                </div>
        </div>
        </dl>
index 5ce12c73f8c67786a7a767ea3c3416c0f89f14ae..27069f8a3ef23a7716ee081d058e68d640498c37 100644 (file)
@@ -970,4 +970,27 @@ asyncTest( "Clearing a Cloned Element's Style Shouldn't Clear the Original Eleme
        window.setTimeout( start, 1000 );
 });
 
+asyncTest( "Make sure initialized display value for disconnected nodes is correct (#13310)", 4, function() {
+       var display = jQuery("#display").css("display"),
+               div = jQuery("<div/>");
+
+       equal( div.css( "display", "inline" ).hide().show().appendTo("body").css( "display" ), "inline", "Initialized display value has returned" );
+       div.remove();
+
+       div.css( "display", "none" ).hide();
+       equal( jQuery._data( div[ 0 ], "olddisplay" ), undefined, "olddisplay is undefined after hiding a detached and hidden element" );
+       div.remove();
+
+       div.css( "display", "inline-block" ).hide().appendTo("body").fadeIn(function() {
+               equal( div.css( "display" ), "inline-block", "Initialized display value has returned" );
+               div.remove();
+
+               start();
+       });
+
+       equal( jQuery._data( jQuery("#display").css( "display", "inline" ).hide()[ 0 ], "olddisplay" ), display,
+       "display: * !Important value should used as initialized display" );
+       jQuery._removeData( jQuery("#display")[ 0 ] );
+});
+
 }