mirror of
https://github.com/Hopiu/jquery-mobile.git
synced 2026-04-07 08:00:58 +00:00
152 lines
4.6 KiB
JavaScript
152 lines
4.6 KiB
JavaScript
/*
|
|
* jQuery Mobile Framework : "collapsible" plugin
|
|
* Copyright (c) jQuery Project
|
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
* http://jquery.org/license
|
|
*/
|
|
( function( $, undefined ) {
|
|
$.widget( "mobile.collapsible", $.mobile.widget, {
|
|
options: {
|
|
expandCueText: " click to expand contents",
|
|
collapseCueText: " click to collapse contents",
|
|
collapsed: false,
|
|
heading: ">:header,>legend",
|
|
theme: null,
|
|
iconTheme: "d"
|
|
},
|
|
_create: function() {
|
|
|
|
var $el = this.element,
|
|
o = this.options,
|
|
collapsibleContain = $el.addClass( "ui-collapsible-contain" ),
|
|
collapsibleHeading = $el.find( o.heading ).eq( 0 ),
|
|
collapsibleContent = collapsibleContain.wrapInner( '<div class="ui-collapsible-content"></div>' ).find( ".ui-collapsible-content" ),
|
|
collapsibleParent = $el.closest( ":jqmData(role='collapsible-set')" ).addClass( "ui-collapsible-set" );
|
|
|
|
//replace collapsibleHeading if it's a legend
|
|
if ( collapsibleHeading.is( "legend" ) ) {
|
|
collapsibleHeading = $( '<div role="heading">'+ collapsibleHeading.html() +"</div>" ).insertBefore( collapsibleHeading );
|
|
collapsibleHeading.next().remove();
|
|
}
|
|
|
|
collapsibleHeading
|
|
//drop heading in before content
|
|
.insertBefore( collapsibleContent )
|
|
//modify markup & attributes
|
|
.addClass( "ui-collapsible-heading" )
|
|
.append( '<span class="ui-collapsible-heading-status"></span>' )
|
|
.wrapInner( '<a href="#" class="ui-collapsible-heading-toggle"></a>' )
|
|
.find( "a:eq(0)" )
|
|
.buttonMarkup( {
|
|
shadow: !collapsibleParent.length,
|
|
corners: false,
|
|
iconPos: "left",
|
|
icon: "plus",
|
|
theme: o.theme
|
|
} )
|
|
.find( ".ui-icon" )
|
|
.removeAttr( "class" )
|
|
.buttonMarkup( {
|
|
shadow: true,
|
|
corners: true,
|
|
iconPos: "notext",
|
|
icon: "plus",
|
|
theme: o.iconTheme
|
|
} );
|
|
|
|
if ( ! collapsibleParent.length ) {
|
|
collapsibleHeading
|
|
.find( "a:eq(0)" )
|
|
.addClass( "ui-corner-all" )
|
|
.find( ".ui-btn-inner" )
|
|
.addClass( "ui-corner-all" );
|
|
}
|
|
else {
|
|
if ( collapsibleContain.jqmData( "collapsible-last" ) ) {
|
|
collapsibleHeading
|
|
.find( "a:eq(0), .ui-btn-inner" )
|
|
.addClass( "ui-corner-bottom" );
|
|
}
|
|
}
|
|
|
|
//events
|
|
collapsibleContain
|
|
.bind( "collapse", function( event ) {
|
|
if ( ! event.isDefaultPrevented() && $( event.target ).closest( ".ui-collapsible-contain" ).is( collapsibleContain ) ) {
|
|
event.preventDefault();
|
|
collapsibleHeading
|
|
.addClass( "ui-collapsible-heading-collapsed" )
|
|
.find( ".ui-collapsible-heading-status" )
|
|
.text( o.expandCueText )
|
|
.end()
|
|
.find( ".ui-icon" )
|
|
.removeClass( "ui-icon-minus" )
|
|
.addClass( "ui-icon-plus" );
|
|
collapsibleContent.addClass( "ui-collapsible-content-collapsed" ).attr( "aria-hidden", true );
|
|
|
|
if ( collapsibleContain.jqmData( "collapsible-last" ) ) {
|
|
collapsibleHeading
|
|
.find( "a:eq(0), .ui-btn-inner" )
|
|
.addClass( "ui-corner-bottom" );
|
|
}
|
|
}
|
|
|
|
} )
|
|
.bind( "expand", function( event ) {
|
|
if ( ! event.isDefaultPrevented() ) {
|
|
event.preventDefault();
|
|
collapsibleHeading
|
|
.removeClass( "ui-collapsible-heading-collapsed" )
|
|
.find( ".ui-collapsible-heading-status" ).text( o.collapseCueText );
|
|
|
|
collapsibleHeading.find( ".ui-icon" ).removeClass( "ui-icon-plus" ).addClass( "ui-icon-minus" );
|
|
collapsibleContent.removeClass( "ui-collapsible-content-collapsed" ).attr( "aria-hidden", false );
|
|
|
|
if ( collapsibleContain.jqmData( "collapsible-last" ) ) {
|
|
collapsibleHeading
|
|
.find( "a:eq(0), .ui-btn-inner" )
|
|
.removeClass( "ui-corner-bottom" );
|
|
}
|
|
}
|
|
} )
|
|
.trigger( o.collapsed ? "collapse" : "expand" );
|
|
|
|
|
|
//close others in a set
|
|
if ( collapsibleParent.length && !collapsibleParent.jqmData( "collapsiblebound" ) ) {
|
|
collapsibleParent
|
|
.jqmData( "collapsiblebound", true )
|
|
.bind( "expand", function( event ){
|
|
|
|
$( event.target )
|
|
.closest( ".ui-collapsible-contain" )
|
|
.siblings( ".ui-collapsible-contain" )
|
|
.trigger( "collapse" );
|
|
|
|
} );
|
|
|
|
|
|
var set = collapsibleParent.find( ":jqmData(role='collapsible'):first" );
|
|
|
|
set.first()
|
|
.find( "a:eq(0)" )
|
|
.addClass( "ui-corner-top" )
|
|
.find( ".ui-btn-inner" )
|
|
.addClass( "ui-corner-top" );
|
|
|
|
set.last().jqmData( "collapsible-last", true );
|
|
}
|
|
|
|
collapsibleHeading
|
|
.bind( "vclick", function( e ) {
|
|
if ( collapsibleHeading.is( ".ui-collapsible-heading-collapsed" ) ) {
|
|
collapsibleContain.trigger( "expand" );
|
|
}
|
|
else {
|
|
collapsibleContain.trigger( "collapse" );
|
|
}
|
|
e.preventDefault();
|
|
} );
|
|
}
|
|
} );
|
|
} )( jQuery );
|