文档对象模型(DOM)

抢先看:https://www.zhihu.com/question/34219998

浏览器渲染页面的过程

一、DOM构造

HTML解析器:将浏览器接收到的HTML代码解析并构建成DOM树,DOM树中的节点有一定的关联,如父子、兄弟,方便我们操作节点。如下图所示:

DOM树.png

CSS解析器: 将浏览器接收到的CSS代码构建出样式表规则,根据选择器放到对应的DOM树的节点上,形成带有样式属性的DOM树。如下图所示:

样式属性的DOM树.png

二、布局

浏览器从上到下,从左到右读取DOM数的文档结点(盒子),顺序存放到文档流(传送带)中。
文档流排完之后,开始获取计算节点的坐标和大小等css属性,作为盒子的包装说明。
最后把盒子在仓库中进行板房,此时节点布局到了页面。

文档流.png

页面布局.png

三、绘制页面

布局完成【没有进行可视化】,最后就是把内容绘制出来,完成整个页面的渲染。

DOM详解

D:表示document,上述中提到的文档流。当我们创建了一个网页并把它加载到Web浏览器中时,DOM就在幕后悄然而生。将我们编写的网页文档转换为一个文档对象
O:表示object,是宿主对象(浏览器提供的对象),DOM中的O表示的document对象,主要的功能就是处理网页内容。
M:表示model,即表示一种表现形式。浏览器为网页的显示提供了表现形式。
文档对象模型(DOM)是HTML和XML文档的编程接口。它提供了对文档的结构化表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构、样式和内容。DOM将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。即DOM会将web页面和程序语言连接起来。
DOM的方法:可以让我们用特定的方式操作这个树,改变文档的结构、样式或内容。
事件处理器:节点可以关联事件处理器,一旦某一事件被触发了,这个事件处理器就会被执行。

如何访问DOM

使用documentwindow对象的API来操作文档本身或获取文档的子类。

访问DOM的时机

操作DOM之前要保证浏览器已经渲染过了

时机一:在HTML文档的body元素结束标签之前

可以是外部的js文件,也可以是内部的script标签

<!DOCTYPE html>
<html>
    <head>
        <title>fieldset</title>
    </head>
    <body>
        <div id="message">
            
        </div>
        <div>
            
        </div>
        <script type="text/javascript">
            let div = document.getElementById("message");
        </script>
    </body>
</html>

时机二:使用文档加载事件

可以是外部的js文件,也可以是内部的script标签

<!DOCTYPE html>
<html>
    <head>
        <title>fieldset</title>
    </head>
    <body>
        <div id="message">
            
        </div>
        <script type="text/javascript"> 
            let div = document.getElementById("message");
        </script>
        <div>
            
        </div>
    </body>
</html>

时机三:在HTML文档的任意地方,并且使用定时器设置为异步

可以是外部的js文件,也可以是内部的script标签

<!DOCTYPE html>
<html>
    <head>
        <title>fieldset</title>
    </head>
    <body>
        
        <script type="text/javascript">
            let div;
            setTimeout(function(){
                div = document.getElementById("message");
                console.log(div)
            })
        </script>
        <div id="message">
            
        </div>
        <div>
            
        </div>
    </body>
</html>
时机四:加载外部js文件,且使用defer属性

index.html

<!DOCTYPE html>
<html>
    <head>
        <title>fieldset</title>
    </head>
    <body>
        
        <script defer type="text/javascript" src="js/index.js"></script>
        <div id="message">
            
        </div>
        <div>
            
        </div>
    </body>
</html>

index.js

let div = document.getElementById("message");
console.log(div)

节点对象 Node

类型 简介
document DOM操作的起始节点
标签元素节点 Element元素或节点
文本节点 表示文本的节点
注释节点 表示HTML中的注释的节点
NodeList Node的列表
HTMLCollection HTML的集合

NodeList VS HTMLCollection

NodeList和HTMLCollection都是包含多个节点标签的集合

NodeList HTMLCollection
length
方法
NodeList.png
HTMLCollection.png
来源 document.querySelector()
document.getElementsByName()
document.getElementsByTagName()
document.getElementByClassName()
转换为数组

方法一:使用call调用Array中的原型方法
Array.prototype.slice.call(节点集合, 0);作用为把具有length属性的对象转换为数组。返回值数组类型
方法二:使用Array.from(节点集合)
方法三:使用点语法将节点集合转换为数组

节点的原型链

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

推荐阅读更多精彩内容