您的浏览器过于古老 & 陈旧。为了更好的访问体验, 请 升级你的浏览器
Ready 发布于2014年08月28日 07:17

原创 jQuery.closest() 函数详解

5758 次浏览 读完需要≈ 11 分钟

内容目录

closest()函数用于从当前匹配元素开始,逐级向上级选取符合指定表达式的第一个元素,并以jQuery对象的形式返回。

这里的表达式包括:选择器(字符串)、DOM元素(Element)、jQuery对象。

该函数属于jQuery对象(实例)。

语法

jQuery 1.3 新增该函数。

jQueryObject.closest( expr [, context ] )

参数

参数 描述
expr String/Element/jQuery类型指定的表达式。
context 可选/Element/jQuery类型指定表示查找范围的文档节点。

closest()函数将从当前元素本身开始,逐级向上查找第一个符合指定表达式的元素,该元素可能是当前元素自身,也可能是最靠近当前元素的一个祖先元素。

如果expr参数为字符串,它将被视作jQuery选择器。

jQuery 1.4 新增支持:添加context参数。

jQuery 1.6 新增支持:参数expr可以为DOM元素(Element)或jQuery对象

如果参数expr是选择器字符串,并且以>+~:even:odd:eq:gt:lt:nth:first:last等开头(忽略前端的空白字符),则context参数用于指定选择器expr的匹配范围,closest()函数将逐级向上查找该选择器匹配的元素。

当参数expr为其它情况时,如果当前元素的逐级查找过程中遇到了context所表示的元素,则停止本次查找。如果查找过程中没有经过context元素,则一直逐级查找下去,直到符合表达式expr或到顶为止。

closest()函数,还有一种参数用法:( exprs [, context ] ),这里的exprs是一个表达式数组(Array类型),返回的也是一个jQuery对象数组。该方法新增于1.4,在1.7中被标记过已过时,在1.8中被移除。因此不建议使用该用法,此处也不再介绍。如有需要请直接参考官方文档

返回值

closest()函数的返回值为jQuery类型,返回一个新的jQuery对象,该对象包含从当前jQuery对象每个匹配元素自身开始(包括自己)、逐级向上查找到的最先匹配指定表达式的元素。

如果没有符合条件的元素,则返回空的jQuery对象。

示例&说明

以下面这段HTML代码为例:

<p id="n1">
    <span id="n2">
        <span id="n3">A</span>
    </span>
    <label id="n4">B</label>
    <span id="n5" class="active">
        <span id="n6" class="start active">C</span>        
    </span>
    <strong id="n7" class="active">D</strong>
    <span id="n8" class="active">E</span>
</p>
<p id="n9" class="active">
    <span id="n10"></span>
    <label id="n11"></label>
    <span id="n12">
    	<span id="n13" class="start">F</span>
    </span>
</p>

以下jQuery示例代码用于演示closest()函数的具体用法:

//返回jQuery对象所有匹配元素的标识信息数组
//每个元素形如:#id
function getTagsInfo($doms){
	return $doms.map(function(){
	   return "#" + this.id;
	}).get();
}


// 匹配n6元素
var $n6 = $("#n6");

// 从n6元素自身开始,逐级向上查找第一个p元素
var $p = $n6.closest("p");
document.writeln( getTagsInfo( $p ) ); // #n1

// 从n6元素自身开始,逐级向上查找第一个span元素
// 由于n6自己就是span元素,因此直接返回n6
var $span = $n6.closest("span");
document.writeln( getTagsInfo( $span ) ); // #n6

// 匹配所有包含类名"start"的span元素:n6、n13
var $starts = $("span.start");

// 从包含类名"active"的span元素自身开始,逐级向上查找第一个包含类名"active"的元素
// 1、从n6自身开始逐级向上查找,n6自己就是包含类名"active"的元素,因此匹配n6
// 2、从n13自身开始逐级向上查找,n9是包含类名"active"的元素,因此匹配n9
var $actives = $starts.closest(".active");
document.writeln( getTagsInfo( $actives ) ); // #n6,#n9

// 从包含类名"active"的span元素自身开始,逐级向上查找第一个包含类名"active"的元素
// 并且,如果当前查找遇到n12,就停止向上查找
// 1、从n6自身开始逐级向上查找,查找符合条件的n6,因此匹配n6(查找过程中没有经过n12)
// 2、从n13自身开始逐级向上查找,在找到符合条件的n9之前会先经过n12,因此无法匹配n9
var $actives = $starts.closest(".active", document.getElementById("n12"));
document.writeln( getTagsInfo( $actives ) ); // #n6


// 1、从n6自身开始逐级向上查找,查找符合条件的n6,因此匹配n6(查找过程中没有经过n8)
// 2、从n13自身开始逐级向上查找,查找符合条件的n9,因此匹配n9(查找过程中没有经过n8)
var $actives = $starts.closest(".active", document.getElementById("n8"));
document.writeln( getTagsInfo( $actives ) ); // #n6,#n9


// 参数( ":even", document.getElementById("n9") ) 相当于 ( "#n9 :even" ),匹配n10、n12
// 1、从n6自身开始逐级向上查找,没有一个元素为n10或n12
// 2、从n13自身开始逐级向上查找,找到符合条件的n12,因此匹配12
var $doms = $starts.closest( ":even", document.getElementById("n9") );
document.writeln( getTagsInfo( $doms ) ); // #n12

运行代码

  • CodePlayer技术交流群1
  • CodePlayer技术交流群2

0 条评论

撰写评论

打开导航菜单