2013-04-30 46 views
3

在jquery中,我试图找到一种方法来搜索dom,直到找到选择器。例如。使用jquery在给定元素中搜索DOM

提供这样的结构:

<span data-type="contact" data-filter="4" id="buyer-lookup" class="uneditable-input contact-lookup" data-original-title="" title="">Jeff</span> 
<div class="popover"> 
    <div class="arrow"></div> 
    <h3 class="popover-title"><strong>Jeff</strong></h3> 
    <div class="popover-content"> 
     <address style="margin:0;"> MO<br></address> 
     <a data-id="70" data-type="contact" class="pull-right edit-contact" href="#">Edit</a> 
     <div class="clear"></div> 
    </div> 
</div> 

论“.edit接触”点击我要搜索,直到我发现‘span.contact-查找’。我可以使用父母几次获得我想要的东西,但有一个更清晰的方法,以便您可以指定$(this).searchUpFunction('span.contact-lookup');所以它会从这开始搜索直到找到span.contact-lookup? .prev似乎没有搜索父母。

$('.edit-contact').click(function(){ 
     var filter = $(this).parent().parent().prev('span.contact-lookup').data('filter'); 
     alert(filter); 
    }); 
+0

更快的方法,因为您的DOM片段将是'$(this).closest('div.popover')。prev()' – 2013-04-30 14:20:05

+0

为了搜索,您有['.closest()'] (http://api.jquery.com/closest/)函数,但在你的情况下,因为你正在寻找一个祖先的前一个节点,所以在jQuery中没有直接的功能......不过,你可以尝试:'$(this).closest(“。popover”)。prev()'。 – 2013-04-30 14:21:26

回答

1

使用closest

$('.edit-contact').click(function(){ 
    contactID = $(this).closest('div.popover').prev().data('contact-id'); 
    alert(contactID); 
}); 
+1

没有这样的函数'.previous()'。 – 2013-04-30 14:21:15

+1

跨度不是祖先的一部分,它优先于div祖先 – 2013-04-30 14:21:27

+0

@FelixKling固定:) – Sharlike 2013-04-30 14:23:06

1

如果你没有对祖先那里span.contact-lookup是的,你可以使用.parents()[docs]选择所有祖先的兄弟的任何信息:

$(this).parents().prev('span.contact-lookup') 

虽然这会比使用.closest()效率低,因为它会遍历树根直到根。

此外,如果有多个祖先与一个span.contact-lookup兄弟姐妹,您将选择所有这些。在这种情况下,您可以通过.first().last()得到最近的一个,具体取决于它们的选择顺序(顺序总是相同的,我只是不知道它在我头顶上)。


所以:如果可以的话,使用.closest,如果没有,.parents可能是你最好的选择(除了编写自己的代码来遍历DOM)。