showHide.js 2.2 KB

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