自定义 jQuery 插件

使用过 jquery.tips.js、bootstrap-fileinput 等插件后,思考这些插件时如何实现的呢,于是便有了如下的研究。

Note:仅仅只做基础演示与说明,项目具体内容请查看https://github.com/bascker/bootstrap.table.js

需求

一个 jquery 插件需要有自己的专业职能,如 jquery.tips.js 就负责信息提示,bootstrap-fileinput 是文件控件,负责文件上传的处理,那么我们自己的插件要做什么呢,那就做一个表格处理的功能吧。实现一个 BootStrap 风格的 jQuery 插件,能通过 js 注入表格数据,实现表格的自动生成。

实现

1 项目初始化

新建一个项目 bootstrap.table.js,其目录结构如下:

bootstrap.table.js
|- css                # 存放自定义 css
|- example            # demo
|- js                 # 存放自定义 js
|- lib                # 依赖库

先将依赖库(jquery, bootstrap, font-awesome)放入 lib 目录下,然后在 js 目录下新建一个 bootstrap.table.js 文件,首先加入如下代码:

// $ 是形参, jQuery 是传入给函数的实参
(function ($) {
    // ...
})(jQuery);

在自实现 jQuery 插件时,一般都使用(function($){})(jQuery) 代码来存放插件代码,相当于执行了var fn = function($){}; fn(jQuery)。这种写法最大的好处在于形成了闭包,从而使得在匿名函数内部定义的函数、变量只有在匿名函数内有效,形成了私有变量/函数的概念。

Note:这实际是 JS 匿名函数的写法,(function(arg){ })(param)

2 代码编写

项目基础设置完毕后,下一步开始添加自己的代码:

$.fn.table = function (option, data) {
    var $tb = this;
    var config = $.extend(true, {}, $.fn.table.defaults, option, {data: data});
    if (!config.columns) {
        throw new Error('Params Error!');
    }

    // ...
    var table = new Table($tb, config);
    table.init();
};

关键代码分析:

  • 其中$.fn.table = function(option, data) {}; 的函数声明就表明了,在调用 table () 函数时,需要传入 2 个参数 optiondata,其中 option 是我们 bootstrap.table.js 的配置,data 是表格的数据。
  • $.fn 实际上就是 jQuery.prototype
  • 利用 $.extend() 来合并用户输入数据以及自定义数据,形成最后的配置结果
  • table.init() 执行最后表格的自动生成

NoteTable 是自定义类,具体代码查看 https://github.com/bascker/bootstrap.table.js/blob/master/js/bootstrap.table.js

注意 bootstrap.table.js 的默认配置 $.fn.table.defaults 必须在 $.fn.table 声明之后,否则会由于 $.fn.table 尚未定义,从而抛出 Undefined 异常。

调用

当我们将$.fn.table丰富完毕后,就可以在 HTML 中调用了,跟调用普通 jQuery 函数一样即可。
1. 首先在界面中引入依赖库,然后引入bootstrap.table.js
2. 在 HTML 中加入 <table id='tb'></table>标签元素
3. 在<script></script>中直接执行 $('#tb').table()即可

小结

在编写自己的 jQuery 插件时,不仅能够学到许多的知识,而且可以认识到自己的不足,从而去弥补这些漏洞,因此可以尝试去实现一个属于自己的 jQuery 插件,融合自己所学。当然一个真正可用的 jQuery 插件,需要考虑到易用性、可扩展性、性能优化等非功能性需求,而不仅仅是完成基础功能而已。