详细了解文档对象模型(DOM)

我们都听说过与JavaScript相关的DOM或文档对象模型。DOM是Web开发中一个非常重要的概念。没有它,我们就无法在浏览器中动态修改HTML页面。
学习和理解DOM可以更好地访问、修改改和监听HTML页面的不同元素。文档对象模型还可以帮助我们减少不必要的脚本执行时间增加。

另请阅读:15个用于Web开发人员DOM操作的javascript方法

数据结构树节点

在讨论dom是什么,它是如何产生的,它是如何存在的,以及它内部发生了什么之前,我想让您了解树。不是针叶树和落叶树,而是数据结构树。

如果我们简化数据结构的定义,就更容易理解它的概念。我想说,数据结构是关于安排数据的。是的,只是简单的旧安排,就像你把家里的家具或书放在书架上,或是把所有不同的食物组放在盘子里,以便让它对你有意义一样。

当然,这并不是数据结构的全部功能,但这几乎就是所有功能的起点。这种“安排”是一切的核心。它在DOM中也非常重要。但我们还没有讨论DOM,所以让我引导您使用一种您可能熟悉的数据结构:数组。

数组与树
数组具有索引和长度,它们可以是多维的,并且具有更多的特性。尽管了解数组的这些内容很重要,但我们现在不要为此而烦恼。当你把不同的事情排成一行的时候。对我们来说,数组非常简单。

在这里插入图片描述

同样,当我们想到树的时候,比如说,它是把东西放在另一个下面,从顶部的一个东西开始。

在这里插入图片描述

现在,你可以从以前的单列鸭子身上取下来,把它竖起来,告诉我“现在,每只鸭子都在另一只鸭子下面”。那是棵树吗?它是。

根据您的数据是什么,或者您将如何使用它,树中最顶层的数据(称为根)可能是非常重要的数据,或者只是在树下包含其他元素的数据。

不管怎样,树数据结构中最顶层的元素都会起到非常重要的作用。它提供了一个开始搜索我们想要从树中提取的任何信息的位置。

在这里插入图片描述

DOM的意义

DOM代表文档对象模型。文档指向以对象表示的HTML(XML)文档。(在javascript中,所有内容都只能表示为对象!)

这个模型是由浏览器创建的,它接受一个HTML文档并创建一个表示它的对象。我们可以用javascript访问这个对象。由于我们使用这个对象来操作HTML文档和构建我们自己的应用程序,所以DOM基本上是一个API。

DOM树

在JavaScript代码中,HTML文档表示为一个对象。从该文档中读取的所有数据也被保存为对象,彼此嵌套(因为就像我前面所说的,在JavaScript中,所有数据都只能表示为对象)。

所以,这基本上就是代码中DOM数据的物理排列:所有的东西都是作为对象排列的。但从逻辑上讲,它是一棵树。

DOM解析器

每个浏览器软件都有一个名为dom parser的程序,负责将HTML文档解析为dom。

在这里插入图片描述

将数据从HTML解析到DOM树
取一个简单的HTML文件。它有根元素<html>。它的子元素是<head>和<body>,每个子元素都有自己的子元素。
因此,从本质上讲,浏览器读取HTML文档中的数据,类似于:

<html>
  <head>
    <meta/>
    <link/>
  </head>
  <body>
    <header>
      <h1></h1>
         <h2></h2>
    </header>
    <main>
      <article>
        <p></p>
        <p></p>
        <p></p>
      </article>
    </main>
    <footer>
      <div></div>
    </footer>
  </body>
</html>

然后,像这样将它们排列成一个DOM树:


在这里插入图片描述

DOM树中每个HTML元素(及其所属内容)的标签称为节点。根节点是<html>的节点。

JavaScript中的DOM接口称为文档(因为它是HTML文档的表示)。因此,我们通过JavaScript中的文档接口访问HTML文档的DOM树。

我们不仅可以访问,还可以通过DOM操作HTML文档。我们可以向网页添加元素,删除并更新它们。每次我们更改或更新DOM树中的任何节点时,它都会渲染到网页上。

如何设计节点

我之前提到过,HTML文档中的每一段数据都保存为JavaScript中的一个对象。那么,如何将保存为对象的数据逻辑地排列为树呢

DOM树的节点具有某些特性或属性。几乎树中的每个节点都有一个父节点(它上面的节点)、子节点(它下面的节点)和兄弟节点(属于同一父节点的其他节点)。在一个节点的上面、下面和周围拥有这个族是使它成为树的一部分的条件。

每个节点的族信息都保存为表示该节点的对象中的属性。例如,children是一个节点的属性,它包含该节点的子元素列表,从而在逻辑上将其子元素排列在该节点下。

避免过度操作DOM

尽管我们发现更新DOM很有用(为了修改网页),但是别过度操作。

例如,您希望使用javascript更新网页上的div标签的颜色。您需要做的是访问相应的dom节点对象并修改color属性。这不应该影响树的其余部分(树中的其他节点)。

但是,如果要从树中删除节点或向其中添加节点,该怎么办?整个树可能需要重新渲染,删除节点或将节点添加到树中。这是一项昂贵的工作。完成这项工作需要时间和浏览器资源。

例如,假设您想向一个表中添加五行。对于每一行,当它的新节点被创建并添加到DOM时,树每次都被更新,总共添加了五个更新。

我们可以通过使用documentfragment接口来避免这种情况。把它想象成一个可以容纳所有五行并添加到树上的盒子。通过这种方式,将这五行添加为一个单独的数据块,而不是一个接一个地添加,从而在树中只进行一次更新。

这不仅在删除或添加元素时发生,而且调整元素的大小也会影响其他节点,因为调整大小的元素可能需要其周围的其他元素来调整其大小。因此,需要更新所有其他元素的对应节点,并根据新规则重绘HTML元素。

同样,当整个网页的布局受到影响时,可能会重新呈现该网页的一部分或全部。这一过程称为重绘。为了避免过度重绘,请确保不要过度更改DOM。对dom的更改并不是唯一会导致网页重绘的事情。根据浏览器的不同,其他因素也会对其产生影响

总结

把这些东西包装起来,DOM被可视化为一个由HTML文档中的所有元素组成的树。物理上(数字能得到的物理上的任何东西),它是一组嵌套的javascript对象,其中的属性和方法保存着信息,使逻辑上将它们排列到树中成为可能。

另请阅读:CSS对象模型(CSSOM)初学者指南

原文地址: https://www.hongkiat.com/blog/understanding-document-object-model/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354