个人认为 jQuery 很优秀,插件机制也很不错。为什么一定要用面向对象的思想去强调不属于面向对象语言范畴的 JavaScript 呢?面向对象真的有那么完美么?一切从简,提高性能的同时又可以方便扩展不好么?
呃,速度的夸下 jQuery, 嘿嘿。
1. 背景
1.1. jQuery 简介
1.1.1. 简介
jQuery 是一套跨浏览器的 JavaScript 框架,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在2006年1月的 BarCamp NYC 上发布。目前全球访问前10000名的网站中已有超过
41%的网站正在使用 jQuery, 其中包括 Google, Digg 以及 WordPress,它是目前最受欢迎的JavaScript 框架。其宗旨是—— WRITE LESS, DO MORE。除此之外,它的文档很完善,而且各种应
用的说明也很详细,同时还有许多成熟的插件可供选择。
1.1.2. 特点
Ø 跨浏览器的 DOM 元素选择
Ø DOM 遍历及修改(包括对 CSS 1-3 的支持)
Ø 事件
Ø CSS 操作
Ø 特效和动画
Ø Ajax
Ø 可扩展性
Ø 轻量级
Ø JavaScript 插件
Ø 常用工具
1.2. jQuery 插件简介
1.2.1. 简介
jQuery 除了提供简单有效的 DOM, 元素和各种脚本的管理方法外,还提供了添加方法和额外功能到核心模块的机制。由于这种机制,我们能够创建新的代码,然后在任何时候添加到我们应用中需要使用到的地方。这样就可获取一个可重复使用的资源,在其他页面或项目中,我们就不需要再去编写它。使用这种结构创建的附加方法和功能将可作为插件进行捆绑。通过插件开发者自己或其他人以某种方式发布后,它们便可在新的 jQuery 脚本中被使用。
1.2.2. 特点
- 保持链式
e.g. $(“.className”).css(“font-size”, “22px”).table().dialog();
- 与 jQuery 风格保持一致
- 重用性
- 移植性
打包一个普通的方法到 jQuery 插件中,通常会更方便:这将允许你在短时间内简单的整合插件到任何项目中。
- 抽象化
创建并使用插件,可使你更加专注于重点,而不是细节。允许对固定的常量进行单独指定和扩展。
- 节约时间
开发者:基于成熟稳定的插件机制,不需关注整个架构,只需实现所需方法和事件。
使用者:一句代码就可实现你所需的。
- Containment(遏制)
命名空间和作用域在 JavaScript 中是两个非常重要的特性。创建 jQuery 插件意味着功能将被逻辑的加载,只要你熟练,可减少作用域或命名空间的冲突概率。
- 强大的社区支持
- 大量的各类插件和完善的文档
- 不需额外进行管理,避免管理不适导致内存泄露等问题
1.2.3. 工作原理
方法被添加到库中后,当需要使用时,可通过 jQuery 对象中 ‘this’ 对象进行调用。 DOM 节点元素可根据需求被进行相应的管理,按照需要,其方法可返回 ‘this’, 继续进行链式。
2. 插件架构体系
2.1. 架构体系要点
Options, Events, Methods 是前端开发中重要的三个方面,在编写任何一个插件时,都应从这三方面进行设计和考虑。 jQuery 的插件机制不但从 Options, Events, Methods 为开发人员做了考虑,而且在整个插件的管理上也做了相应的维护和管理,完全不需要从零开始设计架构,验证架构,遭受新架构不合理所带来的损失。因此针对一个基于 jQuery 的插件,只需要设计定义好 Options, Events, Methods,便可交给编码人员进行编码。
2.1.1. 整体架构
(function( $ ){
var myPluginObj = {
this._defaults = {};
this.settings = {};
init: function () {};
destroy: function () {};
};
$.fn.myPlugin = function (options) {
return this.each(function () {
});
};
})( jQuery );
2.1.2. Options
复杂和一些自定义的插件会提供很多的 options。此方面的最佳实践为:插件本身带有默认的设置值,当调用的时候通过 $.extend 进行options 和 settings 的扩展。示例如下:
$.extend(settings, options);
2.1.3. Methods
可把插件所需要使用的到方法收集到一个对象中,然后通过指定的参数进行调用。这样对方法的扩展也就演化为对对象的扩展。示例如下:
var methods = {
init : function (options) {},
show : function ( ) {},
hide : function ( ) { },
update : function (content) {}
};
return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
2.1.4. Events
事件需和某一元素进行绑定,在满足特定的情况下被触发。可使用 jQuery 中的 bind 进行绑定,它允许使用命名空间对事件进行绑定。在插件中使用命名空间进行事件绑定是一个很好的实践。这样一来,当你需要 unbind 的时候,就不会被同类型的其他事件所干扰,错误的解除绑定。示例如下:
$(“.className”).bind(“resize.tab”, method);
$(“.className”).unbind(“.tab”);
2.1.5. Data
通常在插件开发的时候,当所给元素被某个插件初始化后,它的一些状态或验证需要被维护住。用 jQuery 中的 data 来为每一个元素维护自己的特有变量同样是一种很棒的实践。示例如下:
// target: 元素本身
// inst: 元素本身需维护的数据
$.data(target, MY_PLUGIN_NAME, inst);
2.1.6. Theme
同一个页面中的同一种插件,可能会要求有两种以上不同的皮肤,而 jQuery 中只允许一种。本框架解决方案如下:
在 _defaults 中存在一个 styleClass 对象,记录需要用到的 className,如:”closeIcon”: “tabs-close-icon”。对应不同的主题,经处理后,在调用 styleClass.className 时会返回相应的 className-theme,如:当 theme 为 red 时,调用 styleClass.className 时,将返回 tabs-close-icon-red。
因此当需要两种以上皮肤时,根据指定的 theme 编写不同 class 的样式即可。
2.2. 插件开发步骤
2.2.1. 需求
- 提出需求
- 需求分析
- 确定需求
- 确定边界条件
2.2.2. 插件设计
- 确定可配置项,设计出 Options
- 确定每一个元素需绑定的事件,设计出 Events
- 分解需要用到方法的可共用的方法,分析设计出 methods 对象
2.2.3. 插件编码
根据现有框架体系,按照插件设计结果分别进行 Options, Events, methods 的相应套用,搭建出需开发插件的整体框架,然后便可进行细节编码。
2.3. 可扩展性解决方案
- jQuery 1.5 支持子类,继承
- 对方法的扩展等同于对 object 的扩展,参见 2.1.3
- 对事件扩展可使用 bind
- 对 options 扩展可结合 $.extend 并相应的修改 settings/_defaults
2.4. 扩展阅读——JavaScriptMVC
2.4.1. 定义:
JavaScriptMVC 是一个使用 jQuery 进行中型或大型前端项目开发的开源框架,其更加专注于代码的质量、性能和可维护性。
2.4.2. 特点
- 单元测试(尤其是自动化与功能性的测试)
- 文档生成
- 分解代码到经逻辑组织的文件中
- 合理压缩及合并 JavaScript 文件
- 使用和组织前端模板
- 制作插件具备自动清理、组织性强、可扩展性高的特点
- 错误报告
3. 总结
目前全球访问前10000名的网站中已有超过41%的网站正在使用 jQuery, 其中包括 Google, Digg 以及 WordPress,而其插件的开发也越来越普及和通用。这是为什么呢?经过5年的时间洗礼,它依然经久不衰,反而越来越火,这又是为什么呢?
面对 jQuery,其易用性、浏览器兼容性等各方面的优势无话可说。面对 jQuery 插件,它不仅拥有完善的社区和文档支持,众多的各类插件,而且在编写 jQuery 插件时允许开发人员创建大量额外的库,抽象最具技术含量和有用的功能进行重用,最终可节约开发人员的时间并使开发更加有效。
因此我们显而易见的便可看到 jQuery 插件的优势,它不仅能使我们更加容易的编写插件,专注于技术细节层面,而且还能使我们的代码更加健壮。