div内容横排 html_回炉重学HTML/DOM/Element/Node之间的关系

00c0923695122c980079365cd70ce66e.png

前言

上个月写了一篇《从寻呼机到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

9f14c3445c740ae8ad26d9c849a67a88.png
图片来源于网络

5f99b371aebe08328736b6ac7546ffea.png
图片来源于网络
图片来源于网络

什么是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的接口操作,例如节点的增删改查。
  • 扩展了对节点的属性操作,例如classNameattribute操作。

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

  • HTML就构成摩天大楼的钢筋混泥土结构
  • DOM就是构建摩天大楼的包工头
  • 那么Element是摩天大楼的装修工人,主要实现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的操作。

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

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

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

  • DOM里相关事件事件监听和操作是,继承于EventTarget实现的。
  • DOM里相关属性和内容操作是,继承于Element实现的。
  • DOM里相节点操作是,继承于Node实现的。

参考资料

  • [1] MDN web docs: Web/HTML
  • [2] MDN web docs: Web/API/Document_Object_Model
  • [3] MDN web docs: Web/API/Element
  • [4] MDN web docs: Web/API/Node
  • [5] MDN web docs: Web/API/EventTarget

本文章首发于公众号 “大海码”

回炉重学HTML / DOM / Element / Node之间的关系​mp.weixin.qq.com
1b704255c71d1f57f8955138e40d32f6.png

如果想更加方便进行技术交流,可以关注我公众号 “大海码”。

8976a8293b23a0733c9abfc75c375165.png
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值