jQuery Plugin: Adding Callback functionality

JqueryFunctionCallback

Jquery Problem Overview


I'm trying to give my plugin callback functionality, and I'd like for it to operate in a somewhat traditional way:

myPlugin({options}, function() {
    /* code to execute */
});

or

myPlugin({options}, anotherFunction());

How do I handle that parameter in the code? Is it treated as one full entity? I'm pretty sure I know where I'd place the executory code, but how do I get the code to execute? I can't seem to find a lot of literature on the topic.

Jquery Solutions


Solution 1 - Jquery

Just execute the callback in the plugin:

$.fn.myPlugin = function(options, callback) {
    if (typeof callback == 'function') { // make sure the callback is a function
        callback.call(this); // brings the scope to the callback
    }
};

You can also have the callback in the options object:

$.fn.myPlugin = function() {

    // extend the options from pre-defined values:
    var options = $.extend({
        callback: function() {}
    }, arguments[0] || {});

    // call the callback and apply the scope:
    options.callback.call(this);

};

Use it like this:

$('.elem').myPlugin({
    callback: function() {
        // some action
    }
});

Solution 2 - Jquery

I don't know if I understand your question correctly. But for the second version: This would call anotherFunction immediately.

Basically your plugin should be some kind of function that looks like this:

var myPlugin = function(options, callback) {
    //do something with options here
    //call callback
    if(callback) callback();
} 

You have to provide a function object as callback, so either function(){...} or anotherFunction (without () ).

Solution 3 - Jquery

Bringing back a blast from the past.

Worth noting that if you have two arguments passed, for example:

$.fn.plugin = function(options, callback) { ... };

Then you call the plugin without the options argument but with a callback then you'll run into issues:

$(selector).plugin(function() {...});

I use this to make it a little more flexible:

if($.isFunction(options)) { callback = options }

Solution 4 - Jquery

I think this might help you

// Create closure.
(function( $ ) {
  
   // This is the easiest way to have default options.
 
        var settings = $.extend({
            // These are the defaults.
 
            onready: function(){},
 
            //Rest of the Settings goes here...
        }, options );
 
    // Plugin definition.
    $.fn.hilight = function( options ) {
 
        //Here's the Callback
        settings.onready.call(this);
 
        //Your plugin code goes Here
    };
  
// End of closure.
  
})( jQuery );

I had shared a article about Creating your Own jQuery Plugin.I think you should check that http://mycodingtricks.com/jquery/how-to-create-your-own-jquery-plugin/

Solution 5 - Jquery

Change your plugin function to take a second parameter. Assuming that the user passes a function, that parameter can be treated as a regular function.
Note that you can also make the callback a property of the options parameter.

For example:

$.fn.myPlugin = function(options, callback) {
    ...

    if(callback)        //If the caller supplied a callback
        callback(someParam);

    ...
});

Solution 6 - Jquery

An example bit late, but it can be useful. Using arguments can create the same functionality.

$.fn.myPlugin = function() {
    var el = $(this[0]);
    var args = arguments[0] || {};
    var callBack = arguments[1];
    .....
    if (typeof callback == 'function') {
        callback.call(this);
    }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questiondclowd9901View Question on Stackoverflow
Solution 1 - JqueryDavid HellsingView Answer on Stackoverflow
Solution 2 - JqueryFelix KlingView Answer on Stackoverflow
Solution 3 - JquerySam PottsView Answer on Stackoverflow
Solution 4 - JqueryShubham KumarView Answer on Stackoverflow
Solution 5 - JquerySLaksView Answer on Stackoverflow
Solution 6 - JqueryDrakaView Answer on Stackoverflow