当前位置: 首页 > 图文教程 > 网络编程 > Javascript > jQuery1.3全新的Sizzle引擎实现CSS选择器

Javascript
csdn 博客的css样式 v3
javascript 常用代码技巧大收集
javascript div 弹出可拖动窗口
jQuery 使用个人心得
ajax 文件上传应用简单实现
用正则表达式 动态创建/增加css style script 兼容IE firefox
10个新的最有前途的JavaScript框架
自动完成JS类(纯JS, Ajax模式)
JavaScript 颜色梯度和渐变效果
IE6与IE7中,innerHTML获取param的区别
for 循环性能比较 提高for循环的效率
Ext javascript建立超链接,进行事件处理的实现方法
利用javascript移动div层-javascript 拖动层
jQuery 全选效果实现代码
一个tab标签切换效果代码
提取自百度有啊的css圆角效果
可左右平滑滚动的产品展示效果
响应鼠标变换表格背景或者颜色的代码
ymyang 绘图 实例代码
JS 单击连接保存图片的函数

Javascript 中的 jQuery1.3全新的Sizzle引擎实现CSS选择器


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 389 ::
收藏到网摘: n/a

John Resig老爷在twitter上宣布jQuery1.3正式发布,直接把2加到3反映了这个版本的重要性不同以往,除了重写很多重要方法——比如offset(获取页面上的各种尺寸和位置数据),创建和插入DOM节点(比如append, before之类,这些方法是JQuery以前速度上的瓶颈之一,我就完全不用它们,但是现在速度提高了6倍)——最重要的改变是启用了全新的Sizzle引擎来实现CSS选择器。

从“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致敬。