如何select元素的父代和父代的兄弟

我有这个代码:

$("#test").siblings('p').remove(); $("#test").remove(); 

我如何链接这个代码,而不是单独写它?

你想在这种情况下使用addBack() :

 $("#test").siblings('p').addBack().remove(); 

编辑

首先,对于未来的访问者,如果你使用的是jQuery版本1.8,你可能需要使用addBack()的前身addBack()来兼容性问题。

其次,在这种情况下, endaddBack将完成相同的任务,但实际上它们是不同的视angular。 看看这个HTML:

 <div class="grandpa"> <div class="dad"> <div class="son"> Test </div> </div> </div> 

如果我们使用end()

 $('.grandpa') .find('.dad') .find('.son') .addClass('youngster') .end() .addClass('adult') .end() .addClass('oldster'); 

结果将如下所示:

 <div class="grandpa oldster"> <div class="dad adult"> <div class="son youngster"> Test </div> </div> </div> 

所以当我们使用end()son ,我们告诉jQuery它需要从son返回到父亲集,这是dad并添加类adult

但是当我们使用addBack

 $('.grandpa') .find('.dad') .find('.son') .addClass('youngster') .addBack() .addClass('adult') .addBack() // This simply do nothing since `addBack` is not traverse up DOM element .addClass('oldster'); 

这将导致这样的结果:

 <div class="grandpa"> <div class="dad adult oldster"> <div class="son youngster adult oldster"> Test </div> </div> </div> 

所以当我们给son调用addBack时候,我们告诉jQuery把dadson推到同一个房间里,并为他们两个添加新的adultoldster

在利用jQuery的链接属性时, end()方法是非常有用的。 当不使用链接时,我们通常可以通过variables名称调用以前的object ,所以我们不需要操作堆栈。

新的一组元素被压入到维护在object内部的堆栈中。 每个连续的过滤方法都将一个新的元素集推入堆栈。 如果我们需要一个较老的元素集,我们可以使用end()将集合从堆栈中popup。

我想用这样的使用.end()

 $("#test").siblings('p').remove().end().remove(); 

你可以find一个小提琴


一些解释:

现在上面的代码片断发生了什么:

假设这个HTML标记:

 <div id='container'> <div id='test'>This is supposed to be removed.</div> <p>And this to be removed too.</p> </div> 

当脚本执行时:

 $("#test").siblings('p').remove() 

这个块从视图中删除兄弟项目<p> ,那么标记将被更新如下:

 <div id='container'> <div id='test'>This is supposed to be removed.</div> </div> 

如果我们将它与.end()

 $("#test").siblings('p').remove().end() 

它在#test div回到堆栈,然后脚本的下一部分被触发

 $("#test").siblings('p').remove().end().remove(); //--^^^^^^^^^^^^^^^----this next part 

#test从视图中移除,你的最终标记输出将如下所示:

 <div id='container'> </div> 

可能是closures的话题..你可以改变问题的看法:

 $("#test, #test ~ p").remove(); // !! incorrect way, see comment below 

伙计们对不起(我的决定是不正确的!

select器' '不等于' 兄弟 ' – 方法。 ' 'select所有在' #test '元素之后的兄弟' p '元素。

所以我build议另一个决定:

 $("#test, > p", $('#test').parent()).remove(); 

这是不够的优雅,但最快的方式。 请检查它' http://jsperf.com/how-to-chain-this-code-stackoverflow-16009101 '

性能testing结果:

性能测试结果

PS http://jsfiddle.net/Dpe59/

我必须同意对这个问题的评论。 为了可读性和可维护性,使用和andSelf

 $("#test").siblings('p').andSelf().remove(); 

不幸的是,它已被弃用。 但是如果你像我们一样被困在一个老版本的jQuery中,这可能是值得的。

 $("#test").siblings("p").siblings("#test").remove(); 
 $("#text").siblings('p').remove().prevObject.remove(); 

编辑:虽然这个工作,不要这样做。 正如马特的评论所说, prevObject是无证的

尝试这个 :

 $("#test").siblings('p').addBack().remove(); 
Interesting Posts