jquery遍历之parent()和parents()的区别及parentsUntil()方法详解


Posted in Javascript onDecember 02, 2013

.parent(selector) 获得当前匹配元素集合中每个元素的父元素,由选择器筛选(可选)。

.parents(selector) 获得当前匹配元素集合中每个元素的祖先元素,由选择器筛选(可选)。

如果给定一个表示 DOM 元素集合的 jQuery 对象,.parents() 方法允许我们在 DOM 树中搜索这些元素的祖先元素,并用从最近的父元素向上的顺序排列的匹配元素构造一个新的 jQuery 对象。元素是按照从最近的父元素向外的顺序被返回的。.parents() 和 .parent() 方法类似,不同的是后者沿 DOM 树向上遍历单一层级。

这两个方法都可以接受可选的选择器表达式,与我们向 $() 函数中传递的参数类型相同。如果应用这个选择器,则将通过检测元素是否匹配该选择器对元素进行筛选。

下面引用个例子

<ul class="level-1">
 <li class="item-i">I</li>
 <li 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 开始,则可找到其祖先元素
$('li.item-a').parents().css('background-color', 'red');

此次调用的结果是,level-2 列表、项目 II 以及 level-1 列表等元素(沿 DOM 树一路向上直到 <html>)设置红色背景。由于我们未应用选择器表达式,父元素很自然地成为了对象的一部分。如果已应用选择器,则会在包含元素之前,检测元素是否匹配选择器。由于我们未应用选择器表达式,所有祖先元素都是返回的 jQuery 对象的组成部分。如果已应用选择器,则只会包含其中的匹配项目。

如果我们从项目 A 开始,则可找到其父元素:

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

此次调用的结果是,为 level-2 列表设置红色背景。由于我们未应用选择器表达式,父元素很自然地成为了对象的一部分。如果已应用选择器,则会在包含元素之前,检测元素是否匹配选择器。

下面在看一个例子

<body>body
    <div id="one">one
        <div id="two">hello</div>
        <div id="three">three
            <p>p
               <a href="#">tonsh</a>
           </p>
        </div>
     </div>
</body>

思考:
$("a").parent()
$("a").parents()
$("a").parents("div:eq(0)")
var id=$("a").parents("div:eq(1)").children("div:eq(0)").html();

例三
<div id='div1'>
 <div id='div2'><p></p></div>
 <div id='div3' class='a'><p></p></div>
 <div id='div4'><p></p></div>
</div>

$('p').parent()
$('p').parent('.a')
$('p').parent().parent()
$('p').parents()
$('p').parents('.a')

下面看一下以前项目中使用的例子
if(mysql_num_rows($query)){
  while($arr=mysql_fetch_array($query)){
echo <<<admin
          <tr style="text-align:center;">
            <td><input type="checkbox" name="checkbox" value="$arr[id]" /></td>
            <td>$arr[id]</td>
            <td>$arr[log]</td>
            <td>$arr[ip]</td>
            <td>$arr[time]</td>
            <td><form><input type="hidden" name="id" value="$arr[id]" /><span class="del">删除</span><img src="images/del.gif" /></form></td>
          </tr>
admin;
  }//while end;
}else{
  echo "<tr align=center><td colspan=6>暂无登陆日志</td></tr>";
}

jquery相关代码
//删除选中日志
$(".delcheckbox").click(function(){
    var str='';
    $(".tab input[name=checkbox]:checked").each(function(){
        str+=$(this).val()+',';
    });
    str=str.substring(0,str.length-1);
    if(chk_Batch_PKEY(str)){
        art.dialog.confirm('你确认删除选中的日志吗?',function(){
            $.post("myRun/managerlog_del.php",{id:str},function(tips){
                if(tips=='ok'){
                    art.dialog.through({title:'信息',icon:'face-smile',content:'删除成功',ok:function(){art.dialog.close();location.reload();}});
                }else{
                    art.dialog.tips('删除失败');
                }
            });
            return true;
        });
    }else{
        art.dialog.through({title:'信息',icon:'face-sad',content:'请选择删除的日志',ok:function(){art.dialog.close();}});
    }
}).addClass("pointer");

//del event
$(".del").bind("click",function(event){
    var _tmpQuery=$(this);
    var id=$("input[name='id']",$(this).parents("form:first")).attr("value");
    art.dialog.confirm('你确认删除该日志吗?',function(){
        $.post("myRun/managerlog_del.php",{id:id},function(tips){
            if(tips=='ok'){
                art.dialog.tips('成功删除');
                _tmpQuery.parents('tr:first').hide();
            }else{
                art.dialog.tips(tips,5);
            }
        });
        return true;
    });
});

涉及到的知识点:

var id=$("input[name='id']",$(this).parents("form:first")).attr("value");

