chenshenhai / blog

个人博客,没事写写玩玩~~~
145 stars 21 forks source link

回炉重学HTML/DOM/Element/Node之间的关系 #34

Open chenshenhai opened 5 years ago

chenshenhai commented 5 years ago

前言

上个月写了一篇《从寻呼机到jQuery,一枚jQuery钉子户的独白》后,引起和技术小伙伴们的对HTML操作的讨论。

A君: jQuery直接操作HTML,让项目代码很难维护。

B君: React/Vue来管理 DOM和抹平DOM的操作,让开发者可以专注前端功能的实现。

C君: 用jQuery不能让页面的节点Node变化方便可控。

D君: 元素Element操作还是交给有模板能力的框架来操作。

讨论过后我回想对话,感觉有哪些不对,HTML,DOM, NodeElement在交谈中各种混用,到底讨论是否是同一个问题呢,抱着这个心态我查了MDN文档,算是初步理清楚了以上几个名词的含义。

什么是HTML

说起这个,应该很多人都很熟悉,就是HyperText Markup Language的缩写,翻译过来就是超文本标记语言

HTML是用来描述网页的结构,如果把网页比喻成一个摩天大楼,那么HTML就是构成摩天大楼的钢筋混泥土结构

同时一个HTML网页,可以描述成一个文档Document

图片来源于网络

图片来源于网络

什么是DOM

DOM,是Document Object Model的缩写,也就是文档对象模型,是对HTML构成网页文档的一种对象描述。换句话说,DOM是用于脚本程序(例如JavaScript)操作HTML网页的对象模型。

DOM 已经实现了对 HTML的节点操作、属性操作、事件操作和内容操作等接口和方法。可以这么说,所有对HTML进行动态脚本(例如JavaScript)的操作,都是对DOM的操作

如果把网页比喻成一个摩天大楼

DOM最常见的接口例如 document.getElementsByName('body'),查找整个DOM tree元素里的body元素

什么是Element

Element,通常称为“元素”,是对接口Node实现,是所有文档对象(DOM)的基类。

如果把网页比喻成一个摩天大楼

例如操作DOM的样式

// 获取DOM中的div元素
var divElems = document.getElementsByTagName('div');
// 元素操作
// 给第一个div元素加上 bg-red 的样式名称
divElems[0].classList.add('bg-red')

什么是Node

Node是一个接口interface,同时也是继承父接口EventTargetNode主要描述了节点操作的方法和属性,例如描述了操作父节点parentNode、子节点childNode和兄弟节点previousSibling/nextSibling的操作。

如果把网页比喻成一个摩天大楼

// 获取DOM中的div元素
var divElems = document.getElementsByTagName('div');

// 节点操作
// 给第一个div元素里追加一个 span的子节点
var span = document.createElement('span');
divElems[0].appendChild(span);

什么是 EventTarget

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,其实本质就是JavaScriptDOM的操作。

其中DOMElement的扩展实现,ElementNode接口的一种实现,而最基本的Node接口是继承于底层的EventTarget 事件接口。

参考资料

ComradeFu commented 4 years ago

个人觉得这个抽象不准确 HTML 只是协议,协议不应该对应上具体的 “钢筋结构” 的

chenshenhai commented 4 years ago

个人觉得这个抽象不准确 HTML 只是协议,协议不应该对应上具体的 “钢筋结构” 的

哈哈,多谢的指教,我这里的HTML描述有点歧义,应该是 HTML标记

ComradeFu commented 4 years ago

个人觉得这个抽象不准确 HTML 只是协议,协议不应该对应上具体的 “钢筋结构” 的

哈哈,多谢的指教,我这里的HTML描述有点歧义,应该是 HTML标记

嗯嗯,是的~ HTML标记比较恰当