<ul>
<li>1</li>
<li title="a">2</li>
<li>3</li>
<li>4</li>
</ul>$("ul li:eq(1)").remove( ); // 删除了第2个,正常$("ul li").remove("ul li:eq(1)"); // 结果只剩下第4个li 为毛啊这步$("ul li").remove("ul li[title='a']"); // 删除了第2个,正常这是为何?
<li>1</li>
<li title="a">2</li>
<li>3</li>
<li>4</li>
</ul>$("ul li:eq(1)").remove( ); // 删除了第2个,正常$("ul li").remove("ul li:eq(1)"); // 结果只剩下第4个li 为毛啊这步$("ul li").remove("ul li[title='a']"); // 删除了第2个,正常这是为何?
这样写是删除li[0],li[1],也就是说删除li数组里1之前的。所以只剩下第四个Li了
$("ul li"),此时匹配的是li元素的集合,对这个集合使用remove()方法:
$("ul li").remove("ul li:eq(1)");,这样其实是找不到作为ul子元素的li元素的,至于想弄明白为什么只剩下最后一个li,要看remove()方法的实现代码了,应该说,你提供的这个参数是预料外的,执行变得不可预期也就不奇怪了。这样的需求,正确的写法是:
$("ul li").remove("ul li:eq(1)"); //错误
$("ul li:eq(1)").remove(); //正确
//或者
$("ul li").eq(1).remove();
//或者
$("ul").find("li:eq(1)").remove();
//或者
$("ul").find("li").eq(1).remove();有那么多正确的方法,为什么你非要选一个错误的?
同时我还发现jquery对象的filter实际调用也是jquery.filter方法,但是它在最后对seed遍历,看seed中的元素是不是在filter返回的结果中,是的话就保留(这是个描述,实际调用是jquery的数组操作函数grep)。最后返回这个grep过的结果,所以jquery对象的filter运行是正常的。
在jquery对象的filter函数中,调用jquery.filter后,有grep一下,看起来好像jquery的设计者是知道有上述问题的,要不然也不会闲着蛋疼再遍历一下。
这是我的一点看法,sizzle选择器工作实在是太难懂了,fb都跳死了好几次,还是没有研究透。但是有一点看出来了,有伪选择器和无伪选择器是在两个不同的执行分支中,这应该就是问题所在