jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析


Posted in Javascript onApril 26, 2013

closest() 方法获得匹配选择器的第一个祖先元素从当前元素开始沿 DOM 树向上。

语法:

.closest(selector)

参数selector为字符串值,包含匹配元素的选择器表达式。

如果给定表示 DOM 元素集合的 jQuery 对象,.closest() 方法允许我们检索 DOM 树中的这些元素以及它们的祖先元素,并用匹配元素构造新的 jQuery 对象。.parents() 和 .closest() 方法类似,它们都沿 DOM 树向上遍历。两者之间的差异尽管微妙,却很重要:

.closest() .parents()
从当前元素开始 从父元素开始
沿 DOM 树向上遍历,直到找到已应用选择器的一个匹配为止。 沿 DOM 树向上遍历,直到文档的根元素为止,将每个祖先元素添加到一个临时的集合;如果应用了选择器,则会基于该选择器对这个集合进行筛选。 
返回包含零个或一个元素的 jQuery 对象 返回包含零个、一个或多个元素的 jQuery 对象

先看下面的示例:演示如何通过 closest() 完成事件委托。当被最接近的列表元素或其子后代元素被点击时,会切换黄色背景
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="/jquery/jquery.js"></script>
<style>
  li { margin: 3px; padding: 3px; background: #EEEEEE; }
  li.hilight { background: yellow; }
</style>
</head>
<body>
  <ul>
    <li><b>Click me!</b></li>
    <li>You can also <b>Click me!</b></li>
  </ul>
<script>
  $( document ).bind("click", function( e ) {
    $( e.target ).closest("li").toggleClass("hilight");
  });
</script>
</body>
</html>

1、当鼠标点击“You can also”时,颜色出现变化。这是因为closest是从当前元素开始向上遍历的。而不同于parents()方法,是从当前元素的父元素开始向上遍历。

2、当点击Click me!时,颜色也会变化。这同样经过上面步骤,从当前元素向上匹配,只不过<b>不符合条件,再往上时遇见了<li>。
3、实例演示请访问:http://www.w3school.com.cn/tiy/t.asp?f=jquery_traversing_closest

例2:

<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>

$('li.item-a').closest('ul').css('background-color', 'red');

结果:

这会改变 level-2 <ul> 的颜色,这是因为当向上遍历 DOM 树时会第一个遇到该元素。

如下图所示:

jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析

假设我们搜索的是 <li> 元素

$('li.item-a').closest('li').css('background-color', 'red');

这会改变列表项目 A 的颜色。在向上遍历 DOM 树之前,.closest() 方法会从 li 元素本身开始搜索,直到选择器匹配项目 A 为止。

例子 3

我们可以传递 DOM 元素作为 context(即限定搜索的最大范围),在其中搜索最接近的元素。

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');

以上代码会改变 level-2 <ul> 的颜色,因为它既是列表项 A 的第一个 <ul> 祖先,同时也是列表项 II 的后代。

它不会改变 level-1 <ul> 的颜色,因为它不是 list item II 的后代。

Javascript 相关文章推荐
js中的preventDefault与stopPropagation详解
Jan 29 Javascript
javascript实例--教你实现扑克牌洗牌功能
May 15 Javascript
JavaScript中的闭包介绍
Mar 15 Javascript
详细探究ES6之Proxy代理
Jul 22 Javascript
jQuery实现鼠标跟随效果
Feb 20 Javascript
Vue中fragment.js使用方法详解
Mar 09 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
Jul 20 Javascript
JS 实现banner图片轮播效果(鼠标事件)
Aug 04 Javascript
Node.js实现发送邮件功能
Nov 06 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
Sep 11 Javascript
js实现百度登录窗口拖拽效果
Mar 19 Javascript
vue同个按钮控制展开和折叠同个事件操作
Jul 29 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
Apr 26 #Javascript
关于jquery.validate1.9.0前台验证的使用介绍
Apr 26 #Javascript
jQuery.Validate验证库的使用介绍
Apr 26 #Javascript
基于jQuery.Validate验证库知识点的详解
Apr 26 #Javascript
关于jQuery新的事件绑定机制on()的使用技巧
Apr 26 #Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
Apr 25 #Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
Apr 25 #Javascript
You might like
PHP与MySQL交互使用详解
2006/10/09 PHP
用php实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
PHP处理excel cvs表格的方法实例介绍
2013/05/13 PHP
php中JSON的使用与转换
2015/01/14 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
Yii2中DropDownList简单用法示例
2016/07/18 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
childNodes.length与children.length的区别
2009/05/14 Javascript
16个最流行的JavaScript框架[推荐]
2011/05/29 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
js实现千分符和保留几位小数的简单实例
2016/08/01 Javascript
基于ES6 Array.of的用法(实例讲解)
2017/09/05 Javascript
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
浅析vue深复制
2018/01/29 Javascript
ES6学习教程之Promise用法详解
2020/11/22 Javascript
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python实现读取并保存文件的类
2017/05/11 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
基于python实现地址和经纬度转换
2020/05/19 Python
Python创建临时文件和文件夹
2020/08/05 Python
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
彪马日本官网:PUMA日本
2019/01/31 全球购物
某公司C#程序员面试题笔试题
2014/05/26 面试题
打架检讨书100字
2014/01/08 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
上班离岗检讨书
2014/09/10 职场文书
2015年结对帮扶工作总结
2015/05/04 职场文书
2015年六一儿童节活动方案
2015/05/05 职场文书
贷款收入证明范本
2015/06/12 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android