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

时间:2012-08-11 20:24:13

标签: javascript jquery jquery-plugins

我想在jquery插件实例(我创建一个)之间共享属性和方法 我该怎么做呢?

我有一个简单的插件定义为:

// 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”?

1 个答案:

答案 0 :(得分:2)

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

详情请见此问题:What exactly does "closure" refer to in 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

你也可以添加一个课程并为你的班级搜索dom:

$.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);
      });
    });
}