参考文献:
parent():http://www.w3school.com.cn/jquery/traversing_parent.asp

parents():http://www.w3school.com.cn/jquery/traversing_parents.asp

parentsUntil() 方法

定义:parentsUntil() 获得当前匹配元素集合中每个元素的祖先元素,直到(但不包括)被选择器、DOM 节点或 jQuery 对象匹配的元素。

其实,parentsUntil()方法,以及nextUntil()方法、prevUntil()方法,原理一样。唯一不同的是nextUntil()是往下,prevUntil()是往上(同辈元素),parentsUntil()也是往上(找祖先元素)

下面看一个例子:

<!DOCTYPE html>
<html>
<head>
  <script type="text/javascript" src="/jquery/jquery.js"></script>
</head>
<body>
<ul class="level-1 yes">
  <li class="item-i">I</li>
  <li class="item-ii">II
    <ul class="level-2 yes">
      <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>
<script>
$("li.item-a").parentsUntil(".level-1").css("background-color", "red");
$("li.item-2").parentsUntil( $("ul.level-1"), ".yes"  )
  .css("border", "3px solid blue");
</script>
</body>

得到结果如下:jquery遍历之parent()和parents()的区别及parentsUntil()方法详解

分析:

$("li.item-a").parentsUntil(".level-1").css("background-color", "red");

<ul class="level-1 yes"> -->不符合。其实它是符合li.item-a的祖先元素的。但是根据parentsUntil()方法定义,是不包括选择器、DOM节点或jquery对象所匹配的元素的
  <li class="item-i">I</li>-->不符合,这是它祖先元素的同辈元素。并不是li.item-a的祖先元素。
  <li class="item-ii">II  -->符合
    <ul class="level-2 yes"> -->符合
      <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-2").parentsUntil( $("ul.level-1"), ".yes"  ).css("border", "3px solid blue");

<ul class="level-1 yes">-->是其祖先元素 且又满足选择器表达式".yes",但是根据parentsUntil()方法定义,是不包括选择器、DOM节点或jquery对象所匹配的元素的
  <li class="item-i">I</li> 不匹配,不是其祖先元素。
  <li class="item-ii">II-->是其祖先元素 不满足
    <ul class="level-2 yes"> -->是其祖先元素 满足选择器表达式".yes" [所以,最终匹配到该节点,得到如上图所示的蓝色边框效果]
      <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>
Javascript 相关文章推荐
用js自动判断浏览器分辨率的代码
Jan 28 Javascript
关于JS字符串函数String.replace()
Apr 07 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
Apr 10 Javascript
js 实现浏览历史记录示例
Apr 20 Javascript
jQuery产品间断向下滚动效果核心代码
May 08 Javascript
搭建pomelo 开发环境
Jun 24 Javascript
简单实现js菜单栏切换效果
Mar 04 Javascript
浅谈angular2 组件的生命周期钩子
Aug 12 Javascript
react-native-video实现视频全屏播放的方法
Mar 19 Javascript
JSON字符串操作移除空串更改key/value的介绍
Jan 05 Javascript
详解基于node.js的脚手架工具开发经历
Jan 28 Javascript
Vue的Options用法说明
Aug 14 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
Dec 02 #Javascript
javascript中对Attr(dom中属性)的操作示例讲解
Dec 02 #Javascript
浅析jquery的作用与优势
Dec 02 #Javascript
jquery获取css中的选择器(实例讲解)
Dec 02 #Javascript
jquery中的查找parents与closest方法之间的区别
Dec 02 #Javascript
jquery中的过滤操作详细解析
Dec 02 #Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
Dec 01 #Javascript
You might like
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
PHP4之COOKIE支持详解
2006/10/09 PHP
php curl模拟post请求小实例
2013/11/13 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
2014/05/10 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
如何在node的express中使用socket.io
2014/12/15 Javascript
jQuery Ajax中的事件详细介绍
2015/04/16 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
2016/01/28 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
[59:07]海涛为你详解DOTA2新版本“贤哲秘契”
2014/11/22 DOTA
Python 解析XML文件
2009/04/15 Python
python encode和decode的妙用
2009/09/02 Python
Python设计模式之观察者模式实例
2014/04/26 Python
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
Python MySQLdb Linux下安装笔记
2015/05/09 Python
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
Python拆分大型CSV文件代码实例
2019/10/07 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
处理textarea中的换行和空格
2019/12/12 HTML / CSS
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
2013英文求职信模板范文
2013/11/15 职场文书
工作检讨书怎么写
2014/10/10 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
意外死亡赔偿协议书
2014/10/14 职场文书
三下乡个人总结
2015/03/04 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
python实现简单倒计时功能
2021/04/21 Python
Windows server 2016服务器基本设置
2022/08/14 Servers