showHide.js (2304B)
1 define( [ 2 "../core", 3 "../data/var/dataPriv", 4 "../css/var/isHiddenWithinTree" 5 ], function( jQuery, dataPriv, isHiddenWithinTree ) { 6 7 "use strict"; 8 9 var defaultDisplayMap = {}; 10 11 function getDefaultDisplay( elem ) { 12 var temp, 13 doc = elem.ownerDocument, 14 nodeName = elem.nodeName, 15 display = defaultDisplayMap[ nodeName ]; 16 17 if ( display ) { 18 return display; 19 } 20 21 temp = doc.body.appendChild( doc.createElement( nodeName ) ); 22 display = jQuery.css( temp, "display" ); 23 24 temp.parentNode.removeChild( temp ); 25 26 if ( display === "none" ) { 27 display = "block"; 28 } 29 defaultDisplayMap[ nodeName ] = display; 30 31 return display; 32 } 33 34 function showHide( elements, show ) { 35 var display, elem, 36 values = [], 37 index = 0, 38 length = elements.length; 39 40 // Determine new display value for elements that need to change 41 for ( ; index < length; index++ ) { 42 elem = elements[ index ]; 43 if ( !elem.style ) { 44 continue; 45 } 46 47 display = elem.style.display; 48 if ( show ) { 49 50 // Since we force visibility upon cascade-hidden elements, an immediate (and slow) 51 // check is required in this first loop unless we have a nonempty display value (either 52 // inline or about-to-be-restored) 53 if ( display === "none" ) { 54 values[ index ] = dataPriv.get( elem, "display" ) || null; 55 if ( !values[ index ] ) { 56 elem.style.display = ""; 57 } 58 } 59 if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { 60 values[ index ] = getDefaultDisplay( elem ); 61 } 62 } else { 63 if ( display !== "none" ) { 64 values[ index ] = "none"; 65 66 // Remember what we're overwriting 67 dataPriv.set( elem, "display", display ); 68 } 69 } 70 } 71 72 // Set the display of the elements in a second loop to avoid constant reflow 73 for ( index = 0; index < length; index++ ) { 74 if ( values[ index ] != null ) { 75 elements[ index ].style.display = values[ index ]; 76 } 77 } 78 79 return elements; 80 } 81 82 jQuery.fn.extend( { 83 show: function() { 84 return showHide( this, true ); 85 }, 86 hide: function() { 87 return showHide( this ); 88 }, 89 toggle: function( state ) { 90 if ( typeof state === "boolean" ) { 91 return state ? this.show() : this.hide(); 92 } 93 94 return this.each( function() { 95 if ( isHiddenWithinTree( this ) ) { 96 jQuery( this ).show(); 97 } else { 98 jQuery( this ).hide(); 99 } 100 } ); 101 } 102 } ); 103 104 return showHide; 105 } );