Javascript jQuery插件公共方法在应用于多个元素时不起作用

Javascript jQuery插件公共方法在应用于多个元素时不起作用,javascript,jquery,plugins,Javascript,Jquery,Plugins,我之前发布了一个类似的问题,但它被标记为重复。但是,没有回答我的问题,所以我将再次尝试,这次使用我的示例中所述文章的解决方案 本文提供的解决方案与我之前遇到的问题相同:当有多个元素时,我无法调用插件的任何公共方法 由于没有提供工作示例,让我们从文章给出的代码开始: (function($){ $.fn.myPlugin = function(options) { // support multiple elements if (this.len

我之前发布了一个类似的问题,但它被标记为重复。但是,没有回答我的问题,所以我将再次尝试,这次使用我的示例中所述文章的解决方案

本文提供的解决方案与我之前遇到的问题相同:当有多个元素时,我无法调用插件的任何公共方法

由于没有提供工作示例,让我们从文章给出的代码开始:

(function($){

     $.fn.myPlugin = function(options) {
          // support multiple elements
          if (this.length > 1){
              this.each(function() { $(this).myPlugin(options) });
              return this;
          }

          // private variables
          var pOne = '';
          var pTwo = '';
          // ...

          // private methods
          var foo = function() {
              // do something ...
          }
          // ...

          // public methods        
          this.initialize = function() {
              // do something ...
              return this;
          };

          this.bar = function() {
              // do something ...
          };
          return this.initialize();
      }
 })(jQuery);
我喜欢内部循环,因此它应用于元素的每个实例,但我觉得重复的“returnthis”是多余的。我认为,如果我们删除其中的每一个,这个插件的工作原理将完全相同。但是,为了论证,我将把它们留在我的工作示例中

如中所示,当只有一个元素时,它可以正常工作。公共方法运行良好

但是,如果我在like中对其他4个元素进行注释,它会在控制台中抛出一个错误:“undefined不是函数”。当然,这是有意义的,因为我试图在引用所有元素而不是单个元素的情况下运行public方法

那么,我使用.eq(0)只在元素的第一个实例上运行该方法,但在控制台中得到了完全相同的错误

那么,为什么对单个元素调用public方法不起作用呢?这是一个范围问题吗


请告知。谢谢

好的,我想我已经回答了我自己的问题。问题是我没有将jQuery插件应用于DOM元素。我将它应用于jQuery元素。因此,如果我将jQuery插件应用于一个jQuery元素,如$element或$('.element'),那么我可以运行任何公共方法,因为范围是相同的。但是,如果我以不同的方式引用它,比如说$parentelement.eq(0),我使用的是一个差异引用,一个没有应用插件的引用,所以很自然,它不会有定义的方法。我想我的想法是对的。还是有点动摇。也许其他人能更好地解释

尽管如此,尽管上述代码在技术上是可行的,但公共方法在jQuery插件上并不实用。我建议改为使用自定义事件使jQuery插件做一些事情。像这样:

 (function($) {
     $.fn.extend({
         myTestPlugin: function() {

             if (this.length > 1) {
                 this.each(function() { $(this).myTestPlugin(); });
             }

             this.done = function() {
                 $(this).html('Done!');
             };

             var alsoDone = function() {
                 $(this).html('Also done!');
             };

             this.html('Replace me!');
             this.on('alsoDone', alsoDone);
         }
     });
 })(jQuery);
举个例子,我使用触发器使插件在单个元素上执行某些操作,虽然有效,但该方法仍然如预期的那样失败

我希望这能帮助其他有类似问题的人