<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>DOM操作 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/dom%E6%93%8D%E4%BD%9C/</link><description>Recent content in DOM操作 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 08 Nov 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/dom%E6%93%8D%E4%BD%9C/index.xml" rel="self" type="application/rss+xml"/><item><title>DOM操作</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/javascript/javascript-017/</link><pubDate>Tue, 01 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/javascript/javascript-017/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/javascript/javascript-017/image-01.webp"&gt;&lt;/p&gt;
&lt;h2 id="1dom基本概念"&gt;1、DOM基本概念&lt;/h2&gt;
&lt;h3 id="11domdom节点与dom树"&gt;1.1、DOM、DOM节点与DOM树&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://developer.mozilla.org/zh-CN/docs/Glossary/DOM"&gt;DOM&lt;/a&gt;&lt;/strong&gt;：(&lt;strong&gt;D&lt;/strong&gt;ocument &lt;strong&gt;O&lt;/strong&gt;bject &lt;strong&gt;M&lt;/strong&gt;odel, 文档对象模型)是文档内容（HTML或XML）在编程语言上的抽象模型，它建模了文档的内容和结构，并提供给编程语言一套完整的操纵文档的API。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;本文面向HTML，不讨论XML等文档，下文中“文档===HTML”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DOM节点&lt;/strong&gt;：简称节点（Node），是DOM模型的组成单元。HTML的基本单元是标签，节点&lt;strong&gt;常常&lt;/strong&gt;与标签对应，但连续的文本内容也是一个&lt;strong&gt;文本标签&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DOM树&lt;/strong&gt;：DOM树是DOM结构的表示形式，DOM把文档的每个节点根据父子关系连接，形成DOM树。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12节点节点类型和节点类"&gt;1.2、节点、节点类型和节点类&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;节点&lt;/strong&gt;：前面提过，节点是DOM树的组成单元。在JS看来，一个节点就是JS对象。下面用&lt;code&gt;node&lt;/code&gt;表示任意的节点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://developer.mozilla.org/zh-CN/docs/Web/API/Node/nodeType"&gt;节点类型&lt;/a&gt;&lt;/strong&gt;：并非所有的节点都是一样的，DOM规定文档中有12种节点类型，分别用常量&lt;code&gt;1 ~ 12&lt;/code&gt;（有与之对应的常量名称&lt;code&gt;Node.XXX_NODE&lt;/code&gt;）表示，可以通过&lt;code&gt;node.nodeType&lt;/code&gt;属性获取节点的类型常量。 现在，有些类型的节点已经弃用了，常见到的只有几种类型的节点，包括：&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;元素节点&lt;/strong&gt;: 类型常量为&lt;code&gt;Node.ELEMENT_NODE&lt;/code&gt;或&lt;code&gt;1&lt;/code&gt;。最常见的一类节点，对应文档中的元素。大部分DOM操作都是在元素节点层次的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文本节点&lt;/strong&gt;：类型常量为&lt;code&gt;Node.TEXT_NODE&lt;/code&gt;或&lt;code&gt;2&lt;/code&gt;。对应文档中的文本，&lt;strong&gt;任何文档内容都有对应的文本节点，即使空格和换行符&lt;/strong&gt;。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;空格和换行不会对页面内容产生影响，但它们确实以文本节点的形式存在于DOM树中。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Document节点&lt;/strong&gt;：类型常量为&lt;code&gt;Node.DOCUMENT_NODE&lt;/code&gt;或&lt;code&gt;9&lt;/code&gt;。它不对应文档的内容，而是作为文档的入口节点，每个文档都有且仅有一个入口，因为这种独特性，赋予一个特殊的变量名称&lt;code&gt;document&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注释节点&lt;/strong&gt;：类型常量为&lt;code&gt;Node.COMMENT_NODE&lt;/code&gt;或&lt;code&gt;8&lt;/code&gt;。它对应文档中的注释标签，文档的注释内容也是可读取和修改的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;节点类&lt;/strong&gt;：DOM内置许多节点类，类之间存在继承关系，形成一套节点类框架。每个节点对象都属于节点类，拥有该类和其父类的方法与属性，这使得操作节点十分简单。节点类框架的一部分大概如图： &lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/javascript/javascript-017/image-02.webp"&gt; 这些节点上有丰富的属性和方法，是继承的结果，可以看到，一个HTML标签元素至少有四层的继承关系。 以&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;标签为例，它属于&lt;code&gt;HTMLAnchorElement&lt;/code&gt;类，获得了&lt;code&gt;a.target&lt;/code&gt;，&lt;code&gt;a.download&lt;/code&gt;等属性，接着继承了&lt;code&gt;HTMLElement&lt;/code&gt;类上的&lt;code&gt;title&lt;/code&gt;, &lt;code&gt;hidden&lt;/code&gt;等属性和&lt;code&gt;click()&lt;/code&gt;等方法，又从&lt;code&gt;Element&lt;/code&gt;类继承了&lt;code&gt;tagName&lt;/code&gt;, &lt;code&gt;className&lt;/code&gt;等属性和&lt;code&gt;getAttribute()&lt;/code&gt;, &lt;code&gt;setAttribute()&lt;/code&gt;等方法，再从&lt;code&gt;Node&lt;/code&gt;类继承了&lt;code&gt;nodeType&lt;/code&gt;(前面说过的节点类型), &lt;code&gt;appenChild()&lt;/code&gt;, &lt;code&gt;removeChild()&lt;/code&gt;等方法，最后从&lt;code&gt;EventTarget&lt;/code&gt;类中继承了事件相关的属性和方法。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;不要混淆节点类型和节点类这两个概念&lt;/strong&gt;。前者是一个生活中的&lt;strong&gt;类别&lt;/strong&gt;，后者是编程意义上的&lt;strong&gt;类&lt;/strong&gt;。节点对象的&lt;code&gt;nodeType&lt;/code&gt;属性表示了它的类型，而节点类是该节点的从属的类。因为&lt;code&gt;Dode&lt;/code&gt;是一个抽象类，所以，如果知道了某个节点从属的类，我们就知道它的节点类型。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;区分节点与元素节点&lt;/strong&gt;。我们经常关心元素节点（简称元素），因为这是一类最常使用的节点，但是并非所有节点都是元素。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="13探索dom结构"&gt;1.3、探索DOM结构&lt;/h3&gt;
&lt;p&gt;前面的说法太抽象了，让我们用实际的例子看看文档、DOM树与节点的关系。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://software.hixie.ch/utilities/js/live-dom-viewer/?%3C!DOCTYPE%20html%3E%0A...#"&gt;Live DOM Viewer&lt;/a&gt;是一个可以根据HTML文档实时查看DOM树的网站。你把下面的例子复制过去，或者自己去探索。&lt;/p&gt;
&lt;p&gt;一个简单的HTML文档：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!DOCTYPE HTML&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; A simple text.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;ol&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;title&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;this is a title&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;czpcalm&amp;lt;/&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- comment --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;ol&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;它对应的DOM图（颜色区分了节点类型）：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/javascript/javascript-017/image-03.webp"&gt;&lt;/p&gt;
&lt;p&gt;留意这个图，你要注意几点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;总共有4种类型的节点，分别是&lt;code&gt;标签节点&lt;/code&gt;（红色）,&lt;code&gt;文本节点&lt;/code&gt;（灰色），&lt;code&gt;注释节点&lt;/code&gt;(黄色)和&lt;code&gt;DOCTYPE节点&lt;/code&gt;（紫色）。&lt;/li&gt;
&lt;li&gt;文档没有&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;标签却出现了&lt;code&gt;HEAD&lt;/code&gt;节点。这是因为HTML必然存在&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;，&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;，&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;标签，不存在时会自动补上。顺便一提，当出现&lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt;标签时，也一定会有&lt;code&gt;&amp;lt;tbody&amp;gt;&lt;/code&gt;标签。&lt;/li&gt;
&lt;li&gt;文档中的文本都会形成文本节点的内容，包括&lt;code&gt;空格␣&lt;/code&gt;和&lt;code&gt;换行↵&lt;/code&gt;。第一,&lt;code&gt;单独的空格和换行都会形成对应的文本节点&lt;/code&gt;；第二，有内容的文本节点的值包含前导和后继的空白。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;不是说HTML中的空白字符都被忽略吗？怎么这里又说全都是有效的字符？&lt;/p&gt;
&lt;p&gt;在从文档解析生成DOM树的过程中，HTML中的任何字符都是有效的；不过，在接下去的页面渲染的过程中，空白内容被忽略。所以从文档到页面的整过过程中，空白确实被忽略了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;理解DOM树中的父子关系对应文档中的包含（嵌套）关系。一个极佳的类比是文件树，把元素看做文件夹，文本看做文件，文件夹中可以存放文件和新的文件夹，然后一层层深入下去，DOM树也是如此。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;几个原则可以帮我们快速理解这个DOM树的构建：&lt;/p&gt;</description></item></channel></rss>