From f70f01af9ea1d1d191b77fab6dadbbe421be43a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Scott=20Gonz=C3=A1lez?= Date: Mon, 21 Feb 2011 16:07:42 +0100 Subject: [PATCH] Accordion: Handle changing the event option. Fixes #6740 - Dynamically changing accordion's event handler doesn't actually change the behaviour. --- tests/unit/accordion/accordion_options.js | 47 ++++++++++++++++++++++- ui/jquery.ui.accordion.js | 17 ++++++-- 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/tests/unit/accordion/accordion_options.js b/tests/unit/accordion/accordion_options.js index f27431a500c..42cbb495c71 100644 --- a/tests/unit/accordion/accordion_options.js +++ b/tests/unit/accordion/accordion_options.js @@ -105,7 +105,52 @@ test( "{ collapsible: true }", function() { state( ac, 0, 0, 0 ); }); -// TODO: add event tests +test( "{ event: null }", function() { + var ac = $( "#list1" ).accordion({ + event: null + }); + state( ac, 1, 0, 0 ); + + ac.accordion( "option", "active", 1 ); + equal( ac.accordion( "option", "active" ), 1 ); + state( ac, 0, 1, 0 ); + + // ensure default click handler isn't bound + ac.find( ".ui-accordion-header" ).eq( 2 ).click(); + equal( ac.accordion( "option", "active" ), 1 ); + state( ac, 0, 1, 0 ); +}); + +test( "{ event: custom }", function() { + var ac = $( "#list1" ).accordion({ + event: "custom1 custom2" + }); + state( ac, 1, 0, 0 ); + + ac.find( ".ui-accordion-header" ).eq( 1 ).trigger( "custom1" ); + equal( ac.accordion( "option", "active" ), 1 ); + state( ac, 0, 1, 0 ); + + // ensure default click handler isn't bound + ac.find( ".ui-accordion-header" ).eq( 2 ).trigger( "click" ); + equal( ac.accordion( "option", "active" ), 1 ); + state( ac, 0, 1, 0 ); + + ac.find( ".ui-accordion-header" ).eq( 2 ).trigger( "custom2" ); + equal( ac.accordion( "option", "active" ), 2 ); + state( ac, 0, 0, 1 ); + + ac.accordion( "option", "event", "custom3" ); + + // ensure old event handlers are unbound + ac.find( ".ui-accordion-header" ).eq( 1 ).trigger( "custom1" ); + equal( ac.accordion( "option", "active" ), 2 ); + state( ac, 0, 0, 1 ); + + ac.find( ".ui-accordion-header" ).eq( 1 ).trigger( "custom3" ); + equal( ac.accordion( "option", "active" ), 1 ); + state( ac, 0, 1, 0 ); +}); test( "{ header: default }", function() { // default: > li > :first-child,> :not(li):even diff --git a/ui/jquery.ui.accordion.js b/ui/jquery.ui.accordion.js index 1c30ba89b3a..8049868e876 100644 --- a/ui/jquery.ui.accordion.js +++ b/ui/jquery.ui.accordion.js @@ -96,10 +96,7 @@ $.widget( "ui.accordion", { self.headers.find( "a" ).attr( "tabIndex", -1 ); } - if ( options.event ) { - self.headers.bind( options.event.split( " " ).join( ".accordion " ) + ".accordion", - $.proxy( self, "_eventHandler" ) ); - } + this._setupEvents( options.event ); }, _createIcons: function() { @@ -164,6 +161,10 @@ $.widget( "ui.accordion", { this._activate( 0 ); } + if ( key === "event" ) { + this._setupEvents( value ); + } + if ( key === "icons" ) { this._destroyIcons(); if ( value ) { @@ -284,6 +285,14 @@ $.widget( "ui.accordion", { return typeof selector === "number" ? this.headers.eq( selector ) : $(); }, + _setupEvents: function( event ) { + this.headers.unbind( ".accordion" ); + if ( event ) { + this.headers.bind( event.split( " " ).join( ".accordion " ) + ".accordion", + $.proxy( this, "_eventHandler" ) ); + } + }, + _eventHandler: function( event ) { var options = this.options, active = this.active,