刚才看到一篇博文(Sizzle引擎--原理与实践(一))中有下面一段话:
类似的情况还有jQuery自定义的几个位置查询表达式,所以
情况一、body div p:first自左向右的查询。先找到body,获得集合A,然后在集合A中查找div获得集合B,在集合B中查找p获得集合C,最后取集合C的第一个元素,得最终结果XX
情况二、body div p:first-child
自右向左的查询,先找到p:first-child获得集合A1,然后判断祖先元素里面是否有div获得集合B1,然后判断祖先元素里面是否有body获得集合C1,得最终结果C1
对比上面的两个过程,相较于过程一,过程二更像是一个过滤的过程,因此,Sizzle最大的亮点是自右向左过滤。
另外,为了提高查询效率,最重要的就是缩小查找范围和减少遍历次数。
一个典型的例子是:
div p
情况一、先找到p,获得集合A,然后判断祖先元素里面是否有div获得集合B,得最终结果B
div#a p
#a一般只会有一个,所以情况一里面p的范围太大了,所以如果第一个选择表达式里面含有id,Sizzle总是先查找第一个,从而缩小查找范围
情况二、先找到div#a,获得单个元素A1,然后再A1的环境中查找p,得最终结果B1
我对上面的理解是jQuery选择器在选择元素时,为了提高效率有的是自左向右查询,有的是自右向左查询,不知道理解的对不对,请问有没有什么比效详细的规则?
老大又来散分来了
jquery 的选择器有ID、标签、name、dom、样式、还有前面几种的组合选择方法,再有就是过滤了。
但是根本还是操作dom结构,dom结构清楚了,就了解规则了
可能是我没表达清楚,我想问的是jQury选择器什么时候从左向右解析,什么时候从右向左解析
@artwl: 不按左右解析,按dom结构解析,这是需要对dom结构进行定位的
个人觉得有点个人觉得,可以这么想:如果查找对象比较模糊的,会优先自右向左查:
ep:div p
1: 如果自右向左的话,第一次取出来的是全部的P元素集合A,从dom结构遍历顺序来讲,其祖先元素应该是先与P元素的,所以遍历过的先祖元素可以利用起来,把其先祖元素带进来;第二次过滤先祖元素非div的;第一次遍历整个dom就可以帅选出所要的结果;
2:如果是自左向右,第一次必须去遍历所有的div,因为从dom结构遍历的顺序来说,第一次不必遍历到其子集,而第二次则是从这些div中找出有子集元素为p的,找到最后结果集之后,还要逆向处理一次(刷选元素是p而不是div,之前遍历主体都是div);从算法结构上来讲比较繁琐
另外,div#a p精确查找的,第一次肯定是找到对象id为a 的div dom元素,然后找到其子元素中帅选p元素,算法结构上来说,如果逆向刷选的话,就繁琐了很多了