jQuery插件开发入门


前言

jQuery 插件开发包括两种:

  1. 给 jQuery 添加静态方法

  2. 给 jQuery 的原型添加方法

给 jQuery 添加静态方法

  1. 直接添加新的全局函数
jQuery.foo = function () {
  alert('This is a test. This is only a test.');
};
  1. 使用 jQuery.extend(object)
jQuery.extend({
  foo: function () {
    alert('This is a test. This is only a test.');
  },
  bar: function (param) {
    alert('This function takes a parameter, which is "' + param + '".');
  },
});

对于一些全局配置的插件,可以在插件中进行调用,这样直接引用插件 javascript 即可,不用再调用

给 jQuery 的原型添加方法

这是插件开发中最常用的一种方法

最简单的形式

(function ($) {
  $.fn.pluginName = function () {
    // code
  };
})(jQuery);

上下文

在插件函数的立即作用域中,关键字 this 指向调用插件的 jQuery 对象,不需要再用$包裹

(function ($) {
  $.fn.pluginName = function () {
    // 没有必要再写$(this),因为"this"就是jQuery对象
  };
})(jQuery);

保持链式调用

为了保持链式调用,插件请 return this。

设置默认参数并将之暴露出来

(function ($) {
  $.fn.pluginName = function (options) {
    var opts = $.extend({}, $.fn.hilight.defaults, options);
  };

  $.fn.pluginName.defaults = {
    foo: 'bar',
  };
})(jQuery);

这样用户既可以用过传参也可以通过修改$.fn.pluginName.defaults 来修改默认参数

暴露一些公有函数

(function ($) {
  $.fn.pluginName = function (options) {
    var opts = $.extend({}, $.fn.pluginName.defaults, options);
  };

  $.fn.pluginName.defaults = {
    foo: 'bar',
  };

  $.fn.pluginName.foo = function () {
    return 'bar';
  };
})(jQuery);

这样用户既可以调用公有函数,也可以去修改它。

更安全的闭包写法

(function ($, window, document, undefined) {
  $.fn.pluginName = function () {
    // code
  };
})(jQuery, window, document);

加上“;”是为了防止插件之前代码没有“;”引发的错误,加上 window 和 document 是这样 window 等系统变量在插件内部就有了一个局部的引用,可以提高访问速度,同时内部也可以压缩这些变量,undefined 是为了防止他人误修改 undefined 引发插件 bug。

更多

以下出自网友的博客

(function () {
  var Plugin, privateMethod; //插件的私有方法

  /**
   * 这里是一个自运行的单例模式。
   *
   */
  Plugin = (function () {
    /**
     * 插件实例化部分,初始化时调用的代码可以放这里
     */
    function Plugin(element, options) {
      //将插件的默认参数及用户定义的参数合并到一个新的obj里
      this.settings = $.extend({}, $.fn.plugin.defaults, options);
      //将dom jquery对象赋值给插件,方便后续调用
      this.$element = $(element);
    }

    /**
     * 插件的公共方法,相当于接口函数,用于给外部调用
     */
    Plugin.prototype.doSomething = function () {
      /**
       * 方法内容
       */
    };

    return Plugin;
  })();

  /**
   * 插件的私有方法
   */
  privateMethod = function () {};

  /**
   * 这里是关键
   * 定义一个插件 plugin
   */
  $.fn.plugin = function (options) {
    var instance;
    instance = this.data('plugin');
    /**
     *判断插件是否已经实例化过,如果已经实例化了则直接返回该实例化对象
     */
    if (!instance) {
      return this.each(function () {
        //将实例化后的插件缓存在dom结构里(内存里)
        return $(this).data('plugin', new Plugin(this, options));
      });
    }
    if (options === true) return instance;
    /**
     * 优雅处: 如果插件的参数是一个字符串,则 调用 插件的 字符串方法。
     * 如 $('#id').plugin('doSomething') 则实际调用的是 $('#id).plugin.doSomething();
     * doSomething是刚才定义的接口。
     * 这种方法 在 juqery ui 的插件里 很常见。
     */
    if ($.type(options) === 'string') instance[options]();
    return this;
  };

  /**
   * 插件的默认值
   */
  $.fn.plugin.defaults = {
    property1: 'value',
    property2: 'value',
  };

  /**
   * 优雅处: 通过data-xxx 的方式 实例化插件。
   * 这样的话 在页面上就不需要显示调用了。
   */
  $(function () {
    return new Plugin($('[data-plugin]'));
  });
}.call(this));

参考

A Plugin Development Pattern


文章作者: Angus
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Angus !
  目录