【问题标题】:Make jQuery plugin method publicly available once the plugin has been applied to an element将插件应用于元素后,使 jQuery 插件方法公开可用
【发布时间】:2013-02-21 19:47:26
【问题描述】:

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

基本上,我希望以下工作:

$('.foo').myPlugin();

... 及以后(可能在事件回调中):

$('.foo').publicMethodInsidePlugin();

甚至:

$('.foo').myPlugin.publicMethodInsidePlugin();

我知道 jQueryUI 有另一种方法,但我希望避免这种情况并保持简单。

更新

相信这个插件面临挑战的原因是我试图调用的“私有”函数是在插件的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?我愿意创建另一个公共函数,然后调用这个函数,如果这意味着更少的重构。

【问题讨论】:

  • 是的,如果您的插件以这样一种方式创建,即它为每个元素返回一个类的实例,则将该实例存储在元素的数据中并在那里引用它。 $(elem).data("myPlugin",theInstance) 要给出完整的答案,我们需要看看插件是如何定义的。
  • @KevinB 效果很好。我只是将私有函数存储为数据元素。不过,必须有更好的方法来做到这一点......

标签: jquery extend public-method


【解决方案1】:

“jQuery”方式是使用插件构造函数来调用不同的方法,比如各种 API:

$('.foo').myPlugin();
$('.foo').myPlugin('someMethod', ['arg1', 'arg2']);

我见过的另一种方法是将 API 存储在对象的数据存储中:

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

【讨论】:

  • 我喜欢您的第一个选项的外观,但我想知道这是否仅在您第一次在元素上调用插件时才有效?我的意思是,在您的第一个示例中,假设插件在您运行 .myPlugin() 时正在执行一些计算量很大的工作,那么当您执行 .myPlugin('someMethod') 时它会再次运行吗?
  • 您将跟踪数据存储中的初始化状态,即$(this).data('myPluginInitialized', true)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 2011-11-23
  • 2013-02-19
  • 1970-01-01
相关资源
最近更新 更多