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 相关文章推荐
ImageFlow可鼠标控制图片滚动
Jan 30 Javascript
在次封装easyui-Dialog插件实现代码
Nov 14 Javascript
JS二维数组的定义说明
Mar 03 Javascript
JavaScript简单实现鼠标拖动选择功能
Mar 06 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
Apr 03 Javascript
Javascript中神奇的this
Jan 20 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
Feb 14 Javascript
js阻止浏览器默认行为的简单实例
May 15 Javascript
浅谈如何实现easyui的datebox格式化
Jun 12 Javascript
原生js实现对Ajax的封装(仿jquery)
Jan 22 Javascript
强大的 Angular 表单验证功能详细介绍
May 23 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
Mar 15 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扩展
2013/06/13 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
JS 继承实例分析
2008/11/04 Javascript
3Z版基于jquery的图片复选框(asp.net+jquery)
2010/04/12 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
JavaScript学习笔记整理之引用类型
2016/01/22 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
简单的js表格操作
2016/09/24 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
2017/11/30 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
JS实现倒计时图文效果
2018/11/17 Javascript
Javascript读取上传文件内容/类型/字节数
2019/04/30 Javascript
vue npm install 安装某个指定的版本操作
2020/08/11 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
python支持断点续传的多线程下载示例
2014/01/16 Python
Python中的面向对象编程详解(上)
2015/04/13 Python
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
解决python 读取excel时 日期变成数字并加.0的问题
2019/10/08 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
浅谈pytorch中的BN层的注意事项
2020/06/23 Python
几个常见的软件测试问题
2016/09/07 面试题
材料员岗位职责
2015/02/10 职场文书
2015年艾滋病防治工作总结
2015/05/22 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
《7的乘法口诀》教学反思
2016/02/18 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
Java多条件判断场景中规则执行器的设计
2021/06/26 Java/Android