aboutsummaryrefslogtreecommitdiffstats
path: root/ui/jquery.ui.accordion.js
diff options
context:
space:
mode:
authorScott González <scott.gonzalez@gmail.com>2011-01-13 14:42:35 -0500
committerScott González <scott.gonzalez@gmail.com>2011-01-13 14:42:35 -0500
commit468c35877aa7db472ae191617e32069a0e656ec7 (patch)
tree19d9fe229b6994c39be671cb6e74dfd7138e066f /ui/jquery.ui.accordion.js
parent3c11cd3051b463c4e18b5b5af1d0cac7f65c0537 (diff)
downloadjquery-ui-468c35877aa7db472ae191617e32069a0e656ec7.tar.gz
jquery-ui-468c35877aa7db472ae191617e32069a0e656ec7.zip
Accordion: Moved handling for programmatically collapsing the accordion out of the event handler. Modified event handler to not change the active option until after it determines that the event is valid.
Diffstat (limited to 'ui/jquery.ui.accordion.js')
-rw-r--r--ui/jquery.ui.accordion.js77
1 files changed, 35 insertions, 42 deletions
diff --git a/ui/jquery.ui.accordion.js b/ui/jquery.ui.accordion.js
index eb6cdb5d0..61587ac00 100644
--- a/ui/jquery.ui.accordion.js
+++ b/ui/jquery.ui.accordion.js
@@ -277,14 +277,37 @@ $.widget( "ui.accordion", {
_activate: function( index ) {
var active = this._findActive( index )[ 0 ];
- if ( !active ) {
- if ( !this.options.collapsible ) {
- return;
+
+ // we found a header to activate, just delegate to the event handler
+ if ( active ) {
+ if ( active !== this.active[ 0 ] ) {
+ this._eventHandler( { target: active, currentTarget: active } );
}
- index = false;
+ return;
}
- this.options.active = index;
- this._eventHandler( { target: active, currentTarget: active } );
+
+ // no header to activate, check if we can collapse
+ if ( !this.options.collapsible ) {
+ return;
+ }
+
+ this.active
+ .removeClass( "ui-state-active ui-corner-top" )
+ .addClass( "ui-state-default ui-corner-all" )
+ .children( ".ui-icon" )
+ .removeClass( this.options.icons.activeHeader )
+ .addClass( this.options.icons.header );
+ this.active.next().addClass( "ui-accordion-content-active" );
+ var toHide = this.active.next(),
+ data = {
+ options: this.options,
+ newHeader: $( [] ),
+ oldHeader: this.active,
+ newContent: $( [] ),
+ oldContent: toHide
+ },
+ toShow = ( this.active = $( [] ) );
+ this._toggle( toShow, toHide, data );
},
// TODO: add tests/docs for negative values in 2.0 (#6854)
@@ -293,51 +316,23 @@ $.widget( "ui.accordion", {
},
_eventHandler: function( event ) {
- var options = this.options;
+ var options = this.options,
+ clicked = $( event.currentTarget ),
+ clickedIsActive = clicked[0] === this.active[0];
+
if ( options.disabled ) {
return;
}
- // called only when using activate(false) to close all parts programmatically
- if ( !event.target ) {
- if ( !options.collapsible ) {
- return;
- }
- this.active
- .removeClass( "ui-state-active ui-corner-top" )
- .addClass( "ui-state-default ui-corner-all" )
- .children( ".ui-icon" )
- .removeClass( options.icons.activeHeader )
- .addClass( options.icons.header );
- this.active.next().addClass( "ui-accordion-content-active" );
- var toHide = this.active.next(),
- data = {
- options: options,
- newHeader: $( [] ),
- oldHeader: options.active,
- newContent: $( [] ),
- oldContent: toHide
- },
- toShow = ( this.active = $( [] ) );
- this._toggle( toShow, toHide, data );
+ // if animations are still active, or the active header is the target, ignore click
+ if ( this.running || ( !options.collapsible && clickedIsActive ) ) {
return;
}
- // get the click target
- var clicked = $( event.currentTarget ),
- clickedIsActive = clicked[0] === this.active[0];
-
- // TODO the option is changed, is that correct?
- // TODO if it is correct, shouldn't that happen after determining that the click is valid?
options.active = options.collapsible && clickedIsActive ?
false :
this.headers.index( clicked );
- // if animations are still active, or the active header is the target, ignore click
- if ( this.running || ( !options.collapsible && clickedIsActive ) ) {
- return;
- }
-
// find elements to show and hide
var active = this.active,
toShow = clicked.next(),
@@ -374,8 +369,6 @@ $.widget( "ui.accordion", {
.next()
.addClass( "ui-accordion-content-active" );
}
-
- return;
},
_toggle: function( toShow, toHide, data, clickedIsActive, down ) {