【问题标题】:How to call public function within jQuery plugin from the plugin如何从插件调用 jQuery 插件中的公共函数
【发布时间】:2014-09-01 06:12:26
【问题描述】:

我正在开发一个 jQuery 插件。这是我的第一次,所以如果这是一个愚蠢的问题,我很抱歉。

我在插件中有几个公共方法。

我正在尝试从插件定义内部和插件外部调用这些方法,其方式类似于 public 关键字在 Java 中用于方法的方式,但我不断收到 @987654326 @错误。

我尝试了几种调用方式,但仍然无法正常工作。

关于如何做到这一点的任何想法?

这是我的代码库示例:

$(document).ready(function() {    

    (function($) {

        // Plugin Definition
        $.fn.popup = function(options){
            // code here...

            // SUBMIT FORM
            $(settings.popupSubmitSelector).on("click", function(e) {
                submitForm();             // call to my method
                this.submitForm();
                $.fn.popup.submitForm();   
            });

            // more code here...

            // my public method
            this.submitForm = function(){
                // method code here
            }

            // more code...
        }
    }(jQuery));
});

【问题讨论】:

标签: jquery plugins methods call public


【解决方案1】:

来自Provide Public Access to Secondary Functions as Applicable,实现目标的一种方法是定义方法如下:

$.fn.popup.submitForm = function() {
    //method body
};

你可以在插件外部或内部以同样的方式调用它:

$.fn.popup.submitForm();

【讨论】:

  • 我想你误会了。我需要从插件本身调用该函数。我还发布了更多信息,这有帮助吗?
  • 一开始就分享足够的信息。除非您真的想在插件外部调用该方法,否则不应在其前面加上 this .... 只需将其声明为任何其他函数,它只能在插件内部访问。
  • 我需要从插件内部和插件外部访问。
  • 那很好。我想我们现在正在取得进展。然后,您可能希望按照本文的答案定义您的方法:stackoverflow.com/questions/1117086,并稍作修改,如上所示。
【解决方案2】:

我想我现在明白你的问题了。如果要在同一对象的实例中执行公共方法,则必须正确引用当前实例。在 JS 中,您可以通过这种方式实现:

var MyObj = function() {
  var instance = this;

  this.publicMethod = function() {
    alert('test');
  }

  var privateMethod = function() {
    instance.publicMethod();
  }

  return this;

}

更新这是使用代理函数公开​​功能的插件的基本框架

(function($) {
    var settings = { ... };

    var methods = {
        init: function(options) { ... submitForm() ... },
        submitForm: function() { /* code here */ }
    };

    $.fn.popup = 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 {
            $.error('Method ' + method + ' does not exist on jQuery.popup');
        }
    };

})(jQuery);

然后您可以从外部访问

$('selector').popup('submitForm');

【讨论】:

  • 但是,这仍然不是 jQuery 插件的最佳实践。您应该将所有方法收集为私有方法并通过代理函数公开​​它们。
  • 这似乎有效!您能否也提供一个您提到的代理函数方法的示例?
  • 更新了我的答案并使用代理方法添加了一个基本的插件框架
  • 感谢您的帮助!您能否解释一下为什么您的第一个答案是不好的做法?
  • 在 JS 方面绝对不是坏习惯;这不是 jQuery 插件的最佳实践。通过使用代理方法,您不必在内部使用其方法时显式引用插件的实例,并且从外部公开调用它们只需将方法名称作为参数传递给您的插件。
【解决方案3】:

尝试类似:

$(document).ready(function () {

$(selector).click(function() {
    nameFunc();
});

});

var nameFunc = function () {

//Code

};

或者:

$(document).ready(function () {

$(selector).click(function() {
    OtherFunc();
});

function OtherFunc() {
 //Code
};

});

【讨论】:

  • 我已经将整个插件包装在$(document).ready(function() {}); 中,但它似乎并没有解决这个问题。正在从插件定义中调用事件侦听器。
  • 我认为您必须删除“this”前缀,因为您是在函数之外调用它...
  • 我认为@user3558931 在他分享给您的帖子中给出了正确答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
相关资源
最近更新 更多