blog
blog copied to clipboard
回炉重学HTML/DOM/Element/Node之间的关系
前言
上个月写了一篇《从寻呼机到jQuery,一枚jQuery钉子户的独白》后,引起和技术小伙伴们的对HTML操作的讨论。
A君: jQuery
直接操作HTML
,让项目代码很难维护。
B君: React
/Vue
来管理 DOM
和抹平DOM
的操作,让开发者可以专注前端功能的实现。
C君: 用jQuery
不能让页面的节点Node
变化方便可控。
D君: 元素Element
操作还是交给有模板能力的框架来操作。
讨论过后我回想对话,感觉有哪些不对,HTML
,DOM
, Node
和Element
在交谈中各种混用,到底讨论是否是同一个问题呢,抱着这个心态我查了MDN
文档,算是初步理清楚了以上几个名词的含义。
什么是HTML
说起这个,应该很多人都很熟悉,就是HyperText Markup Language
的缩写,翻译过来就是超文本标记语言
。
HTML
是用来描述网页的结构,如果把网页比喻成一个摩天大楼,那么HTML
就是构成摩天大楼的钢筋混泥土结构
。
同时一个HTML
网页,可以描述成一个文档Document

图片来源于网络

图片来源于网络
什么是DOM
DOM
,是Document Object Model
的缩写,也就是文档对象模型,是对HTML
构成网页文档的一种对象描述。换句话说,DOM
是用于脚本程序(例如JavaScript
)操作HTML网页的对象模型。
DOM
已经实现了对 HTML
的节点操作、属性操作、事件操作和内容操作等接口和方法。可以这么说,所有对HTML
进行动态脚本(例如JavaScript
)的操作,都是对DOM
的操作
如果把网页比喻成一个摩天大楼
-
HTML
就构成摩天大楼的钢筋混泥土结构
-
DOM
就是构建摩天大楼的包工头
,做着管理操作HTML
的事情。
DOM
最常见的接口例如 document.getElementsByName('body')
,查找整个DOM tree
元素里的body
元素
什么是Element
Element
,通常称为“元素”,是对接口Node
实现,是所有文档对象(DOM
)的基类。
- 实现了节点接口
Node
的接口操作,例如节点的增删改查。 - 扩展了对节点的属性操作,例如
className
和attribute
操作。
如果把网页比喻成一个摩天大楼
-
HTML
就构成摩天大楼的钢筋混泥土结构
-
DOM
就是构建摩天大楼的包工头
- 那么
Element
是摩天大楼的装修工人
,主要实现DOM
中样式和内容的操作
例如操作DOM
的样式
// 获取DOM中的div元素
var divElems = document.getElementsByTagName('div');
// 元素操作
// 给第一个div元素加上 bg-red 的样式名称
divElems[0].classList.add('bg-red')
什么是Node
Node
是一个接口interface
,同时也是继承父接口EventTarget
。Node
主要描述了节点操作的方法和属性,例如描述了操作父节点parentNode
、子节点childNode
和兄弟节点previousSibling/nextSibling
的操作。
如果把网页比喻成一个摩天大楼
-
HTML
就构成摩天大楼的钢筋混泥土结构
-
DOM
就是构建摩天大楼的包工头
-
Element
是摩天大楼的装修工人
。 - 那么
Node
就是构建摩天大楼的建筑工人
,主要实现结构的操作
// 获取DOM中的div元素
var divElems = document.getElementsByTagName('div');
// 节点操作
// 给第一个div元素里追加一个 span的子节点
var span = document.createElement('span');
divElems[0].appendChild(span);
什么是 EventTarget
EventTarget
是一个事件接口,用于注册和触发事件描述的接口,也是最基本的事件监听器的接口。
如果把网页比喻成一个摩天大楼
-
HTML
就构成摩天大楼的钢筋混泥土结构
-
DOM
就是构建摩天大楼的包工头
-
Element
是摩天大楼的装修工人
。 -
Node
就是构建摩天大楼的建筑工人
。 - 那么
EventTarget
就是构建摩天大楼的电力工人
,主要是事件的注册和触发。
// 获取DOM中的div元素
var divElems = document.getElementsByTagName('div');
// 事件注册
var event = new Event('myclick');
divElems[0].addEventListener('myclick', function() {
alert('hello myclick event')
});
// 广播触发事件
divElems[0].dispatchEvent(event)
总结一下
我们回到前言
中的语境里,讨论所谓的jQuery
操作HTML
,其实本质就是JavaScript
对DOM
的操作。
其中DOM
是Element
的扩展实现,Element
是Node
接口的一种实现,而最基本的Node
接口是继承于底层的EventTarget
事件接口。
-
DOM
里相关事件事件监听和操作是,继承于EventTarget
实现的。 -
DOM
里相关属性和内容操作是,继承于Element
实现的。 -
DOM
里相节点操作是,继承于Node
实现的。
参考资料
个人觉得这个抽象不准确 HTML 只是协议,协议不应该对应上具体的 “钢筋结构” 的
个人觉得这个抽象不准确 HTML 只是协议,协议不应该对应上具体的 “钢筋结构” 的
哈哈,多谢的指教,我这里的HTML
描述有点歧义,应该是 HTML标记
个人觉得这个抽象不准确 HTML 只是协议,协议不应该对应上具体的 “钢筋结构” 的
哈哈,多谢的指教,我这里的
HTML
描述有点歧义,应该是HTML标记
嗯嗯,是的~ HTML标记
比较恰当