From b994f4ec85330f534380e165d6989a2641d321e2 Mon Sep 17 00:00:00 2001 From: Oleg Gaidarenko Date: Tue, 22 Dec 2015 16:00:15 +0300 Subject: [PATCH] Revert "CSS: Ignore the CSS cascade in show()/hide()/etc." This reverts commit 9df8bd205ab78308c34af70c934c42175e560e86. --- src/css.js | 61 +- src/css/defaultDisplay.js | 71 ++ src/effects.js | 186 ++-- test/.jshintrc | 22 +- test/data/testrunner.js | 2 +- test/data/testsuite.css | 12 +- test/unit/css.js | 226 ++-- test/unit/dimensions.js | 21 +- test/unit/effects.js | 2090 +++++++++++++++++-------------------- test/unit/ready.js | 2 +- 10 files changed, 1352 insertions(+), 1341 deletions(-) create mode 100644 src/css/defaultDisplay.js diff --git a/src/css.js b/src/css.js index 66e4d52d3..9f69a1a42 100644 --- a/src/css.js +++ b/src/css.js @@ -11,15 +11,17 @@ define( [ "./css/var/swap", "./css/curCSS", "./css/adjustCSS", + "./css/defaultDisplay", "./css/addGetHookIf", "./css/support", - "./css/showHide", "./core/init", "./core/ready", "./selector" // contains ], function( jQuery, pnum, access, rmargin, document, rcssNum, rnumnonpx, cssExpand, - isHidden, swap, curCSS, adjustCSS, addGetHookIf, support, showHide ) { + isHidden, swap, curCSS, adjustCSS, defaultDisplay, addGetHookIf, support ) { + + console.log(isHidden); var @@ -67,6 +69,61 @@ function vendorPropName( name ) { } } +function showHide( elements, show ) { + var display, elem, hidden, + values = [], + index = 0, + length = elements.length; + + for ( ; index < length; index++ ) { + elem = elements[ index ]; + 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 ] && 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 ( elem.style.display === "" && isHidden( elem ) ) { + values[ index ] = jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) ); + } + } else { + hidden = isHidden( elem ); + + if ( display && display !== "none" || !hidden ) { + jQuery._data( + elem, + "olddisplay", + hidden ? display : jQuery.css( elem, "display" ) + ); + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( index = 0; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + if ( !show || elem.style.display === "none" || elem.style.display === "" ) { + elem.style.display = show ? values[ index ] || "" : "none"; + } + } + + return elements; +} + function setPositiveNumber( elem, value, subtract ) { var matches = rnumsplit.exec( value ); return matches ? diff --git a/src/css/defaultDisplay.js b/src/css/defaultDisplay.js new file mode 100644 index 000000000..3771be6d1 --- /dev/null +++ b/src/css/defaultDisplay.js @@ -0,0 +1,71 @@ +define([ + "../core", + "../var/document", + "../manipulation" // appendTo +], function( jQuery, document ) { + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( "