2013-03-18 85 views
4

我想使用jquery最接近的命令找到一个特定的元素的基础上,如果该元素有一个特定的兄弟姐妹。我一直在玩不同的选择器,但一直没有找到能够做到我想要的东西。使用jquery最接近()找到最近的元素与已知的兄弟

因此,举例来说,如果结构是类似以下内容

<div> 
    <table> 
     <tr> 
      <td> 
        <span a>cell 1</span> 
        <span>cell 2</span> 
      </td> 
      <td siblingmatch="true"> 
        <span b>cell 1</span> 
        <span>cell 2</span> 
      </td> 
     </tr> 
    </table> 

    <span siblingmatch="true">test 1</span> 
</div> 

如果我跑最接近从标有跨度开始,我希望它返回它的父TD,因为它有一个兄弟标与siblingmatch属性一起使用。但是,如果我从用b标记的区段开始运行相同的命令,我希望它返回表标记,因为这是它与兄弟标记为siblingmatch属性时找到的第一个父代。

+1

您是否有真正的问题? – 2013-03-18 17:51:25

+1

显示你一直在玩的jquery代码。它会提供更多的工作。 – gotohales 2013-03-18 17:53:58

+1

@undefined我认为''(和b)仅仅是示例性的以指示代码之后的文本。 – 2013-03-18 17:54:38

回答

3

您可以使用parentsfilter方法。

$('span').click(function(){ 
    var matched = $(this).parents().filter(function(){ 
     return $(this).siblings('[siblingmatch]').length; 
    }).first(); 
}); 

http://jsfiddle.net/WW5qL/

注意siblingmatch是不是一个有效的属性,你可以使用HTML5代替data-*属性。

+0

是的,siblingmatch不是实际的属性名称,只是这个例子。 我跑你的例子,这似乎返回我想要的。我注意到你没有在你的代码中使用最接近的()函数,而是使用父过滤器。有没有理由使用一个vs另一个,我可以用最接近的()做同样的事情吗? – bbeaudet 2013-03-18 20:12:57

+0

回应我自己的评论:closest()不支持函数,所以需要一个选择器,这是我挣扎的地方。父母()。filter()允许一个函数,这样可以提供更多的灵活性。 – bbeaudet 2013-03-18 20:28:21

+1

@bbeaudet'nearest'只返回匹配的父元素(_specified by selector_),这不是一个有用的方法在这里使用vs'parents'返回所选元素的所有父元素(大部分时间我不使用这个function_),它允许过滤它们。请注意,这两个函数都不接受'function',使用'filter'是jQuery提供的可链接性。 – undefined 2013-03-18 20:35:49