2016-03-06 40 views
4

在jQuery中,您可以調用closest來查找最接近的父級。jQuery找到哪個父母更接近?

如果我在table有一個td一個在li一個ula。我想知道親本ul是否比親本table更接近。顯然在這種情況下,答案是顯而易見的。

如果我運行$('a').closest('table').length$('a').closest('ul').length都返回1

我想找出哪個父母是在DOM接近。

從技術上講,如果有一種方法比在這種情況下$('a').closer('ul', 'table')將返回ul,因爲它在DOM中更接近。

<table> <!-- Is this closer --> 
    <tr> 
     <td> 
      <ul> <!-- Or is this closer --> 
       <li> 
        <a href="#">A button</a> 
       </li> 
      </ul> 
     </td> 
    </tr> 
</table> 
+1

我想你應該張貼,你指的是HTML的一個片段。它會讓每個人都更清楚。 –

+1

1.正如bob所提到的,HTML需要確定DOM內元素/節點的位置和關係。 2.所有元素(「」的根除外)只有**一個**父元素。元素如何具有多個父元素?您的意思是祖先。 – zer00ne

+0

@ zer00ne:這是jQuery的錯誤:所有的祖先被稱爲'.parents()'。 – Amadan

回答

5

可以列出多個元素選擇到closest功能,它只會找到最接近的其中之一:

$('a').closest('table, ul') 

例子:

$(document).on("click", function(event) { 
 
    $(event.target).closest("li, b").toggleClass("hilight"); 
 
});
.hilight{ 
 
    background: rgba(255, 0, 0, 0.5); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul> 
 
    <li><b>Click me!</b></li> 
 
    <li>You can also click this line <b>or click me!</b></li> 
 
</ul>

+2

然後你也想要$ (elem).get(0).tagName知道你實際發現了什麼 – MrD

-1

一個元素只有一個父節點,高於那些祖先節點。

從這裏:https://stackoverflow.com/a/15149590/1876047 - 您可以使用

$(elem1).offset().top - $(elem2).offset.().top 

由於這兩個節點都是你正在考慮的元素的祖先,從DOM樹的根最遠的一個是衣櫃裏的元素。

因此,如果上述差異大於0,則elem2最接近,否則elem1最接近。

+3

這個測量佈局距離,而不是樹距 - 完全不同的問題 – Amadan

2

我喜歡費邊的答案;但實際測量的距離,您可以使用此:

var $parentsUntilTable = $('li').parentsUntil('table'); 
 
var $parentsUntilUl = $('li').parentsUntil('ul'); 
 
console.log($parentsUntilTable.length < $parentsUntilUl.length 
 
      ? 'table is closer' 
 
      : 'ul is closer');
<!-- results pane console output; see http://meta.stackexchange.com/a/242491 --> 
 
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script> 
 

 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<table> 
 
    <tr> 
 
    <td> 
 
     <ul> 
 
     <li> 
 
     </li> 
 
     </ul> 
 
    </td> 
 
    </tr> 
 
</table>

1

下面是一個簡單實現.closer()方法,返回選擇最接近給定元素的:

$.fn.closer = function(varargs) { 
    var $elem = $(this); 
    while ($elem.length) { 
    for (var i = 0, len = arguments.length; i < len; i++) { 
     if ($elem.is(arguments[i])) { 
     return arguments[i]; 
     } 
    } 
    $elem = $elem.parent(); 
    } 
    return null; 
}; 

看到它在行動on jsFiddle

2

使用.parents()它返回從最近到最遠排列的所有父母的列表。

使用這個和使用.closest(selector)的區別在於它接受一個jQuery對象而不是選擇器字符串,它必須被硬編碼。同時jQuery對象可以是集合,因此可以即時生成。

(function($) { 
    $.fn.getClosest = function(testElements) { 
    var element = $(this); 
    var parents = element.parents(); 
    var indexClosest = Number.MAX_VALUE; 
    testElements.each(function() { 
     var index = parents.index($(this)); 
     if (index > -1 && index < indexClosest) 
     indexClosest = index; 
    }); 
    return parents.eq(indexClosest); 
    }; 
})(jQuery); 

使用功能是這樣的:

$("a").getClosest($("table, ul")) 

Fiddle with advanced use case

+0

我實際上試過使用'.index()',但它對我沒有用,如果你製作了一個工作片段,我會感興趣 – Amadan

+0

@Amadan它現在可以工作了! – 4castle

+0

我的解決方案的好處是你可以傳遞大量的jQuery對象而不是大量的選擇器字符串。選擇器字符串必須是hard cod編輯或使用其他方法生成,而jQuery對象可以通過編程方式輕鬆獲得。 – 4castle