依赖于jquery写js组件库的时候,每个组件其代码结构应该相同。这样开发者学习的时候就能很方便理解其实现原理。jQuery插件的写法各式各样,下面一个常用的大体框架,记录在此,以备查阅。

1 (function(){
2 function _init(){}
3 function _render(){}
4 function _afterRender(){}
5 function buildEvent(self) {//创建事件监听
6 }
7 function purgeEvent(self) {//删除所有事件监听
8 }
9 function _myFunction(self, arg){//私有方法
10 }
11 var publicMethods = {
12 //这下面都是对外公布的api方法
13 options : function(p) {
14 var options = $.data(this[0], "myplugin").options;
15 if (p) {
16 $.extend(options, p);
17 }
18 return options;
19 },
20 myFunctionApi: function(arg) {
21 this.each(function(){
22 _myFunctionApi(this, arg);
23 });
24 }
25 };
26 var defaultConfig = {
27 //这里面写默认配置项
28 width : 'auto',
29 height : 'auto'
30 };
31 //插件的构造函数,这种写法会污染$.fn。如果强烈需要引入模块化加载机制,则可考虑seajs等等
32 $.fn.myPlugin = function(p) {
33 if (p && typeof(p) == 'string') {
34 if (publicMethods[p]) {//是api调用
35 return publicMethods[p].apply(this, Array.prototype.slice.call(arguments, 1));
36 }
37 return null;
38 }
39 return this.each(function() {//是创建组件
40 var tData = $.data(this, 'myplugin');
41 var options;
42 if (tData) {//存在tData则表示页面上已经有这个dom对象了
43 $.extend(tData.options, p);
44 } else {//否则要重新构建dom对象
45 options = $.extend({}, defaultConfig, p);
46 tData = $.data(this, 'myplugin', {
47 options : options
48 });
49 //组件相关数据缓存起来
50 $.data(this, 'myplugin').mysec= _init(this);
51 }
52 _render(this);//渲染逻辑
53 _afterRender(this);
54 buildEvent(this);//构建事件监听
55 });
56 };
57 })(jQuery);
主意该写法会污染$.fn,可能引起命名冲突。