0 Comments

解析jQuery选择器引擎的设计思路

发布于:2013-06-01  |   作者:广州网站建设  |   已聚集:人围观
解析jQuery选择器引擎的设计思路

尽管jQuery选择器引擎Sizzle非常复杂,功能也非常强大,但是它们都是建立在JavaScript已定义的方法或属性基础上来实现的。这主要包括元素的getElementsByTagName()和getElementById()方法,以及元素的childNodes、firstChild、lastChild、nextSibling、parentNode和previousSibling属性。借助这些方法和属性可以直接或间接地选择相匹配的DOM元素。

为了方便讲解,我们结合一个选择器进行说明。选择器代码如下所示。

广州网站建设,网站建设,广州网页设计,广州网站设计
  1. $("div.red");  

这是一个复合选择器,一般读者可以这样分析:在DOM文档树中找到class属性等于"red"的div元素。即一步到位,直接从DOM文档树中选择所需要的元素。实际上,如果根据选择器引擎的工作方式,可以把这个字符串拆分成两步走。

第一步,根据document.getElementsByTagName()方法选择文档树中的div元素集合。

第二步,根据其class是否等于"red"进行判断,把不等于该值的元素从结果集中去掉。

不仅是这个选择器,对于所有形式的复合选择器,都可以根据这种思路来拆分选择器,然后分别完成每一部分的操作。

不过,对于jQuery选择器引擎来说,不同版本在设计思路上也存在一些细微的区别。例如,针对下面的选择器:

广州网站建设,网站建设,广州网页设计,广州网站设计
  1. $("div  p"); 

早期的jQuery选择器是根据下面的步骤进行解析的。

第一步,根据document.getElementsByTagName()方法选择文档树中的div元素集合。

第二步,迭代div元素集合,在所有的div元素中查找每个div元素下的p元素。

第三步,合并结果。

而Sizzle选择器适当调整了解析的顺序。

第一步,根据document.getElementsByTagName()方法选择文档树中的p元素集合。

第二步,迭代p元素集合,在所有的p元素中查找每个p元素的父级元素。

第三步,检测父级元素。如果不是div元素,则遍历上一级元素;如果迭代到文档树的顶层,则排除该p元素;如果是div元素,则保存该p元素。

经过比较可以看到,Sizzle选择器放弃了合并结果操作,直接在遍历过程中过滤元素, 所以导致查找速度大幅提升。

初步把握了jQuery选择器的基本工作原理,那么我们就可以了解jQuery在匹配元素时是如何工作的。例如,对于$("div[id=value]");选择器,可以知道JavaScript先匹配div元素,然后再判断div元素的id属性是否等于value,如果不等于就从结果集中删除掉。而对于$("div#value)");选择器也是一样,可以看到div#value与div[id=value]是完全相同的操作。同样,div.class也可以转换为属性选择符进行操作。

标签:
飞机