I've been using the jQuery Boilerplate for developing plugins and one thing I can't figure out is how to call methods from outside the plugin.
For reference, here is the boilerplate code I'm talking about: http://jqueryboilerplate.com/
In my fiddle,
http://jsfiddle.net/D9JSQ/2/
Here is the code:
;(function ( $, window, document, undefined ) {
    var pluginName = 'test';
    var defaults;
    function Plugin(element, options) {
        this.element = element;
        this.options = $.extend( {}, defaults, options) ;
        this._name = pluginName;
        this.init();
    }
    Plugin.prototype = {
        init: function() {
            this.hello();
        },
        hello : function() {
            document.write('hello');
        },
        goodbye : function() {
            document.write('goodbye');
        }
    }
    $.fn[pluginName] = function ( options ) {
            return this.each(function () {
                if (!$.data(this, 'plugin_' + pluginName)) {
                    $.data(this, 'plugin_' + pluginName, 
                    new Plugin( this, options ));
                }
            });
    }
})( jQuery, window, document );
$(document).ready(function() {
    $("#foo").test();
    $("#foo").test('goodbye');
});
I am trying to call the goodbye method using the following syntax:
$("#foo").test('goodbye')
How do I achieve this? Thanks in advance
You'll have to get a reference to the class to call it's method with that plugin structure.
http://jsfiddle.net/D9JSQ/3/
$(document).ready(function() {
    var test = $("#foo").test().data("plugin_test");
    test.goodbye();
});
To do what you want, you must get rid of document.write to test it.
http://jsfiddle.net/D9JSQ/8/
;
(function($, window, document, undefined) {
    var pluginName = 'test';
    var defaults;
    function Plugin(element, options) {
        this.element = element;
        this.options = $.extend({}, defaults, options);
        this._name = pluginName;
        this.init();
    }
    Plugin.prototype = {
        init: function(name) {
            this.hello();
        },
        hello: function(name) {
            console.log('hello');
        },
        goodbye: function(name) {
            console.log('goodbye');
        }
    }
    $.fn[pluginName] = function(options) {
        return this.each(function() {
            if (!$.data(this, 'plugin_' + pluginName)) {
                $.data(this, 'plugin_' + pluginName, new Plugin(this, options));
            }
            else if ($.isFunction(Plugin.prototype[options])) {
                $.data(this, 'plugin_' + pluginName)[options]();
            }
        });
    }
})(jQuery, window, document);
$(document).ready(function() {
    $("#foo").test();
    $("#foo").test('goodbye');
});
Look to the console for information.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With