.closest()


.closest( selector )傳回:jQuery

說明:對集合中的每個元素,透過測試元素本身並在 DOM 樹中向上遍歷其祖先,取得符合選擇器的第一個元素。

給定一個代表一組 DOM 元素的 jQuery 物件,.closest() 方法會搜尋這些元素及其在 DOM 樹中的祖先,並從比對的元素建構一個新的 jQuery 物件。.parents().closest() 方法很類似,因為它們都會向上遍歷 DOM 樹。兩者之間的差異雖然細微,但卻很重要

.closest() .parents()
從目前的元素開始 從父元素開始
向上遍歷 DOM 樹,直到找到與提供的選擇器相符的元素 向上遍歷 DOM 樹到文件根元素,將每個祖先元素加入暫時集合中;如果提供了選擇器,則會根據選擇器過濾該集合
回傳的 jQuery 物件包含原始集合中每個元素的零個或一個元素,依文件順序 回傳的 jQuery 物件包含原始集合中每個元素的零個或多個元素,依反向文件順序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<ul id="one" class="level-1">
<li class="item-i">I</li>
<li id="ii" class="item-ii">II
<ul class="level-2">
<li class="item-a">A</li>
<li class="item-b">B
<ul class="level-3">
<li class="item-1">1</li>
<li class="item-2">2</li>
<li class="item-3">3</li>
</ul>
</li>
<li class="item-c">C</li>
</ul>
</li>
<li class="item-iii">III</li>
</ul>

假設我們從項目 A 開始搜尋 <ul> 元素

1
2
3
$( "li.item-a" )
.closest( "ul" )
.css( "background-color", "red" );

這會變更層級 2 <ul> 的顏色,因為它是向上遍歷 DOM 樹時遇到的第一個元素。

假設我們改為搜尋 <li> 元素

1
2
3
$( "li.item-a" )
.closest( "li" )
.css( "background-color", "red" );

這會變更清單項目 A 的顏色。.closest() 方法會在向上遍歷 DOM 樹之前,從 元素本身 開始搜尋,並在項目 A 與選擇器相符時停止。

我們可以傳入一個 DOM 元素作為搜尋最近元素的內容。

1
2
3
4
5
6
7
var listItemII = document.getElementById( "ii" );
$( "li.item-a" )
.closest( "ul", listItemII )
.css( "background-color", "red" );
$( "li.item-a" )
.closest( "#one", listItemII )
.css( "background-color", "green" );

這會變更第 2 層級 <ul> 的顏色,因為它同時是清單項目 A 的第一個 <ul> 祖先和清單項目 II 的後代。不過,它不會變更第 1 層級 <ul> 的顏色,因為它不是清單項目 II 的後代。

範例

示範如何使用 closest 進行事件委派。當清單元素或其後代被按一下時,最接近的清單元素會切換為黃色背景。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>closest demo</title>
<style>
li {
margin: 3px;
padding: 3px;
background: #EEEEEE;
}
li.highlight {
background: yellow;
}
</style>
<script src="https://code.jquery.com/jquery-3.7.0.js"></script>
</head>
<body>
<ul>
<li><b>Click me!</b></li>
<li>You can also <b>Click me!</b></li>
</ul>
<script>
$( document ).on( "click", function( event ) {
$( event.target ).closest( "li" ).toggleClass( "highlight" );
});
</script>
</body>
</html>

示範

傳遞 jQuery 物件給 closest。當清單元素或其後代被按一下時,最接近的清單元素會切換為黃色背景。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>closest demo</title>
<style>
li {
margin: 3px;
padding: 3px;
background: #EEEEEE;
}
li.highlight {
background: yellow;
}
</style>
<script src="https://code.jquery.com/jquery-3.7.0.js"></script>
</head>
<body>
<ul>
<li><b>Click me!</b></li>
<li>You can also <b>Click me!</b></li>
</ul>
<script>
var listElements = $( "li" ).css( "color", "blue" );
$( document ).on( "click", function( event ) {
$( event.target ).closest( listElements ).toggleClass( "highlight" );
});
</script>
</body>
</html>

示範

.closest( selectors [, context ] )傳回:陣列版本已棄用:1.7,已移除:1.8

說明:取得與目前元素相符的所有元素和選擇器的陣列,並透過 DOM 樹向上。

  • 新增版本:1.4.closest( selectors [, context ] )

    • selectors
      類型:陣列
      包含要與元素相符的選擇器表達式的陣列或字串(也可以是 jQuery 物件)。
    • context
      類型:元素
      DOM 元素,其中可以找到符合的元素。
這個簽章(僅限這個!)從 jQuery 1.7 開始已棄用,並在 jQuery 1.8 中移除。它主要用於內部或外掛程式作者。