site infoHacknerd | Tech Blog
blog cover

♟️ [JavaScript高级程序设计]14 DOM

JavaScript

概述

文档对象模型(DOM,Document Object Model)是语言中立的 HTML 和 XML 文档的 API。DOM Level 1 将 HTML 和 XML 文档定义为一个节点的多层级结构,并暴露出 JavaScript 接口以操作文档的底 层结构和外观。 DOM 由一系列节点类型构成,主要包括以下几种。

  • Node 是基准节点类型,是文档一个部分的抽象表示,所有其他类型都继承 Node。
  • Document 类型表示整个文档,对应树形结构的根节点。在 JavaScript 中,document 对象是 Document 的实例,拥有查询和获取节点的很多方法。
  • Element 节点表示文档中所有 HTML 或 XML 元素,可以用来操作它们的内容和属性
  • 其他节点类型分别表示文本内容、注释、文档类型、CDATA 区块和文档片段。
  • DOM 编程在多数情况下没什么问题,在涉及<script>和<style>元素时会有一点兼容性问题。因 为这些元素分别包含脚本和样式信息,所以浏览器会将它们与其他元素区别对待。 要理解 DOM,最关键的一点是知道影响其性能的问题所在。DOM 操作在 JavaScript 代码中是代价 比较高的,NodeList 对象尤其需要注意。NodeList 对象是“实时更新”的,这意味着每次访问它都 会执行一次新的查询。考虑到这些问题,实践中要尽量减少 DOM 操作的数量。 MutationObserver 是为代替性能不好的 MutationEvent 而问世的。使用它可以有效精准地监控 DOM 变化,而且 API 也相对简单

    节点层级

  • 1.node类型
  • 2.node name 和node value
  • 3.节点关系
  • 4.操纵节点
  • 5.其他操作
  • Document类型

    文档对象 document 是 HTMLDocument 的实例(HTMLDocument 继承 Document),表示整个 HTML 页面 存在以下特征:

  • 1.文档子节点
  • 2.文档信息
  • 3.定位元素
  • 4.特殊集合
  • 5.兼容性检查
  • 6.文档写入
  • Element

    Element 表示XML或HTML元素,对外暴露出访问元素标签名、子节点和属性的能力。

    可以通过 nodeName 或 tagName 属性来获取元素的标签名。这两个属性返回同样的值。

    javascriptCopy
    let div = document.getElementById("myDiv"); 
    alert(div.tagName); // "DIV" 
    alert(div.tagName == div.nodeName); // true 

    在 HTML 中,元素标签名始终以全大写表示;在 XML(包括 XHTML)中,标签名始终与源 代码中的大小写一致
  • 1.HTML元素
  • 2.getAttribute 属性名不区分大小写,因此"ID"和"id"被认为是同一个属性
  • 3.setAttribute 设置的属性名会规范为小写形式
  • 4.removeAttribute
  • 5.attributes 属性
  • 6.createElement
  • 7. 元素后代
  • 文本节点

    特征:

    操作文本方法

  • appendData(text),向节点末尾添加文本 text;
  • deleteData(offset, count),从位置 offset 开始删除 count 个字符;
  • insertData(offset, text),在位置 offset 插入 text;
  • replaceData(offset, count, text),用 text 替换从位置 offset 到 offset + count 的 文本;
  • splitText(offset),在位置 offset 将当前文本节点拆分为两个文本节点;
  • substringData(offset, count),提取从位置 offset 到 offset + count 的文本
  • 1.创建
  • 2.拆分
  • 3.规范化
  • Comment 类型

    DOM 中的注释通过 Comment 类型表示。Comment 类型的节点具有以下特征:

  • nodeType 等于 8;
  • nodeName 值为"#comment";
  • nodeValue 值为注释的内容;
  • parentNode 值为 Document 或 Element 对象;
  • 不支持子节点。
  • CDATASection 类型

    CDATASection 类型表示 XML 中特有的 CDATA 区块。CDATASection 类型继承 Text 类型,因 此拥有包括 splitText()在内的所有字符串操作方法

    CDATA 区块只在 XML 文档中有效

    htmlCopy
    <div id="myDiv"><![CDATA[This is some content.]]></div>

    主流的四大浏览器没有一个将其识别为CDATASection。即使在有效的 XHTML 文档中,这些浏览器也不能恰当地支持嵌入的 CDATA 区块。

    DocumentType 类型

    DocumentType 类型的节点包含文档的文档类型(doctype)信息,具有以下特征:

  • nodeType 等于 10;
  • nodeName 值为文档类型的名称;
  • nodeValue 值为 null;
  • parentNode 值为 Document 对象;
  • 不支持子节点
  • DocumentType 对象在 DOM Level 1 中不支持动态创建,只能在解析文档代码时创建。对于支持这 个类型的浏览器,DocumentType 对象保存在 document.doctype 属性中。DOM Level 1 规定了 DocumentType 对象的 3 个属性:name、entities 和 notations。其中,name 是文档类型的名称, entities 是这个文档类型描述的实体的 NamedNodeMap,而 notations 是这个文档类型描述的表示 法的 NamedNodeMap。因为浏览器中的文档通常是 HTML 或 XHTML 文档类型,所以 entities 和 notations 列表为空。(这个对象只包含行内声明的文档类型。)无论如何,只有 name 属性是有用的。 这个属性包含文档类型的名称,即紧跟在<!DOCTYPE 后面的那串文本。比如下面的 HTML 4.01 严格文 档类型

    htmlCopy
    <!DOCTYPE HTML PUBLIC "-// W3C// DTD HTML 4.01// EN"  "http:// www.w3.org/TR/html4/strict.dtd">

    DocumentFragment 类型

    在所有节点类型中,DocumentFragment 类型是唯一一个在标记中没有对应表示的类型。DOM 将 文档片段定义为“轻量级”文档,能够包含和操作节点,却没有完整文档那样额外的消耗

    Attr 类型

    元素数据在 DOM 中通过 Attr 类型表示。Attr 类型构造函数和原型在所有浏览器中都可以直接访 问

    属性节点尽管是节点,却不被认为是 DOM 文档树的一部分。Attr 节点很少直接被引用,通常开 发者更喜欢使用 getAttribute()、removeAttribute()和 setAttribute()方法操作属性

    Dom编程

  • 1.动态脚本
  • 2.动态样式
  • 3.操作Table
  • 4.使用nodeList
  • MutationObserver 接口

    小结

    文档对象模型(DOM,Document Object Model)是语言中立的 HTML 和 XML 文档的 API。DOM Level 1 将 HTML 和 XML 文档定义为一个节点的多层级结构,并暴露出 JavaScript 接口以操作文档的底 层结构和外观。 DOM 由一系列节点类型构成,主要包括以下几种。

  • Node 是基准节点类型,是文档一个部分的抽象表示,所有其他类型都继承 Node。
  • Document 类型表示整个文档,对应树形结构的根节点。在 JavaScript 中,document 对象是 Document 的实例,拥有查询和获取节点的很多方法。
  • Element 节点表示文档中所有 HTML 或 XML 元素,可以用来操作它们的内容和属性。
  • 其他节点类型分别表示文本内容、注释、文档类型、CDATA 区块和文档片段。
  • DOM 编程在多数情况下没什么问题,在涉及<script>和<style>元素时会有一点兼容性问题。因 为这些元素分别包含脚本和样式信息,所以浏览器会将它们与其他元素区别对待。 要理解 DOM,最关键的一点是知道影响其性能的问题所在。DOM 操作在 JavaScript 代码中是代价 比较高的,NodeList 对象尤其需要注意。NodeList 对象是“实时更新”的,这意味着每次访问它都 会执行一次新的查询。考虑到这些问题,实践中要尽量减少 DOM 操作的数量。 MutationObserver 是为代替性能不好的 MutationEvent 而问世的。使用它可以有效精准地监控 DOM 变化,而且 API 也相对简单。

    Contents

    • 概述
    • 节点层级
    • Document类型
    • Element
    • 文本节点
    • Comment 类型
    • CDATASection 类型
    • DocumentType 类型
    • DocumentFragment 类型
    • Attr 类型
    • Dom编程
    • MutationObserver 接口
    • 小结

    2024/03/29 03:36