2010-03-03 168 views
41

有没有更好的方法来选择jQuery中的祖父母元素,以避免这种情况?jQuery:选择祖父母

$(this).parent().parent().parent().parent().parent().children(".title, .meta").fadeIn("fast"); 

谢谢。

+1

和孩子()。children()。children()。children(“。title”)? – aneuryzm 2010-03-03 15:35:01

+0

无法抗拒,您可以使用$(this).gparent(2)与我的downvoted答案中提供的代码。不知道为什么它是downvoted,因为它是解决方案,回答你的问题... – patrick 2018-01-18 11:46:26

回答

1

使用parents()您可以使用它匹配家长对选择

http://api.jquery.com/parents/

还是parents()方法选择器获取元素的所有父项。然后,您可以搜索该集合,或者如果要影响所有祖先,可以对其进行迭代。

20

除了parents(),正如他们所说,你也应该check out closest()。在那里的文档中阅读比较,但它的主要区别在于它只搜索一个结果,它包括$(this)它的搜索结果(如果你不够详细,可以从中找到你要搜索的东西)。优点和缺点。

5

我写了这个简单的插件,因为我认为我有一个明确的类选择某处给我的错误。对于这种特殊情况,选择祖父母似乎比$().parents()更直接。

那么,我用这一次然后意识到我实际上有一个拼写错误。不知道它真的有多大帮助。 $('myelem').gparent(2);让你成为'myelem'的祖父母。

(function($){ 
$.fn.gparent = function(recursion){ 
    if(recursion == undefined) recursion = 2; 
    if(typeof(recursion) == "number"){ 
     recursion = parseInt(recursion); 
     if(recursion > 0){ 
      gparent_holder = $(this); 
      for(var gparent_i = 0; gparent_i < recursion; gparent_i++){ 
       gparent_holder = gparent_holder.parent(); 
      } 
      return gparent_holder; 
     } 
     else return false; 
    } 
    else return false; 
} 
})(jQuery); 
+0

我喜欢这个解决方案。我们正在使用jQuery> 2.0,并且仍然没有简单,清晰的方法来浏览'k'级别。看起来像是添加到基本框架中的一件小事。 – 2014-07-22 14:56:39

+0

很好提出递归。递归函数对于像这样的问题是一个很好的解决方案...但您的解决方案不是递归的。我发布了一个递归片段作为这个问题的答案 – patrick 2016-07-08 22:32:39

0

@Femi有了答案要做到这一点,并提到递归,但他的解决办法是不递归的,以下是获取项目的祖先递归jQuery的解决方案:

$.fn.gparent = function(recursion){ 
    console.log('recursion: ' + recursion); 
    if(recursion > 1) return $(this).parent().gparent(recursion - 1); 
    return $(this).parent(); 
}; 

如果这是你的HTML:

<div id='grandparent'> 
    <div id='parent'> 
    <div id='child'> 
     child 
    </div> 
    </div> 
</div> 

您可以拨打

console.log($('#child').gparent(2)); 

得到元素child的祖父母。 Here's the JSFiddle

+0

为什么地球上这样会得到一个没有评论的downvote ......它是递归的,它被记录下来,小提供提供它来显示它的工作原理,这是OP的问题的答案..如果没有解释,SO应该不可能倒下。现在一个完美的工作解决方案(我使用了很多!)没有显示为有效的解决方案... – patrick 2018-01-18 11:43:54