.closest()

.closest( selector )返回类型:jQuery

描述:针对集合中的每个元素,通过测试元素本身,以及在DOM树中遍历遍它的祖先,来找到第一个匹配选择器的元素。

给定一介jQuery对象,代表一些DOM元素,.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" );

这将改变第二级<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" );

这将改变第二级<ul>的颜色,累为它既是列表项A的第一个<ul>祖先,也是列表项II的一个祖先。然而,它将不会改变第一级<ul>的颜色,因为它不是列表项II的祖先。

示例:

显示了如何对最靠近元素作事件派遣。最靠近列表元素当它或它的后代被点击时切换到黄色背景。

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-1.10.2.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对象传递给最靠近的。最靠近的列表元素当它或它的后代被点击时切换到黄色背景。

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-1.10.2.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 ] )返回类型:Arrayversion deprecated: 1.7, removed: 1.8

描述:取得所有元素和选择器的数组,匹配针对当前元素向上遍历DOM树。

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

    • selectors
      类型:Array
      一个数组或字符串,包含了一个选择器表达式,用来匹配所针对的元素(可以是一个jQuery对象)。
    • context
      类型:Element
      一个DOM元素,可能在其内部找到要匹配的元素。
此签名(仅仅是此签名!)自从jQuery 1.7以来已经被淘汰了,在jQuery 1.8中就被删除了。它主要是为了让插件作者在内部使用。