原生 JS 中的节点关系

1、 原生JS中nodeType属性

节点属性类型:


nodeType

任何的HTML元素,都有nodeType属性,值有1~11,这里精简到了5个:
1: 元素节点
3: 文本节点
8: 注释节点
9: document节点
10: DTD

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>节点</title>
</head>
<body>
    <div id="box">  节点</div>
    <script>
        var box = document.getElementById("box");
        alert(box.nodeType);  //弹出 1
        alert(box.childNodes[0].nodeType);  //3

    </script>
</body>
</html>

只有alert(document.nodeType); 结果为 9。

2、原生JS中的节点关系-childNodes

我为了好记叫(儿子数组)
任何节点都有childNodes属性,是一个类数组对象,存放着所有自己的儿子。
注意,这里有重大兼容性问题:空白文本现象
结构

    <div id="box">
        <p></p>
     </div>

Chrome、IE9、IE10……高级浏览器,认为:
alert(box.childNodes[0].nodeType ) //3
高级浏览器认为box的大儿子是文本节点。当然是空文本。

IE6、7、8等低级浏览器认为:
alert(box.childNodes[0].nodeType) //1
IE6、7、8认为 box 的大儿子是p。

所以为了没有兼容问题,需要遍历节点的时候,HTML结构就不能有空格。
一个面试题:

        <div id="box">
            <p></p>
            <p></p>
            <p></p>
            <p></p>
        </div>

    document.getElementById(“box”).childNodes.length;  //高级浏览器9,低级浏览器4

怎么解决这个差异呢?放弃原有的数组,重新遍历儿子数组,把所有nodeType为1的元素组成一个新的数组。

     var childs = [];
     for(var i = 0 ; i < box.childNodes.length ; i++){
        if(box.childNodes[i].nodeType == 1){  //可以为一也可以为三五八,筛选条件不同。
            childs.push(box.childNodes[i]);
        }
     }
     childs[1].style.background = "red";

firstChild属性、lastChild属性: 也不好用,IE6、7、8认为firstChild是节点, 而Chrome认为firstChild是空文本

3、原生JS中的节点关系-parentNode

我为了好记叫(父亲数组)
注意 childNodes 儿子可以有很多 ,parendNode 父亲只能有1个

4、previousSibling、nextSibling

previous | 英[ˈpri:viəs] 以前的; 先前的; 过早的; (时间上) 稍前的;
sibling | 英[ˈsɪblɪŋ] 同胞兄弟,姐妹; [生] 同科。
previousSibling、nextSibling
上一个同胞兄弟,下一个同胞兄弟。

        <div id="box">
            <p>AAA</p>
            <p>BBB</p>
            <p>CCC</p>
            <p>DDD</p>
        </div>

    ps[2].previousSibling   //低级浏览器就是BBB那个p,高级浏览器是空文本节点

让一个 box 序列上面全部变红。box 下面所有盒子变红雷同。

让 box 节点的之前的所有节点,都变红,原生 JS 挺难的:
            var prev = box;
            while(prev = prev.previousSibling){ //一直查找兄弟的兄弟,直到遇见 null。
     暗含一个 for 迭代器if(prev.nodeType == 1){
                    prev.style.background = "red";
                }
            }

jQuery 写法:
$("#box").prevAll().css.backgoround = ""red;

总结:
原生 JS 中的节点关系
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 属性: Attributes 存储节点的属性列表(只读) childNodes ...
    小呆呆008阅读 1,607评论 0 0
  • 本章内容 理解包含不同层次节点的 DOM 使用不同的节点类型 克服浏览器兼容性问题及各种陷阱 DOM 是针对 HT...
    闷油瓶小张阅读 4,012评论 0 1
  •   DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API(应用程序编程接口)。   DOM 描绘...
    霜天晓阅读 9,142评论 0 7
  • 虽然现在有着很多优秀的框架,但归根结底我们依然得掌握好DOM知识来针对项目某些情况来使用原生操作,从而达到降低代码...
    俗三疯阅读 4,304评论 0 2
  • 基本概念 DOM DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Ob...
    许先生__阅读 4,361评论 0 1

友情链接更多精彩内容