如何select元素的父代和父代的兄弟
我有这个代码:
$("#test").siblings('p').remove(); $("#test").remove();
我如何链接这个代码,而不是单独写它?
你想在这种情况下使用addBack() :
$("#test").siblings('p').addBack().remove();
编辑
首先,对于未来的访问者,如果你使用的是jQuery版本1.8,你可能需要使用addBack()的前身addBack()
来兼容性问题。
其次,在这种情况下, end
和addBack
将完成相同的任务,但实际上它们是不同的视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把dad
和son
推到同一个房间里,并为他们两个添加新的adult
和oldster
。
在利用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结果:
我必须同意对这个问题的评论。 为了可读性和可维护性,使用和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();