10

How to extend a jQuery plugin?

currently I am using multiopen accordion plugin.

I need to add new feature like once the expand/collapse is finished I need to callback a function as like change event in jquery ui accordion plugin.

How to add this feature in this plugin.

Community
  • 1
  • 1
SAK
  • 3,270
  • 7
  • 24
  • 38

4 Answers4

5

you dont need the accordion widget for that. you can do this with a few lines of jQuery.

html:

<h3 class="header"> Title 1 </h3>
<div class="content"> Content 1 </div>
<h3 class="header"> Title 2 </h3>
<div class="content"> Content 2 </div>

javascrpt/jQuery:

( function( $ ){ // closure to make sure jQuery = $
  $( function(){ // on document load
    $( ".header" ).click( function( e ){ // select headers and set onClick event handler
      // here you can maybe add a class to an opened header like this
      $( this ).toggleClass( "open" );
      $( this ).next().toggle( "slow", function(){ // toggle visibility
        // what you write here will be executed after the animation
        // "this" will refer to the hidden/revealed div element
        // if you want to call a function depending on if the 
        // panel was opened or closed try this
        if ( $( this ).is( ":visible" ) ) {
          tabOpened( e, this );
        } else {
          tabClosed( e, this );
        }
      }) 
    }).next().hide()
  })
})(jQuery)

and the whole thing working on jsfiddle http://jsfiddle.net/qpqL9/

lordvlad
  • 4,638
  • 1
  • 19
  • 40
3

You can easily call your function in the callback functions of the animation done on the tabs. Slight changes in jquery.multi-accordion-1.5.3.js

$div.slideDown('fast', function(){
    $div.addClass(options._classes.divActive);
    //function to be called after expanding the tabs. 
});

$div.slideUp('fast', function(){
    $div.removeClass(options._classes.divActive);
    //function to be called after collapsing the tabs
});
Nupur
  • 616
  • 6
  • 15
  • okay,where should i include the above lines and how to call my user defined javascript function as like tabShown: function(event, ui) { } – SAK Dec 16 '12 at 14:16
  • unfortunately no parameters are sent to the [function](http://api.jquery.com/slideDown/). But you can easily call any function from in there. – Nupur Dec 18 '12 at 04:17
2

Have you try the tabHidden and tabShown methods?

 // when tab is shown, ui here hold the same as in click event above
  tabShown: function(event, ui) {}

  // when tab is hidden, ui here hold the same as in click event above
  tabHidden: function(event, ui) {}
Dennis Martinez
  • 5,406
  • 9
  • 43
  • 59
2
$.extend($.ui.multiAccordion, {    
    // private helper method that used to show tabs
    _showTab: function($this) {
        var $span = $this.children('span.ui-icon');
        var $div = $this.next();
        var options = this.options;
        $this.removeClass('ui-state-default ui-corner-all').addClass('ui-state-active ui-corner-top');
        $span.removeClass('ui-icon-triangle-1-e').addClass('ui-icon-triangle-1-s');
        // MODIIFICATION
        bindThis = this;
        var ui = {
            tab: $this,
            content: $this.next('div')
        }
        $div.slideDown('fast', function(){
            $div.addClass(options._classes.divActive);
            // MODIFICATION
            bindThis._trigger('tabShownComplete');
        });
        this._trigger('tabShown', null, ui);
    },

    // private helper method that used to show tabs 
    _hideTab: function($this) {
        var $span = $this.children('span.ui-icon');
        var $div = $this.next();
        var options = this.options;
        $this.removeClass('ui-state-active ui-corner-top').addClass('ui-state-default ui-corner-all');
        $span.removeClass('ui-icon-triangle-1-s').addClass('ui-icon-triangle-1-e');
        // MODIIFICATION
        bindThis = this;
        var ui = {
            tab: $this,
            content: $this.next('div')
        }
        $div.slideUp('fast', function(){
            $div.removeClass(options._classes.divActive);
            // MODIFICATION
            bindThis._trigger('tabHiddenComplete', null, ui);
        });
        this._trigger('tabHidden', null, ui);
    }
});
nickaknudson
  • 4,599
  • 2
  • 12
  • 15