/js/jquery.mobile.collapsible.js

https://github.com/annoyed/jquery-mobile · JavaScript · 160 lines · 117 code · 27 blank · 16 comment · 12 complexity · 9610590c83c2425d3ae547e473b7754f MD5 · raw file

  1. /*
  2. * jQuery Mobile Framework : "collapsible" plugin
  3. * Copyright (c) jQuery Project
  4. * Dual licensed under the MIT or GPL Version 2 licenses.
  5. * http://jquery.org/license
  6. */
  7. (function( $, undefined ) {
  8. $.widget( "mobile.collapsible", $.mobile.widget, {
  9. options: {
  10. expandCueText: " click to expand contents",
  11. collapseCueText: " click to collapse contents",
  12. collapsed: true,
  13. heading: ">:header,>legend",
  14. theme: null,
  15. contentTheme: null,
  16. iconTheme: "d",
  17. initSelector: ":jqmData(role='collapsible')"
  18. },
  19. _create: function() {
  20. var $el = this.element,
  21. o = this.options,
  22. collapsible = $el.addClass( "ui-collapsible" ),
  23. collapsibleHeading = $el.find( o.heading ).eq( 0 ),
  24. collapsibleContent = collapsible.wrapInner( "<div class='ui-collapsible-content'></div>" ).find( ".ui-collapsible-content" ),
  25. collapsibleSet = $el.closest( ":jqmData(role='collapsible-set')" ).addClass( "ui-collapsible-set" ),
  26. colllapsiblesInSet = collapsibleSet.children( ":jqmData(role='collapsible')" );
  27. // Replace collapsibleHeading if it's a legend
  28. if ( collapsibleHeading.is( "legend" ) ) {
  29. collapsibleHeading = $( "<div role='heading'>"+ collapsibleHeading.html() +"</div>" ).insertBefore( collapsibleHeading );
  30. collapsibleHeading.next().remove();
  31. }
  32. // If we are in a collapsible set
  33. if ( collapsibleSet.length ) {
  34. // Inherit the theme from collapsible-set
  35. if ( !o.theme ) {
  36. o.theme = collapsibleSet.jqmData( "theme" );
  37. }
  38. // Inherit the content-theme from collapsible-set
  39. if ( !o.contentTheme ) {
  40. o.contentTheme = collapsibleSet.jqmData( "content-theme" );
  41. }
  42. }
  43. collapsibleContent.addClass( ( o.contentTheme ) ? ( "ui-body-" + o.contentTheme ) : "");
  44. collapsibleHeading
  45. //drop heading in before content
  46. .insertBefore( collapsibleContent )
  47. //modify markup & attributes
  48. .addClass( "ui-collapsible-heading" )
  49. .append( "<span class='ui-collapsible-heading-status'></span>" )
  50. .wrapInner( "<a href='#' class='ui-collapsible-heading-toggle'></a>" )
  51. .find( "a:eq(0)" )
  52. .buttonMarkup({
  53. shadow: false,
  54. corners: false,
  55. iconPos: "left",
  56. icon: "plus",
  57. theme: o.theme
  58. });
  59. if ( !collapsibleSet.length ) {
  60. collapsibleHeading
  61. .find( "a:eq(0), .ui-btn-inner" )
  62. .addClass( "ui-corner-top ui-corner-bottom" );
  63. } else {
  64. // If we are in a collapsible set
  65. // Initialize the collapsible set if it's not already initialized
  66. if ( !collapsibleSet.jqmData( "collapsiblebound" ) ) {
  67. collapsibleSet
  68. .jqmData( "collapsiblebound", true )
  69. .bind( "expand", function( event ) {
  70. $( event.target )
  71. .closest( ".ui-collapsible" )
  72. .siblings( ".ui-collapsible" )
  73. .trigger( "collapse" );
  74. });
  75. }
  76. colllapsiblesInSet.first()
  77. .find( "a:eq(0)" )
  78. .addClass( "ui-corner-top" )
  79. .find( ".ui-btn-inner" )
  80. .addClass( "ui-corner-top" );
  81. colllapsiblesInSet.last()
  82. .jqmData( "collapsible-last", true )
  83. .find( "a:eq(0)" )
  84. .addClass( "ui-corner-bottom" )
  85. .find( ".ui-btn-inner" )
  86. .addClass( "ui-corner-bottom" );
  87. if ( collapsible.jqmData( "collapsible-last" ) ) {
  88. collapsibleHeading
  89. .find( "a:eq(0), .ui-btn-inner" )
  90. .addClass( "ui-corner-bottom" );
  91. }
  92. }
  93. //events
  94. collapsible
  95. .bind( "expand collapse", function( event ) {
  96. if ( !event.isDefaultPrevented() ) {
  97. event.preventDefault();
  98. var $this = $( this ),
  99. isCollapse = ( event.type === "collapse" ),
  100. contentTheme = o.contentTheme;
  101. collapsibleHeading
  102. .toggleClass( "ui-collapsible-heading-collapsed", isCollapse)
  103. .find( ".ui-collapsible-heading-status" )
  104. .text( isCollapse ? o.expandCueText : o.collapseCueText )
  105. .end()
  106. .find( ".ui-icon" )
  107. .toggleClass( "ui-icon-minus", !isCollapse )
  108. .toggleClass( "ui-icon-plus", isCollapse );
  109. $this.toggleClass( "ui-collapsible-collapsed", isCollapse );
  110. collapsibleContent.toggleClass( "ui-collapsible-content-collapsed", isCollapse ).attr( "aria-hidden", isCollapse );
  111. if ( contentTheme && ( !collapsibleSet.length || collapsible.jqmData( "collapsible-last" ) ) ) {
  112. collapsibleHeading
  113. .find( "a:eq(0), .ui-btn-inner" )
  114. .toggleClass( "ui-corner-bottom", isCollapse );
  115. collapsibleContent.toggleClass( "ui-corner-bottom", !isCollapse );
  116. }
  117. }
  118. })
  119. .trigger( o.collapsed ? "collapse" : "expand" );
  120. collapsibleHeading
  121. .bind( "click", function( event ) {
  122. var type = collapsibleHeading.is( ".ui-collapsible-heading-collapsed" ) ?
  123. "expand" : "collapse";
  124. collapsible.trigger( type );
  125. event.preventDefault();
  126. });
  127. }
  128. });
  129. //auto self-init widgets
  130. $( document ).bind( "pagecreate create", function( e ){
  131. $( $.mobile.collapsible.prototype.options.initSelector, e.target ).collapsible();
  132. });
  133. })( jQuery );