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 相关文章推荐
List the UTC Time on a Computer
Jun 11 Javascript
保证JavaScript和Asp、Php等后端程序间传值编码统一
Apr 17 Javascript
JavaScript 大数据相加的问题
Aug 03 Javascript
js兼容火狐获取图片宽和高的方法
May 21 Javascript
实现placeholder效果的方案汇总
Jun 11 Javascript
利用jQuery中的ajax分页实现代码
Feb 25 Javascript
基于angularjs实现图片放大镜效果
Aug 31 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
Feb 13 Javascript
快速了解vue-cli 3.0 新特性
Feb 28 Javascript
countUp.js实现数字动态变化效果
Oct 17 Javascript
vue 移动端记录页面浏览位置的方法
Mar 11 Javascript
实现一个Vue自定义指令懒加载的方法示例
Jun 04 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
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
PHP多进程编程实例详解
2017/07/19 PHP
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
treepanel动态加载数据实现代码
2012/12/15 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
简介JavaScript中strike()方法的使用
2015/06/08 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
jQuery图片轮播实现并封装(一)
2016/12/03 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
vue分类筛选filter方法简单实例
2017/03/30 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
2018/04/18 Javascript
浅谈super-vuex使用体验
2018/06/25 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
2018/10/20 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[03:39]这就是刀塔,我们是冠军!燃情短片讲述我们的DOTA故事
2019/07/02 DOTA
Python生成器(Generator)详解
2015/04/13 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
Python基于smtplib协议实现发送邮件
2020/06/03 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
.net软件工程师面试题
2015/03/31 面试题
优良学风班总结材料
2014/02/08 职场文书
销售口号大全
2014/06/11 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
竞选大学学委演讲稿
2014/09/13 职场文书
幼儿园六一儿童节活动总结
2015/02/10 职场文书
实践论读书笔记
2015/06/29 职场文书
2016优秀护士先进个人事迹材料
2016/02/25 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript