jquery 虽然用起来非常方便. 但是 jquery内置的方法永远不能满足所有需求.

比如要高亮某些DOM元素. $(‘span.hl’).css(‘backgroundColor’, ‘#fffceb’).css(‘color’, ‘#d85030’); $(‘p a.hl’).css(‘backgroundColor’, ‘#fffceb’).css(‘color’, ‘#d85030’);

总是写重复代码可不好 万一以后要修改字体更麻烦. 能不能统一起来写个 highlight()方法. $(‘span.hl’).highlight(); $(‘p a.hl’).highlight();

答案是肯定的! 我们我们可以扩展jquery 来实现自定义方法. 这种就叫jquery 插件.

编写jquery 插件

jquery 通过 $.fn来绑定一个新方法.

编写第一个扩展: highlight() $.fn.highlight1 = function () { // this已绑定为当前jQuery对象: this.css(‘backgroundColor’, ‘#fffceb’).css(‘color’, ‘#d85030’); return this; }

注意到函数内部的this在调用时被绑定为jQuery对象,所以函数内部代码可以正常调用所有jQuery对象的方法

为什么最后要return this;?因为jQuery对象支持链式操作,我们自己写的扩展方法也要能继续链式下去: $(‘span.hl’).highlight1().slideDown(); 不然,用户调用的时候,就不得不把上面的代码拆成两行。

highlight 版本2

第一个版本不完美.用户想要自己指定高亮颜色怎么办: 给方法加个参数. $.fn.highlight2 = function (options) { // 要考虑到各种情况: // options为undefined // options只有部分key var bgcolor = options && options.backgroundColor || ‘#fffceb’; var color = options && options.color || ‘#d85030’; this.css(‘backgroundColor’, bgcolor).css(‘color’, color); return this; }

*对于默认值的处理,我们用了一个简单的&&和   短路操作符,总能得到一个有效的值。*

highlight 版本3

紧接着用户对highlight2()提出了意见:每次调用都需要传入自定义的设置,能不能让我自己设定一个缺省值,以后的调用统一使用无参数的highlight2()?

也就是说,我们设定的默认值应该能允许用户修改。 那默认值放哪比较合适?放全局变量肯定不合适,最佳地点是$.fn.highlight2这个函数对象本身。

$.fn.highlight = function (options) {
    // 合并默认值和用户设定值:
    var opts = $.extend({}, $.fn.highlight.defaults, options);
    this.css('backgroundColor', opts.backgroundColor).css('color', opts.color);
    return this;
}

// 设定默认值:
$.fn.highlight.defaults = {
    color: '#d85030',
    backgroundColor: '#fff8de'
}

这次用户终于满意了。用户使用时,只需一次性设定默认值: $.fn.highlight.defaults.color = ‘#fff’; $.fn.highlight.defaults.backgroundColor = ‘#000’;

然后就可以非常简单地调用highlight()了。

最终,我们得出编写一个jQuery插件的原则:

  1. 给$.fn绑定函数,实现插件的代码逻辑;
  2. 插件函数最后要return this;以支持链式调用;
  3. 插件函数要有默认值,绑定在$.fn.<pluginName>.defaults上;
  4. 用户在调用时可传入设定值以便覆盖默认值。