今天看了jQuery源码分析中的选择器部分。之前一直以为与css一样是从右向左选择,今天才知道要分情况。用下面这个例子进行分析说明:
(1)$('div button:first') :first是位置过滤器,div下所有button中的第一个,只匹配一个元素
(2)$('div button:first-child') :first-child是子元素过滤器,每个div下button中的第一个,为每个父元素div匹配一个子元素button(准确的说,button必须是div的第一个子元素才会匹配)
对$('div button:first')试试从右向左:
(1)选择查找button:first,先根据tag找出所有button,然后用集合过滤器找到第一个button
(2)第2步?没有第2步!第1步已经错误,第一步找的是所有button的第一个,而我们要找的是div下的button中的第一个
:first和:first-child的过滤对象有什么区别:
:first的过滤对象是'div button'的查找/过滤结果,依赖于前一个块表达式
:first-child的过滤对象是'button'自身,要检查'button'是否其父元素下的第一个元素,通过'button'本身就可以执行这个过滤,因为通过'button'就可以定位到父元素,然后再检查过滤到的'button'的祖先是否div
$('div button:first')的工作流程应该是从左向右:
(1) 找到div
(2)找到所有div下的所有button
(3)找到所有button中的第一个
可见从右向左不是万能的,必要时仍然需要传统的从左向右,什么时候需要从左向右呢?
答案是有位置过滤器的时候。
因为位置过滤器所在的块表达式的过滤结果,依赖于它前一个的块表达式查找/过滤的结果,所有要先查找/过滤前一个,即从左向右;而其他过滤器仅依赖于当前元素本身。