美文网首页基础前端
原生 JS 中的节点关系

原生 JS 中的节点关系

作者: CondorHero | 来源:发表于2019-03-07 00:02 被阅读18次

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 中的节点关系

相关文章

  • 原生 JS 中的节点关系

    1、 原生JS中nodeType属性 节点属性类型: 任何的HTML元素,都有nodeType属性,值有1~11,...

  • 原生JS封装查找元素节点的方法

    原生JS封装查找父元素节点的方法 原生JS封装查找兄弟元素节点的方法 插入子节点方法 12 2 divsiv...

  • 前端知识积累之——JS篇

    1 原生js的dom操作 创建节点 createElement 移除节点 removeChild 替换节点 rep...

  • DOM 的一些增删改查

    以下是JS中DOM节点中增删改查的基本API: 查 增 删 改 学习参考:原生JS中CSS相关API合集

  • js初识第四节

    原生js删除dom节点 原生js动态创建一个表格的,并对其进行封装便于以后复用 创建文本节点和节点的克隆 一个cl...

  • DOM树知识点梳理

    1.HTML DOM2.获取节点的原生方法3.JS中的节点操作写几个常用的API, 来操作DOM节点。(1)doc...

  • 12、动态创建元素

    (1)原生js创建节点: document.write() innerHTML() document.create...

  • js原生节点操作

    查找节点 创建节点 添加节] 移除 替换 插入 复制节点 移动节点

  • js 原生的节点操作

    获取子节点 children 不是标准的dom属性,但是几乎被所有浏览器支持。不包含文本节点. 注意:在IE中,c...

  • jQuery动态创建元素及添加节点

    原生js中创建节点方法: document.write(" ");可以打开标准流,添加元素,再关闭标准流。该方法...

网友评论

    本文标题:原生 JS 中的节点关系

    本文链接:https://www.haomeiwen.com/subject/ftmfpqtx.html