0
|
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 } );
|