【问题标题】:How can I provide a public function in a jQuery plugin?如何在 jQuery 插件中提供公共函数?
【发布时间】:2011-08-21 03:21:52
【问题描述】:

我写了一个小型 jQuery 插件,结构如下:

(function($) {
   // Private vars

   // Default settings
   $.PLUGINNAME = {
         id: 'PLUGINNAME',
         version: '1.0',
         defaults: {
              min: 0,
              max: 10
         }
   };

   // extend jQuery
   $.fn.extend({

       PLUGINNAME: function(_settings) {

           init = function() {

           }

           prepare = function() {

           }

           ...

           return this.each(function() {
                 _this = this;
                 init();
           });

       }

   });

})(jQuery);

我这样称呼它:

$("#update-panel").PLUGINNAME({
                min: 1,
                max: 20  
          });

我正在尝试提供一个额外的公共方法,其中函数内的一些数据可以在上述对插件的函数调用之后更新,但我不确定如何去做。我正在寻找的是这样的:

_PluginInstance = $("#update-panel").PLUGINNAME({
                    min: 1,
                    max: 20  
                   });
...
...
_PluginInstance.setMin(2); //should change the minimum to 2

setMin 可能会使用一些插件的内部变量,所以我不明白该怎么做。我知道我没有返回插件实例来执行上述操作,但有人可以告诉我如何通过保持相同的插件结构来执行此操作吗?

【问题讨论】:

    标签: javascript jquery closures


    【解决方案1】:

    只需在PLUGINNAME 对象中将函数设为this 的属性即可:

    (function($) {
       $.PLUGINNAME = {
         // Default settings
       };
    
       // extend jQuery
       $.fn.extend({
           PLUGINNAME: function(_settings) {
    
               // private methods
               var init = function() {};
               var prepare = function() {};
    
               // public methods
               this.setMin = function ( val ) {
                 _settings.min = val;
               };
               this.getMin = function () {
                 return _settings.min;
               };
    
               return this.each(function() {
                 _this = this;
                 init();
               });
           }
       });
    })(jQuery);
    

    那么你可以这样做:

    _PluginInstance = $("#update-panel").PLUGINNAME({
                        min: 1,
                        max: 20  
                       });
    _PluginInstance.getMin(); // 1
    _PluginInstance.setMin(2);
    _PluginInstance.getMin(); // 2
    

    编辑:天哪,我简直不敢相信我忘记了 var 关键字,你们为什么不告诉我我的苍蝇掉下来了?

    【讨论】:

    • 其实...这个很完美,只是我如何从setMin 访问我的插件中的prepare 函数。
    • 当我检查 Firebug 的控制台时,它会向 prepare is not a function 抱怨。
    • 我的错。这是我的错误(错字)。对于那个很抱歉。为您的时间 +1。
    • 这里只设置链上的功能。所以它在上面有效,但如果你转身打电话给$('#update-panel').setMin(2),它就不会了。
    【解决方案2】:

    您可以使用 jQuery-UI 方法调用样式:

    $("#update-panel").PLUGINNAME('method', arguments...);
    

    然后在你的插件中:

    PLUGINNAME: function(_settings, args) {
        if(!$.isPlainObject(_settings)) {
            // _settings (should) be the method name so
            // do what needs to be done to execute the method.
            return;
        }
        // Proceed as before.
    

    您可能希望使用arguments 伪数组而不是额外的args 参数。如果您需要将内部数据附加到各个对象,您可以在 PLUGINNAME 函数中的 $(this).data('PLUGINNAME') 中存储额外的内容。

    【讨论】:

    • 打败了我刚刚写的东西。本质上是$('#update-panel').PLUGINNAME('setMin', 2)。这比把$.fn弄得乱七八糟更好的选择
    【解决方案3】:

    我自己不是 jQuery 人,mu 太短 的答案似乎是正确的。但我想你也可以像jQuery's own docs 上所说的那样,使用.data() 方法来存储最小值/最大值。

    换句话说,让您的代码在元素上查找现有数据,所以当您第一次调用 $('#update_panel').plugin({min:1, max:20}) 时,它不会找到任何现有数据,因此会将这些最小值/最大值放在一个对象中并使用.data()“保存”它们。
    然后,当您稍后调用 $('#update_panel').plugin({min:2}) 时,您的代码会找到现有数据并更新值。

    只是一个想法

    【讨论】:

    • 两种方法都可以。在这种情况下这有点好,因为它非常简单。作为一个额外的好处,如果说在调用之间将另一个匹配元素添加到页面中,则新元素将使用插件重新初始化,而其余的只是重新配置,这有点酷。 $(matcher).plugin('method', *args) 模式更灵活,因为您可以定义任意数量的方法,这些方法与简单的 init/reconfig 不同。
    【解决方案4】:

    您可以像定义插件一样定义变量。

    $.fn.PLUGINNAME.someVariable = 4;
    

    或者,如果您愿意,只需在插件外部声明一个空变量,然后从插件内部添加到它

    var someVariable;
    
    (function($) {
       ... the plugin code
    })(jQuery);
    

    【讨论】:

    • 谢谢。实际上 setMin 不只是设置一些变量(我猜它是一个误导性的名称。对不起!)。它需要更新插件设置的一些 div。这些 div 实际上存储在定义中。
    猜你喜欢
    • 1970-01-01
    • 2014-09-01
    • 2012-08-17
    • 2014-10-10
    • 2019-02-07
    • 2012-03-12
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    相关资源
    最近更新 更多