深入理解 ruanyf/jstutorial 中的 DOM 节点模型

深入理解 ruanyf/jstutorial 中的 DOM 节点模型

jstutorial Javascript tutorial book jstutorial 项目地址: https://gitcode.com/gh_mirrors/js/jstutorial

什么是 DOM?

DOM(Document Object Model,文档对象模型)是 JavaScript 操作网页的核心接口。它将整个网页文档抽象为一个树状结构,使开发者能够通过编程方式访问和操作网页内容。简单来说,DOM 就是浏览器将 HTML 文档转换为 JavaScript 可以理解的对象模型。

节点(Node)基础概念

在 DOM 中,所有内容都被视为节点。节点是 DOM 树的基本构建块,就像树叶是树的组成部分一样。DOM 定义了七种不同类型的节点:

  1. 文档节点(Document):代表整个文档的根节点
  2. 文档类型节点(DocumentType):如 <!DOCTYPE html> 声明
  3. 元素节点(Element):HTML 标签,如 <div><p>
  4. 属性节点(Attribute):元素的属性,如 class="example"
  5. 文本节点(Text):元素内的文本内容
  6. 注释节点(Comment):HTML 注释 <!-- comment -->
  7. 文档片段节点(DocumentFragment):轻量级的文档容器

节点树结构

DOM 将文档组织为树形结构,称为节点树或 DOM 树。这个树有一个顶层节点(文档节点),下面层层嵌套着各种子节点。

节点之间存在三种主要关系:

  • 父节点(parentNode):直接上级节点
  • 子节点(childNodes):直接下级节点
  • 同级节点(sibling):共享同一父节点的节点

核心节点属性

节点类型识别

node.nodeType  // 返回节点类型的数字代码
node.nodeName  // 返回节点名称
node.nodeValue // 返回或设置节点值

节点类型代码对照表:

  • 1:元素节点
  • 2:属性节点
  • 3:文本节点
  • 8:注释节点
  • 9:文档节点
  • 10:文档类型节点
  • 11:文档片段节点

节点关系属性

node.parentNode      // 父节点
node.parentElement   // 父元素节点
node.childNodes      // 所有子节点的集合
node.firstChild      // 第一个子节点
node.lastChild       // 最后一个子节点
node.nextSibling     // 下一个同级节点
node.previousSibling // 上一个同级节点

内容相关属性

node.textContent // 获取或设置节点及其后代的文本内容
node.baseURI     // 返回节点的绝对基础URL
node.ownerDocument // 返回节点所属的文档对象

常用节点方法

节点操作

parentNode.appendChild(newNode)     // 在末尾添加子节点
parentNode.insertBefore(new, ref)   // 在指定节点前插入
parentNode.removeChild(node)        // 移除子节点
parentNode.replaceChild(new, old)   // 替换子节点
node.cloneNode(deep)               // 克隆节点,deep为true时克隆所有后代

节点查询与比较

node.hasChildNodes()       // 检查是否有子节点
node.contains(otherNode)   // 检查是否包含指定节点
node.isEqualNode(other)    // 检查节点是否相等
node.compareDocumentPosition(other) // 比较节点位置关系
node.normalize()           // 合并相邻文本节点,删除空文本节点

节点集合:NodeList 和 HTMLCollection

DOM 提供了两种集合类型来存储多个节点:

NodeList

通过以下方式获得:

  • element.childNodes
  • document.querySelectorAll()

特点:

  • 可能是动态的(如 childNodes)或静态的(如 querySelectorAll 结果)
  • 具有 length 属性和 forEach 方法
  • 可通过 item(index) 或 [index] 访问成员

HTMLCollection

通过以下方式获得:

  • document.forms
  • document.images
  • document.links

特点:

  • 总是动态的
  • 只能包含元素节点
  • 可通过 name 或 id 属性直接访问成员
  • 有 length 属性和 item(index) 方法

实际应用示例

遍历 DOM 树

function traverseDOM(node, callback) {
  callback(node);
  node = node.firstChild;
  while (node) {
    traverseDOM(node, callback);
    node = node.nextSibling;
  }
}

// 使用示例
traverseDOM(document.body, function(node) {
  console.log(node.nodeName);
});

动态创建和插入内容

// 创建新元素
var newDiv = document.createElement('div');
newDiv.textContent = 'Hello World!';

// 插入到文档中
document.body.insertBefore(newDiv, document.body.firstChild);

// 克隆节点
var clonedDiv = newDiv.cloneNode(true);
document.body.appendChild(clonedDiv);

安全移除节点

function removeNode(node) {
  if (node && node.parentNode) {
    node.parentNode.removeChild(node);
  }
}

最佳实践

  1. 缓存查询结果:重复查询 DOM 会影响性能,应该将结果存储在变量中
  2. 批量操作:使用 DocumentFragment 进行批量 DOM 操作
  3. 事件委托:利用事件冒泡减少事件监听器数量
  4. 避免频繁重排:连续的 DOM 操作应该合并处理

理解 DOM 节点模型是前端开发的基础,掌握这些核心概念和方法将帮助你更高效地操作网页内容,构建交互丰富的 Web 应用。

jstutorial Javascript tutorial book jstutorial 项目地址: https://gitcode.com/gh_mirrors/js/jstutorial

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

廉妤秋Swift

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值