写点什么

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

  • 2022 年 5 月 11 日
  • 本文字数:2317 字

    阅读完需:约 8 分钟

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

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


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");    }  }
复制代码


其中,


  • 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 中的nextSiblingpreviousSibling使用注意事项。


JavaScript中的nextSiblingpreviousSibling和作用类似于jquerynext()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>
复制代码


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


var nextType = document.getElementById('one').nextSibling;
复制代码


并使用 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>
复制代码


p 和 span 标签中间隔着文本节点,需要连续使用 2 次 nextSibling 才能选中 span 标签取得文本值。


注意⚠️:firstChild,lastChild,nextSibling,previousSibling都会将空格或者换行当做节点处理,但是有代替属性。所以为了准确地找到相应的元素,会用firstElementChild,lastElementChild,nextElementSibling,previousElementSibling兼容的写法,这是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;                }            }        }
复制代码

附:HTML DOM nodeType 属性

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


  • 如果节点是一个元素节点,nodeType 属性返回 1。

  • 如果节点是属性节点, nodeType 属性返回 2。

  • 如果节点是一个文本节点,nodeType 属性返回 3。

  • 如果节点是一个注释节点,nodeType 属性返回 8。


该属性是只读的。

发布于: 刚刚阅读数: 2
用户头像

No Silver Bullet 2021.07.09 加入

岂曰无衣 与子同袍

评论

发布
暂无评论
网站开发进阶(五十四)jQuery获取父级元素、子级元素、兄弟元素方法汇总_JQuery框架_No Silver Bullet_InfoQ写作社区