网站开发进阶(五十四)query获取父级元素、子级元素、兄弟元素的方法

举报
SHQ5785 发表于 2020/12/30 00:40:16 2020/12/30
【摘要】   在项目开发过程中,在对元素进行样式控制时应用到的方法如下: function showOthers(obj){ // 通过jquery方式获取元素值 var type = $(obj).attr('_value'); if($(obj).is(':checked')){//选中 $(obj).parent().parent().siblin...

  在项目开发过程中,在对元素进行样式控制时应用到的方法如下:

function showOthers(obj){
	// 通过jquery方式获取元素值
	var type = $(obj).attr('_value'); if($(obj).is(':checked')){//选中 $(obj).parent().parent().siblings().children().children("#"+type+"div").show(); $(obj).parent().parent().siblings().children().children("#"+type+"div").children().attr("require","true");
		}else{ /* java端处理需注意 首先校验是否勾选,若勾选才取值  */ $(obj).parent().parent().siblings().children().children("#"+type+"div").hide(); $(obj).parent().parent().siblings().children().children("#"+type+"div").children().removeAttr("require");
		}
	}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

  其中,

  • jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent(".class")

  • jQuery.parents(expr),类似于jQuery.parents(expr),但是是查找所有祖先元素,不限于父元素

  • jQuery.children(expr).返回所有子节点,这个方法只会返回直接的孩子节点,不会返回所有的子孙节点

  • jQuery.contents(),返回下面的所有内容,包括节点和文本。这个方法和children()的区别就在于,包括空白文本,也会被作为一个jQuery对象返回,children()则只会返回节点

  • jQuery.prev(),返回上一个兄弟节点,不是所有的兄弟节点

  • jQuery.prevAll(),返回所有之前的兄弟节点

  • jQuery.next(),返回下一个兄弟节点,不是所有的兄弟节点

  • jQuery.nextAll(),返回所有之后的兄弟节点

  • jQuery.siblings(),返回兄弟姐妹节点,不分前后

  • jQuery.find(expr),跟jQuery.filter(expr)完全不一样。jQuery.filter()是从初始的jQuery对象集合中筛选出一部分,而jQuery.find()的返回结果,不会有初始集合中的内容,比如$("p"),find("span"),是从p元素开始找,等同于$("p span")

  那么在js中又是如何实现的呢?下面讲解下javascript 中的nextSibling和previousSibling使用注意事项。
  JavaScript中的nextSibling和previousSibling和作用类似于jquery的next()和prev(),都是获取下一个/上一个同胞元素,如果下一个同级节点不存在,则此属性返回值是null。但是具体的使用中还是有差异的,如果稍不注意,就会引起错误。
  html结构中的各种空格,换行符都可能会把文本节点当做同胞元素处理。这就会导致错误。
例如下面代码

<!DOCTYPE html>
<html lang="en">
<head> <meta charset="UTF-8"> <title>Document</title> <script> window.onload = function() { var nextType = document.getElementById('one').nextSibling; alert(nextType.nodeType); } </script>
</head>
<body> <div id="div"> <p id = "one">我是p</p> <span id="two">我是span</span> </div>
</body>
</html>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

  在上面这段代码中,我获取了id为"one"的元素并用nextSibling获取了他的下一个同胞元素。赋值给了变量nextType

var nextType = document.getElementById('one').nextSibling;

  
 
  • 1

并使用 alert(nextType.nodeType);弹出他的节点类型,如果按常理,元素p下一个相邻的同胞元素为是span,弹出的数字应该为“1”,但我再火狐,谷歌,IE浏览器(网上说只有火狐才会把换行,空格当做文本节点处理,但是我测试谷歌,IE浏览器效果都是一样的,这有点不解)打开后,弹出的数字是3,也就是文本节点。这是因为换行符被当做文本节点来处理,成为了p元素的下一个同胞元素。
  如果我要获取我是span的文本值,需要这样写

<!DOCTYPE html>
<html lang="en">
<head> <meta charset="UTF-8"> <title>Document</title> <script> window.onload = function() { var nextType = document.getElementById('one').nextSibling; var span = nextType.nextSibling; alert(span.lastChild.nodeValue); } </script>
</head>
<body> <div id="div"> <p id = "one">我是p</p> <span id="two">我是span</span> </div>
</body>
</html>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

  p和span标签中间隔着文本节点,需要连续使用2次nextSibling才能选中span标签取得文本值。
  注意:firstChild,lastChild,nextSibling,previousSibling都会将空格或者换行当做节点处理,但是有代替属性。所以为了准确地找到相应的元素,会用

firstElementChild,

lastElementChild,

nextElementSibling,

previousElementSibling

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

兼容的写法,这是JavaScript自带的属性。
  但坏消息是IE6,7,8不兼容这些属性。IE9以上和火狐谷歌支持。
  可参考下面的方法过滤文本节点获取正确的下一个元素节点。

 function getNextElement(element){ var e = element.nextSibling; if(e == null){//测试同胞节点是否存在,否则返回空 return null; } if(e.nodeType==3){//如果同胞元素为文本节点 var two = getNextElement(e); if(two.nodeType == 1) return two; }else{ if(e.nodeType == 1){//确认节点为元素节点才返回 return e; }else{ return false; } } }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

附:HTML DOM nodeType 属性

返回body元素的节点类型:
nodeType 属性返回节点类型。

  • 如果节点是一个元素节点,nodeType 属性返回 1。
  • 如果节点是属性节点, nodeType 属性返回 2。
  • 如果节点是一个文本节点,nodeType 属性返回 3。
  • 如果节点是一个注释节点,nodeType 属性返回 8。

该属性是只读的。

文章来源: shq5785.blog.csdn.net,作者:No Silver Bullet,版权归原作者所有,如需转载,请联系作者。

原文链接:shq5785.blog.csdn.net/article/details/82667689

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。