将jQuery插件方法应用于元素后,使其公开可用

将jQuery插件方法应用于元素后,使其公开可用,jquery,extend,public-method,Jquery,Extend,Public Method,我正在修改一个现有的jQuery插件,该插件当前有一个私有函数(分配给插件范围内的一个var),我希望公开该函数,以便可以在任意时间从插件外部调用它(例如,响应UI事件) 基本上,我希望以下方面能够发挥作用: $('.foo').myPlugin(); 。。。稍后(可能在事件回调中): 甚至: $('.foo').myPlugin.publicMethodInsidePlugin(); 我知道jQueryUI有另一种方法,但我希望避免这种情况并保持简单 更新 我认为这个插件面临的挑战是,我试

我正在修改一个现有的jQuery插件,该插件当前有一个私有函数(分配给插件范围内的一个var),我希望公开该函数,以便可以在任意时间从插件外部调用它(例如,响应UI事件)

基本上,我希望以下方面能够发挥作用:

$('.foo').myPlugin();
。。。稍后(可能在事件回调中):

甚至:

$('.foo').myPlugin.publicMethodInsidePlugin();
我知道jQueryUI有另一种方法,但我希望避免这种情况并保持简单

更新 我认为这个插件面临的挑战是,我试图调用的“private”函数是在
返回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?我愿意创建另一个公共函数,然后调用这个函数,如果这意味着更少的重构的话。

jQuery的方法是使用插件构造函数调用不同的方法,比如API:

$('.foo').myPlugin();
$('.foo').myPlugin('someMethod', ['arg1', 'arg2']);
我看到的另一种方法是将API存储在对象的数据存储中:

$('.foo').myPlugin();
$('.foo').data('myPluginAPI').someMethod('arg1', 'arg2');

是的,如果您的插件是以这样一种方式创建的,即它为每个元素返回一个类的实例,那么将该实例存储在元素的数据上并在那里引用它
$(elem).data(“myPlugin”,即实例)
要给出完整的答案,我们需要看看插件是如何定义的。@KevinB这很好。我只是将私有函数存储为数据元素。不过,一定有更好的方法来实现这一点……我喜欢您的第一个选项的外观,但我想知道这是否只有在您第一次调用元素上的插件时才有效?我的意思是,在您的第一个示例中,假设当您运行.myPlugin()时插件正在执行一些计算繁重的任务,那么当您运行.myPlugin('someMethod')时它会再次运行吗?您会跟踪数据存储中的初始化状态,即
$(this).data('myPluginInitialized',true)
$('.foo').myPlugin();
$('.foo').data('myPluginAPI').someMethod('arg1', 'arg2');