尽管jQuery选择器引擎Sizzle非常复杂,功能也非常强大,但是它们都是建立在JavaScript已定义的方法或属性基础上来实现的。这主要包括元素的getElementsByTagName()和getElementById()方法,以及元素的childNodes、firstChild、lastChild、nextSibling、parentNode和previousSibling属性。借助这些方法和属性可以直接或间接地选择相匹配的DOM元素。
为了方便讲解,我们结合一个选择器进行说明。选择器代码如下所示。
广州网站建设,网站建设,广州网页设计,广州网站设计
- $("div.red");
这是一个复合选择器,一般读者可以这样分析:在DOM文档树中找到class属性等于"red"的div元素。即一步到位,直接从DOM文档树中选择所需要的元素。实际上,如果根据选择器引擎的工作方式,可以把这个字符串拆分成两步走。
第一步,根据document.getElementsByTagName()方法选择文档树中的div元素集合。
第二步,根据其class是否等于"red"进行判断,把不等于该值的元素从结果集中去掉。
不仅是这个选择器,对于所有形式的复合选择器,都可以根据这种思路来拆分选择器,然后分别完成每一部分的操作。
不过,对于jQuery选择器引擎来说,不同版本在设计思路上也存在一些细微的区别。例如,针对下面的选择器:
广州网站建设,网站建设,广州网页设计,广州网站设计
- $("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也可以转换为属性选择符进行操作。



