| define( [ |
| "../core", |
| "../data/var/dataPriv", |
| "../css/var/isHiddenWithinTree" |
| ], function( jQuery, dataPriv, isHiddenWithinTree ) { |
| |
| "use strict"; |
| |
| var defaultDisplayMap = {}; |
| |
| function getDefaultDisplay( elem ) { |
| var temp, |
| doc = elem.ownerDocument, |
| nodeName = elem.nodeName, |
| display = defaultDisplayMap[ nodeName ]; |
| |
| if ( display ) { |
| return display; |
| } |
| |
| temp = doc.body.appendChild( doc.createElement( nodeName ) ); |
| display = jQuery.css( temp, "display" ); |
| |
| temp.parentNode.removeChild( temp ); |
| |
| if ( display === "none" ) { |
| display = "block"; |
| } |
| defaultDisplayMap[ nodeName ] = display; |
| |
| return display; |
| } |
| |
| function showHide( elements, show ) { |
| var display, elem, |
| values = [], |
| index = 0, |
| length = elements.length; |
| |
| // Determine new display value for elements that need to change |
| for ( ; index < length; index++ ) { |
| elem = elements[ index ]; |
| if ( !elem.style ) { |
| continue; |
| } |
| |
| display = elem.style.display; |
| if ( show ) { |
| |
| // Since we force visibility upon cascade-hidden elements, an immediate (and slow) |
| // check is required in this first loop unless we have a nonempty display value (either |
| // inline or about-to-be-restored) |
| if ( display === "none" ) { |
| values[ index ] = dataPriv.get( elem, "display" ) || null; |
| if ( !values[ index ] ) { |
| elem.style.display = ""; |
| } |
| } |
| if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { |
| values[ index ] = getDefaultDisplay( elem ); |
| } |
| } else { |
| if ( display !== "none" ) { |
| values[ index ] = "none"; |
| |
| // Remember what we're overwriting |
| dataPriv.set( elem, "display", display ); |
| } |
| } |
| } |
| |
| // Set the display of the elements in a second loop to avoid constant reflow |
| for ( index = 0; index < length; index++ ) { |
| if ( values[ index ] != null ) { |
| elements[ index ].style.display = values[ index ]; |
| } |
| } |
| |
| return elements; |
| } |
| |
| jQuery.fn.extend( { |
| show: function() { |
| return showHide( this, true ); |
| }, |
| hide: function() { |
| return showHide( this ); |
| }, |
| toggle: function( state ) { |
| if ( typeof state === "boolean" ) { |
| return state ? this.show() : this.hide(); |
| } |
| |
| return this.each( function() { |
| if ( isHiddenWithinTree( this ) ) { |
| jQuery( this ).show(); |
| } else { |
| jQuery( this ).hide(); |
| } |
| } ); |
| } |
| } ); |
| |
| return showHide; |
| } ); |