<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个,正常这是为何?

解决方案 »

  1.   

    $("ul li").remove("ul li:eq(1)"); // 结果只剩下第4个li 为毛啊这步
    这样写是删除li[0],li[1],也就是说删除li数组里1之前的。所以只剩下第四个Li了
      

  2.   

    你对remove()的参数的理解有问题吧,这样写是不规范的,remove()可以接受一个选择器表达式参数,起到一个过滤对象集合的作用。
    $("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();有那么多正确的方法,为什么你非要选一个错误的?
      

  3.   

    回3楼 1之前不是0吗 怎么会删除到1,2,3呢回4楼 $("ul li").remove("ul li[title='a']")这样不也可以吗 怎么叫不规范呢
      

  4.   

    看了几个小时的源码 remove其实调用的是jquery.filter(expr,seed) 但这个方法在有伪选择器的时候,好像是压根忽略了seed的这个范围,无论是楼主的eq(1),还是:first :even,都会直接返回expr匹配的值,而不是在seed中在查找。这个不知道是不是实现上bug
    同时我还发现jquery对象的filter实际调用也是jquery.filter方法,但是它在最后对seed遍历,看seed中的元素是不是在filter返回的结果中,是的话就保留(这是个描述,实际调用是jquery的数组操作函数grep)。最后返回这个grep过的结果,所以jquery对象的filter运行是正常的。
    在jquery对象的filter函数中,调用jquery.filter后,有grep一下,看起来好像jquery的设计者是知道有上述问题的,要不然也不会闲着蛋疼再遍历一下。
    这是我的一点看法,sizzle选择器工作实在是太难懂了,fb都跳死了好几次,还是没有研究透。但是有一点看出来了,有伪选择器和无伪选择器是在两个不同的执行分支中,这应该就是问题所在
      

  5.   

    最近研究了这个问题,具体情况见我的博客 http://blog.csdn.net/sencha_android/article/details/6706263