Call methods using jQuery Plugin design pattern

boilerplate, jquery

Solution

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.

Problem

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

Original source

Related problems