从“jquery”这个名字就能看出,用css/xml选择器查询页面元素,是这个javascript库赖以起家的绝活,最早可以追溯到dean edwards的cssquery,和simon willison的getelementsbyselector,但是在那个上古时代(史料记载中无正式名称,我们可以称之为“age of the first bubble”,或者“dhtml era”,虽然也有学者认为希腊神话中描述的黑铁时代(iron age)就是指那段时间……dojo创始人alex russell,以及prototype创始人sam stephenson,都是来自那个时代地淫~),面对恶劣的浏览器环境和粗糙的web应用,这些选择器的实现只能被当作geek的实验,没有应用市场。而到了05年,世界已经进入web2.0和ajax的新纪元,84年出生的天才少年john resig(555跟我同年~>_<~)在先行者的启发下(必须承认d edwards老爷“启发”了很多人……自己的作品却没机会进入主流)开始探索选择器技术,一年后的1月15日(没错今天是jquery三周年生日)就在纽约的barcamp上正式发布了第一版的jquery,迅速红遍全球,流行程度堪比摇滚巨星(我就很喜欢jquery去年发布1.2.6时搞得那个摇滚主题的主页哑!)
在jquery的影响下,选择器逐渐变成了javascript开发的主流需求,其他的库不进则死,都匆匆引入选择器,比如dojo.query,yahoo.util.selector.query,$$……甚至各大浏览器厂商也开始实现w3c最新的selectors api标准(包括safari3.1、firefox3.1、ie8 beta,居然连ie也实现了耶!可见这个现象的反常程度……)
但是当选择器的实现变得无处不在五花八门的时候(我以前做的jquery迷你版里也有一个自己实现的选择器-___-b),开发者们又有了新烦恼,他们需要统一的,能平稳迁移/升级的接口,需要最高效的实现,随着w3c selectors api的实现,统一标准也变得更加重要和紧迫,于是john resig就像武林盟主一样站出来开发了一个纯粹而高效的选择器引擎——sizzle,并主动贡献给prototype, dojo, mochkit等各大门派,jquery1.3是第一个采用sizzle的正式产品,可以看到速度有显著的提升,今后的发展非常令人期待。
sizzle反映了一种新趋势,随着javascript库的逐渐成熟,一些功能开始被分离出来设计成独立维护的引擎/核心。实际上现在的主流库里,有很多代码都互相借鉴,并采纳blogsphere里讨论出的最新最好的实现方法,比如jquery的dom ready方法就可以明显看到这种演进,而那些涉及跨浏览器的实现和bug fix,尤其容易趋向于统一。有机会产生通用引擎的领域,除了css选择器,可以预见的还有2d/3d绘图引擎(封装canvas,vml或svg),模板引擎,对象映射,文本解析,动画,运动和定位相关的计算,还有一些基础代码,比如迭代器。
不过关于选择器,还有一点必须指出的是,无论选择器发展的多么高效,即使有一天能完全当作native实现来对待,也不能过度的依赖它来完成任务,满足于写一些脚本式的代码,而忽视javascript语言本身的算法,数据结构和模式。这个道理其实就类似php和mysql的关系,php作为服务器端专业的web开发语言,有大量开发工作是围绕着数据来进行,而强大的mysql已经实现很多针对数据查询的算法和逻辑,加上php本身与其说是一门语言,不如说是工具包,导致很多初心的php程序员简单的依赖于mysql,编程能力普遍不高,进而损害到了php程序员的平均工资……
从这个角度上来讲,javascript跟php非常相像,虽然javascript本身是一门强悍而集大成的语言(记得上次去帝都参加sd2c时,天际网的cto郭应寿说“喜欢技术的人不可能不喜欢javascript”),但是多数时候都被限制在浏览器的sandbox里,曾经一度沦为真正的“脚本语言”,多亏浏览器后来施舍了dom和xhr,才让javascript有了用武之地,所以js在很大程度上也是围绕着dom在编程,dom是前端最重要的数据结构,有了强大的选择器工具,很多需求只要反复调用选择器,写几串脚本式的代码就能实现,如果满足于这种开发方式,不站在更高的角度去设计和构建应用,对于自己和自己的工作都可以说是非常危险的。
另外,设计良好的html,重要性相当于后端的数据库设计,可以让选择器的使用变得更高效,并直接影响js的设计模式。我在一些项目中非常喜欢这样的理念:在保证语义和简洁的前提下,让html成为一种配置文件,当需求有变化,或是在一些可复用的场合,只需要简单的编写html,就能自动实现相应的程序逻辑。对于选择器的使用,还存在另一种截然相反的设计方式:在有些情况下,需要让javascript和html尽可能的解耦合,让同样的代码可以适应灵活变化的html结构,并尽可能减少dom操作,具体的例子会在下篇文章中给出。
其实本来今天最想写的是jquery1.3中新增的live events,因为土豆网全局js里正好有一个自己实现的方法$.fn.eventproxy,两者基于同样的设计模式,明天有空的时候再写算了,这篇就当作向三岁的jquery致敬。
新闻热点
疑难解答
图片精选