选择jQuery的n个理由
发展迅速且开放的技术领域的开发者想找一个工具、框架、方案、代码库(不管你称它为什么),烦恼的往往不是找不到,而是选项太多。Web开发人员挑选JavaScript库时的处境正是如此。Prototype、jQuery、dojo、YUI、Ext JS、Montools……让人眼花缭乱。因而在应用某一个脚本库之前,还多了一项选择的工作。
很容易构想出一系列选择的标准。比如:
- 功能要全面,基本能满足开发之需要。如果用了一个脚本库,还时常发现所需的方法其中没有,要自己来写,那就失去了应用一个脚本库的意义。
- 质量要成熟,即bug少。如果省去的自己写函数的时间还不如调试和纠正现成代码中bug的时间,那谁也不会选这样一个脚本库。
- 应用要广泛,对于管理人员来说,这样的技术开发人员更易找到;对于开发人员来说,教程、资料更丰富,便于学习,且网上的论坛、日志、样例更多,遇到问题更容易解决。
- 对于国外的开发者或者重视版权的企业,脚本库所用的协议也是重要因素。
- 还有一点很重要的就是脚本库本身的风格和特点,开发人员主观上是否习惯和喜欢主要取决于此。
- 此外还有性能、活跃度等等考量因素。
jQuery从迅速成为热门,发展至今,仍然是脚本库的主流选择之一。本文就分析一下它的几个特性。其中有些是优点,就像香蕉不用洗剥皮就可以吃;有些是大量脚本库的共性,就像香蕉和苹果、橘子一样,价格便宜,随处可以买到;有些是特点,就像香蕉味道甜,喜欢味道酸的人就更喜欢吃李子之类。
本文基于笔者不算丰富的web开发经验和有限狭窄的对脚本库的观察,绝不是没有偏见和全面的分析,只希望对那些想选择一个脚本库又对jQuery有兴趣的人有些帮助。从另一个角度也可以说是对jQuery特点的分析。
1. 范围
范围界定的是一个脚本库的功能所覆盖的区域,它由开发者的目标决定,直接影响项目的复杂程度和应用范围。简单地说,就是一个脚本库的功能有多广。这个问题看似容易回答,功能当然越多越好。但实际上范围广的直接效果就是更复杂的体系和更长的学习时间。从经济的角度考虑,紧紧围绕开发中的核心需要从而小巧实用易学的脚本库更有吸引力。jQuery的定位正是如此,学会jQuery不用买书一文里已经列述了它覆盖的紧凑范围,这样的好处就是jQuery的结构简单,籍API和样例很容易就能理解掌握。相对地,诸如dojo、Ext JS的脚本库覆盖的范围就广得多,它们定位为“框架”(framework),扩展到命名空间、类的层次这样一个复杂的体系才能包容。这就导致学习它们除了从实例入手,还要掌握它们的编程理念、方法和结构。使用时也更加麻烦,比如dojo的功能被细分到包(package),有时很常用的功能也需要特别声明引用某个包。用户界面的功能也是范围主要的考量方面。JavaScript重要和成功应用之一就是在网页上构建出远超出HTML控件范围的和用户友好高效互动的丰富控件(control/widget)。但是如果像dojo和Ext JS之类包含庞大的控件集合,脚本库的体积和结构就会变得巨大和复杂。jQuery中用户界面功能的部分单独存在于jQuery UI脚本中(http://jqueryui.com/),并且包含的功能(features)也是常见和有用的互动功能(interactions)、控件(widgets)和效果(effects),不像前两者那样显得无所不包。
2. 理念
理念(philosophy)对于一个基础的工具库很关键。它是构建整个库的核心思想,从根本上决定了应用它的体系的特点。微软的ASP.NET开始的版本为了浏览器端的编程,试图将.NET语言行为和基本类库移植到JavaScript,也就是用JavaScript建构了一套模仿命名空间、类、继承的系统。相反jQuery因据JavaScript语言本身的语法规则和特点,设计出一套简洁高效的工具。实践证明相比前者的削足适履,后者更有吸引力,微软也从Visual Studio 2008起加入对jQuery的智能感知(intellisense)支持。作为一种在客户端运行的动态的、弱类型的脚本语言,JavaScript在很多方面与Java、C#这些流行的服务器端语言不同,它采用的是基于原型(prototype)的面向对象机制,支持数组和对象的原义(literal)表示,函数是一类对象(first-class object)。有效利用这些特点正是jQuery等脚本库成功的原因。
3. 简洁的命名
方法的命名之简洁也是jQuery的一大特色。表意清晰、直观和简洁和遵循英语语法(比如名词的单复数,动词的第三人称单数屈折)是编程中给各种变量、函数和类型等命名的通行原则。在给被调用的系统性模块命名时,尤其强调表意清晰,有时会牺牲简洁性显得冗长。就以DOM接口的方法命名为例,有getElementsByName、getElementsByTagName、getElementById、addEventListener、setAttribute。再看看jQuery里实现对应功能的方法名称,$、on、attr。考虑到JavaScript因为是弱对象的,通常的编辑器都没有智能感知这样的辅助输入功能,极简的方法名称省去了程序员不少敲键和相应的输入错误的可能。
4. 特色
这里说的特色狭义地指jQuery API的特点。最明显的就是jQuery的大部分功能都是围绕一个jQuery对象。这个对象就是向jQuery()或$()传入各种选择字符串获得的包含被选中的HTML元件(element)的对象,它是一个封装器(wrapper),为所包含的HTML元件替换和补充了更简洁更强大的方法。更加神奇的是,对它调用各种方法都会对它包含的所有元件执行,并且返回的仍是这个对象。这就使得对不论一个还是多个页面对象的搜索获取、处理、取属性值、添加事件响应程序等一系列常见任务能极为高效简洁的用甚至一行代码写完。比如下面的例子:
$( "#actionBar input").attr("disabled", false).val("Click Me").on( "click", function() {
alert( $( this ).text() );
});
必要时也可以很容易的用一个索引返回其包含的原始DOM对象:$("#pager a").get(0);
总而言之,jQuery的标语很好地概括了它的特点——写得更少,做得更多(write less, do more.)。这种特征体现在jQuery从理念到代码的每一个方面,是它的活力来源,也是它大行于web被无数人选择的原因。