blob: 3eeafef116d9c90f67cb7ce2e14446d5eea7e24b [file] [log] [blame]
Copybara botbe50d492023-11-30 00:16:42 +01001define( [
2 "../core",
3 "../data/var/dataPriv",
4 "../css/var/isHiddenWithinTree"
5], function( jQuery, dataPriv, isHiddenWithinTree ) {
6
7"use strict";
8
9var defaultDisplayMap = {};
10
11function 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
34function 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
82jQuery.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
104return showHide;
105} );