Javascript 如何在jquery插件实例之间共享属性和函数?

Javascript 如何在jquery插件实例之间共享属性和函数?,javascript,jquery,jquery-plugins,Javascript,Jquery,Jquery Plugins,我想在jquery插件实例(我创建的)之间共享属性和方法 我该如何正确地做到这一点 Supose我有一个简单的插件,定义如下: // add the plugin to the jQuery.fn object $.fn.clickableImage = function(options) { this.set_not_clicked = function(){ return this.each(function() { $(this).addClass('

我想在jquery插件实例(我创建的)之间共享属性和方法 我该如何正确地做到这一点

Supose我有一个简单的插件,定义如下:

// add the plugin to the jQuery.fn object
$.fn.clickableImage = function(options) {

    this.set_not_clicked = function(){
      return this.each(function() {
        $(this).addClass('not-clicked');
      });

    };

    // iterate through the DOM elements we are attaching the plugin to
    return this.each(function() {
      $(this).click( function(){
        parent.set_not_clicked() //how to get "parent" ???
        $(this).removeClass('not-clicked').addClass('clicked');
      });
    });
}
以及,图像实例为:

$(function(){
  $('#some-selector img').clickableImage();
});

如何让“clickableImage”知道其他“clickableImage”?

闭包是javascript中常见的模式,因为闭包可以防止全局名称空间污染

有关详细信息,请参见此问题:

“闭包”是一个表达式(通常是一个函数),它可以将自由变量与绑定这些变量的环境结合在一起(即“关闭”表达式)

在您的情况下,这将如下所示:

(function($){
   var instances = [];
   function count(){
     alert(instances.length);
   }

   function hide_parent(){
     for(var i=0;i<instances.length;i++){
       $(instances[i]).parent().hide();
     }
   }

   $.fn.clickableImage = function(options) {

    // Use a class to prevent double bindings.       
    this
     .filter(':not(.clickImage)')
     .addClass('clickImage')
      // iterate through the DOM elements we are attaching the plugin to
     .each(function() {
        instances.push(this);
        $(this).click( function(){
          // Alert the current image count:
          count(); 
          // Hide all parents:
          hide_parent();
        })
      })

    return this;
  }
}(jQuery));

alert(typeof instances);// will return undefined

你的回答很正确。。。也许我简化了我的例子太多,因为我想做一些比提醒实例数量更复杂的事情。。。我将编辑我的问题并查看更新的答案。它允许您对共享实例执行任何您喜欢的操作:)@DiegoDorado我添加了您的“隐藏所有家长”示例。感谢您的帮助。。。也许我已经累了。。。无论如何,我最终定义了“类”来完成我所需要的。我意识到,如果一个插件不是为了解决一个共同的目的,而是为了一个特定的应用需要,那么它就没有意义了
$.fn.clickableImage = function(options) {
    // iterate through the DOM elements we are attaching the plugin to
    return this
      .addClass('clickImage')
      .each(function() {
      $(this).click( function(){
        $("img.clickImage").each(function(){
          $(this).parent().hide();
        });
        alert(instances_count);
      });
    });
}