我正在遵循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种方法,init
,some_fn
和another_fn
。当我在$('#el').SomePlugin('another_fn')
内致电another_fn
时,我想致电some_fn
。我怎样才能做到这一点?但是,调用methods.some_fn()
可能会有效,那么这取决于方法在方法对象中定义的顺序,对吗?我可以从some_fn
拨打another_fn
,但反之亦然?
此外,创建一个实用程序函数的正确方法是什么,我的插件中的所有方法都可以使用,这样我就不会混淆全局命名空间?我是否只是在调用var方法之前在插件的开头定义了实用程序函数?
编辑:感谢Matt Ball,我已经确认methods.some_fn()可以用于调用其他主要方法。现在我只想知道创建(私有)实用程序函数的最佳实践是什么
答案 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);