我正在修改一个现有的jQuery插件,该插件当前有一个私有函数(分配给插件范围内的var)我想要公开,所以我可以在任意时间从插件外部调用它(在例如,对UI事件的响应。
基本上,我希望以下工作:
$('.foo').myPlugin();
......以及之后(可能在事件回调中):
$('.foo').publicMethodInsidePlugin();
甚至:
$('.foo').myPlugin.publicMethodInsidePlugin();
我知道jQueryUI有另一种方法,但我希望避免这种情况,并保持简单。
我相信的原因是这个插件面临的挑战是"私有"函数I尝试调用是在插件的return this.each(function(){})
部分内定义的。拉出这个函数是非常困难的,因为它取决于许多变量本身被定义为this.each
块范围内的私有变量,可能是因为每个元素的值可能不同应用该功能。
所述插件的基本结构是:
(function( $ ){
$.fn.myPlugin = function(options) {
var settings = { "variousDefaults" : true }
return this.each(function(){
if(options) {
$.extend(settings, options);
};
var $this = $(this),
someOtherVars = $("span", $this).length; // needs to evaluate on $this
privateFunc = function privateFunc() {
// the function that I want to be able to call after the fact...
};
// Immediately call that function
privateFunc();
$(window).resize(function() {
privateFunc();
});
});
}
})(jQuery);
我如何重构这个以便我可以在事后调用privateFunc?我打开创建另一个公共函数,然后调用此函数,如果这意味着更少的重构。
答案 0 :(得分:1)
“jQuery”方式是使用插件构造函数来调用不同的方法,比如各种API:
$('.foo').myPlugin();
$('.foo').myPlugin('someMethod', ['arg1', 'arg2']);
我看到它完成的另一种方法是将API存储在对象的数据存储中:
$('.foo').myPlugin();
$('.foo').data('myPluginAPI').someMethod('arg1', 'arg2');