HTML的DOM节点

1.DOM Nodes(DOM 节点)

根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:

  • 整个文档是一个文档节点
  • 每个 HTML 元素是元素节点
  • HTML 元素内的文本是文本节点
  • 每个 HTML 属性是属性节点
  • 注释是注释节点

2.DOM节点树

3.节点父、子和兄弟(同胞)

节点树中的节点彼此拥有层级关系。

常用父(parent)子(child)兄弟/同胞(sibling)等术语来描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。

  • 在节点树中,顶端节点被称为根(root)。
  • 每个节点都有父节点、除了根(它没有父节点)。
  • 一个节点可拥有任意数量的子节点。
  • 同胞是拥有相同父节点的节点。

4.节点操作

4.1查找节点

查找结点是根据关系来查找的。依据上述关系分为三种查找方式。

第一种:父节点查找

注意:返回最近一级的父节点,找不到返回null

语法:子元素.parentNode

案例如下:

HTML部分:

<div class="box">
    我是广告
    <div class="box1">X</div>
  </div>
  <div class="box">
    我是广告
    <div class="box1">X</div>
  </div>
  <div class="box">
    我是广告
    <div class="box1">X</div>
  </div>

CSS部分: 

<style>
    .box {
      position: relative;
      width: 1000px;
      height: 200px;
      background-color: pink;
      margin: 100px auto;
      text-align: center;
      font-size: 50px;
      line-height: 200px;
      font-weight: 700;
    }

    .box1 {
      position: absolute;
      right: 20px;
      top: 10px;
      width: 20px;
      height: 20px;
      background-color: skyblue;
      text-align: center;
      line-height: 20px;
      font-size: 16px;
      cursor: pointer;
    }
  </style>

JavaScript部分:

<script>

    // 1. 获取三个关闭按钮
    const closeBtn = document.querySelectorAll('.box1')
    for (let i = 0; i < closeBtn.length; i++) {
      closeBtn[i].addEventListener('click', function () {
        // 关闭我的父亲,所以只关闭当前的父元素
        this.parentNode.style.display = 'none'
      })
    }
  </script>

 效果如下:

 只要我点击蓝色的叉号键,就可以把元素关闭广告,这是一种关闭广告的代码写法。

第二种:子节点查找

语法一:Node.childNode

作用:获得所有子节点,包括文本节点(空格,换行),注释节点等

小总结(没啥用的,现在都不用)

语法二:父元素.children

作用:仅获得所有元素节点,且返回的是个伪数组。

小总结:重点,现在一直用的方法。

代码示例:

<body>
  <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
  </ul>
  <script>
    const ul = document.querySelector('ul')  // ul
    console.log(ul.children)  // 得到伪数组  选择的是 亲儿子 
  </script>
</body>

第三种:兄弟节点查找

1:查找下一个兄弟节点:元素.nextElementSibling

2:  查找上一个兄弟节点:元素.previousElementSibling

<body>
  <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
  </ul>
  <script>
    const li2 = document.querySelector('ul li:nth-child(2)')
    console.log(li2.previousElementSibling)  // 上一个兄弟
    console.log(li2.nextElementSibling)  // 下一个兄弟
  </script>
</body>

4.2 增加节点

应用场景:例如点击发布按钮,可以新增一条信息

语法一:父元素.appendChild(要插入的元素)

作用;插入父元素的最后一个子元素的后面

语法二:父元素.insertBefore(要插入的元素,在哪个元素之前)

作用:插入到父元素中的某个子元素的前面

4.3 克隆节点

语法:元素.cloneNode(布尔值)

注:若为true,则包含子孙后代一起克隆。若为false,则只克隆当前节点,不包含后代。

示例:

var p = document.getElementById("para1"),
var p_prime = p.cloneNode(true);

附注:

克隆一个元素节点会拷贝它所有的属性以及属性值,当然也就包括了属性上绑定的事件 (比如onclick="alert(1)"),但不会拷贝那些使用 addElementListener() 方法或者 node.onclick = fn 这种用 JavaScript 动态绑定的事件。

在使用 Node.appendChild() 或其他类似的方法将拷贝的节点添加到文档中之前,那个拷贝节点并不属于当前文档树的一部分,也就是说,它没有父节点。

如果参数设为false,则不克隆它的任何子节点。该节点所包含的所有文本也不会被克隆,因为文本本身也是一个或多个 Test 节点。

如果参数设为 true,则会复制整棵 DOM 子树 (包括那些可能存在的Test子节点).对于空结点 (例如<img>和<input>元素), 则参数无论设为 true 还是设为 false, 都没有关系,但是仍然需要为它指定一个值。

警告: 为了防止一个文档中出现两个 ID 重复的元素,使用cloneNode() 方法克隆的节点在需要时应该指定另外一个与原 ID 值不同的 ID

如果原始节点设置了 ID,并且克隆节点会被插入到相同的文档中,那么应该更新克隆节点的 ID 以保证唯一性。name 属性可能也需要进行修改,取决于你是否希望有相同名称的节点存在于文档中。

想要克隆一个节点来添加到另外一个文档中,请使用 Docunment.importNode() 代替本方法。

4.4 删除节点

语法:父元素.removeChild(删除元素)

作用:从 DOM 中删除一个子节点。返回删除的节点。

let oldChild = node.removeChild(child);

//OR

element.removeChild(child);
  • child 是要移除的那个子节点。
  • node 是child的父节点。
  • oldChild 保存对删除的子节点的引用。oldChild === child.

被移除的这个子节点仍然存在于内存中,只是没有添加到当前文档的 DOM 树中,因此,还可以把这个节点重新添加回文档中,当然,实现要用另外一个变量比如上例的 oldChild 来保存这个节点的引用。如果使用上述语法中的第二种方法,即没有使用 oldChild 来保存对这个节点的引用,则认为被移除的节点已经是无用的,在短时间内将会被内存管理回收。

以上是我对DOM节点的一些理解,感谢大家的收看!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值