diff options
author | Scott González <scott.gonzalez@gmail.com> | 2011-01-13 14:42:35 -0500 |
---|---|---|
committer | Scott González <scott.gonzalez@gmail.com> | 2011-01-13 14:42:35 -0500 |
commit | 468c35877aa7db472ae191617e32069a0e656ec7 (patch) | |
tree | 19d9fe229b6994c39be671cb6e74dfd7138e066f /ui/jquery.ui.accordion.js | |
parent | 3c11cd3051b463c4e18b5b5af1d0cac7f65c0537 (diff) | |
download | jquery-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.js | 77 |
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 ) { |