首页 新闻 会员 周边

请教jQuery选择器的执行顺序问题

0
悬赏园豆:40 [已解决问题] 解决于 2012-02-20 11:46

刚才看到一篇博文(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选择器在选择元素时,为了提高效率有的是自左向右查询,有的是自右向左查询,不知道理解的对不对,请问有没有什么比效详细的规则?

artwl的主页 artwl | 专家六级 | 园豆:16736
提问于:2012-02-16 10:01
< >
分享
最佳答案
0

老大又来散分来了

jquery 的选择器有ID、标签、name、dom、样式、还有前面几种的组合选择方法,再有就是过滤了。

但是根本还是操作dom结构,dom结构清楚了,就了解规则了

收获园豆:40
az235 | 大侠五级 |园豆:8483 | 2012-02-16 10:52

可能是我没表达清楚,我想问的是jQury选择器什么时候从左向右解析,什么时候从右向左解析

artwl | 园豆:16736 (专家六级) | 2012-02-16 10:54

@artwl: 不按左右解析,按dom结构解析,这是需要对dom结构进行定位的

az235 | 园豆:8483 (大侠五级) | 2012-02-16 10:57
其他回答(1)
0

个人觉得有点个人觉得,可以这么想:如果查找对象比较模糊的,会优先自右向左查:

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元素,算法结构上来说,如果逆向刷选的话,就繁琐了很多了

nickel | 园豆:338 (菜鸟二级) | 2012-05-22 21:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册