最近有幸得到了一份项目上的前端封装的插件库代码,花了一个下午时间,仔细地研读了一下。对于我很想做自己的类库,搞自己的组件包很有启蒙意义。

相比较我之前阅过的框架或是类库,这份比较简单。

项目是jQuery加上bootstrap搞定前端,部分样式还借鉴与jQuery UI。

源码什么的,就不贴了。

先来看主要代码框架

var Ch = {
.....
} (function($){
....
})(jQuery) (function($){
....
})(jQuery) (function($){
....
})(jQuery) Ch.App = {
.....
init:function(){
this.A();
this.B();
......
}
}

每一个匿名函数中存放着一个bootstrap插件相关的js方法。在一一定义完之后,通过Ch.App将所有定义完的js方法,写上各自的初始化方法,最后页面上调用Ch.App.init()完成所有插件的初始化工作。
举其中一个匿名函数

(function ($) {
// "use strict";
/*
* 使用ul li结构的目录移动。使用时使用jQuery获取父节点的jQuery对象,然后使用tile方法就可以实现向上运动。
* tile可以接受参数
* 如果是对象:比如{speed:1000}形式的,将会修改默认属性
* 如果想停止运动,依旧调用tile方法,加入参数'stop',即可停止运动
* */
var Tile = function () {
this.settings = {
speed: 5000
};
}, tile = new Tile(); Tile.prototype.method = {
init: function () {
return this.each(function (index) {
var $this = $(this),
timmerId = (new Date()).getTime() + index,
_height = $this.find("li").outerHeight(true);
$this.data("timmerId", timmerId);
setTimeout(function () {
Chemon.timmer[timmerId] = setInterval(function () {
$this.animate({"margin-top": "-" + _height + "px"}, 750, function () {
$this.css("margin-top", 0)
.find("li:first").detach().insertAfter($this.find("li:last"));
});
}, tile.settings.speed);
timmerId = null;
}, index * 2000);
//timmerId = null;
});
}, stop: function () {
return this.each(function (index) {
var timmerId = $(this).data("timmerId");
console.log(Chemon.timmer[timmerId]);
clearInterval(Chemon.timmer[timmerId]);
timmerId = null;
});
}
}; $.fn.tile = function () {
var arg0 = arguments[0],
method = tile.method.init,
args = [];
if (typeof(arg0) == "object") {
tile.settings = $.extend(tile.settings, arg0);
} else if (typeof(arg0) == "string" && tile.method[arg0]) {
method = tile.method[arg0];
args = Array.prototype.slice.call(arguments, 1);
} else if (arg0) {
$.error("METHOD '" + arg0 + "' DOES NOT EXIST ON jQuery.Tile");
return this;
}
arg0 = null;
return method.apply(this, args);
}; })(jQuery);

细分为3块看:
第一块:构造函数

var Tile = function () {
this.settings = {
speed: 5000
};
}, tile = new Tile();

创建一个Tile函数,它其中有默认的属性settings,并且初始化构造函数。
第二块:构造器的原型

Tile.prototype.method = {
init: function () {
return this.each(function (index) {});
}, stop: function () {
return this.each(function (index) {});
}
};

在Tile的原型上加入了init和stop两个方法。这时实例tile可以通过原型访问这两个方法。
第三块:绑定到jQuery对象上

$.fn.tile = function () {
var arg0 = arguments[0],
method = tile.method.init,
args = [];
。。。
return method.apply(this, args);
};

$.fn指的就是$.prototype,在$的原型上定义了一个tile的方法,此时名为tile的函数作用域中定义了一个method成员,它指向的是实例tile的原型方法init,如何将这个我们自定义的方法绑定到jQuery对象中去,关键在最后一步,通过apply,其中this为调用tile的对象,method为原型方法init,则实现了方法拥有者的转移。
  具体每一个方法内部的实现就不解释了。纵观整个框架,比较容易理解。拓展性不是很强,与css的耦合太多。初始化js,需要很多html,css的配合。

内容不多,时间刚好。以上是本人读源码的一点体会,如有问题请指出,大家共同学习。

最新文章

  1. iOS调试
  2. Json转换利器Gson之实例一-简单对象转化和带泛型的List转化 (转)
  3. Hibernate+struts+JqueryAjax+jSON实现无刷新三级联动
  4. sql标准化的后缀
  5. (一)Redis初学教程之安装篇
  6. 解决JFreeChart中文乱码问题
  7. 温故而知新 C++ 数组与指针
  8. 《Programming WPF》翻译 第6章 2.资源与样式
  9. one Infos
  10. HDOJ1312<DFS>
  11. JBoss 主要模块
  12. 【Java入门提高篇】Day1 抽象类
  13. MySQL连接方式及大小写问题
  14. Beta 集合
  15. Kotlin For Android 示例代码实战
  16. B站资源索引
  17. centos7虚拟机下python3安装matplotlib遇到的一些问题
  18. vue2.0项目中 localhost改成ip地址访问
  19. 颠覆Git 命令使用体验的神器 - tig
  20. ubuntu wireshark找不到网卡及开启IP转发

热门文章

  1. springmvc freemarker 全局变量的三种配置方式
  2. git 批量删除本地分支
  3. oracle ---中文乱码问题
  4. Unicode 和 UTF-8关系
  5. Java微信公众平台开发(十二)--微信用户信息的获取
  6. Directshow 采集音视频数据H264+AAC+rtmp效果还不错
  7. Linux的基本指令shell
  8. 搭建J2EE开发平台-Eclipse+MySql+tomcat
  9. Unity抗锯齿的设置
  10. JAVA 微信开发