在创作jquery插件时,如何从另一种方法调用我的主要插件方法之一?

时间:2011-08-11 02:29:21

标签: javascript jquery plugins

我正在遵循jquery网站上的插件创作指南,但我无法弄清楚如何从同一个插件中的另一个方法调用主插件方法。

我有一个这样的插件:

(function($){
var methods = {
    init: function(options) {
        var settings = {};

        //this == context element of plugin, already jquery
        return this.each(function() {
            var $this = $(this);
            if( options ) {
                settings = $.extend({}, settings, options);
            }
            var data = $this.data('PluginData');
            if(!data) {
                //set up                    
            }

        });
    },
    some_fn: function() {
        //do some stuff
    },
    another_fn: function() {
        //do other stuff, then somehow call some_fn(), maybe via methods.some_fn() ?    
    }
};

jQuery.fn.SomePlugin = function(method) {
    if(methods[method]) {
        return methods[method].apply(this, Array.prototype.slice.call( arguments, 1));
    } else if (typeof(method) == 'object' || !method) {
        return methods.init.apply(this, arguments);
    } else {
        console.log('there was an error');
    }
};
})(jQuery);

这几乎是来自jquery的骨架代码。但是,我遇到的问题是找出创建“实用程序”功能的最佳方法,该功能仅适用于我的插件方法,或者如何从另一个方法调用一个插件方法。

例如,在我的插件中,我有3种方法,initsome_fnanother_fn。当我在$('#el').SomePlugin('another_fn')内致电another_fn时,我想致电some_fn。我怎样才能做到这一点?但是,调用methods.some_fn()可能会有效,那么这取决于方法在方法对象中定义的顺序,对吗?我可以从some_fn拨打another_fn,但反之亦然?

此外,创建一个实用程序函数的正确方法是什么,我的插件中的所有方法都可以使用,这样我就不会混淆全局命名空间?我是否只是在调用var方法之前在插件的开头定义了实用程序函数?

编辑:感谢Matt Ball,我已经确认methods.some_fn()可以用于调用其他主要方法。现在我只想知道创建(私有)实用程序函数的最佳实践是什么

1 个答案:

答案 0 :(得分:0)

有关最佳做法,请查看:http://jqueryboilerplate.com 他们举例说明了你的问题。 :)

对于您的示例,您可以利用init函数的范围:

(function($){
var methods = {
    init: function(options) {
        var settings = {};

        var privateMethod = function(){ ... }

        //this == context element of plugin, already jquery
        return this.each(function() {
            var $this = $(this);
            if( options ) {
                settings = $.extend({}, settings, options);
            }
            var data = $this.data('PluginData');
            if(!data) {
                //set up                    
            }

        });
    },
    some_fn: function() {
        //call private function
        privateMethod()
        // do some stuff
    }
};

jQuery.fn.SomePlugin = function(method) {
    if(methods[method]) {
        return methods[method].apply(this, Array.prototype.slice.call( arguments, 1));
    } else if (typeof(method) == 'object' || !method) {
        return methods.init.apply(this, arguments);
    } else {
        console.log('there was an error');
    }
};
})(jQuery);