浅析Node与Element

摘要:
所以我发现我对节点和元素的概念不是很清楚,所以我去了MDN,写了一篇博客来安顿下来。NodeNode类继承自EventTarget。以下是MDN给出的解释。至于Element,您必须熟悉它。在继承方面,节点和元素之间的关系可能更加清晰。对于Node的某些方法,返回值为Node,例如文本节点和注释节点,而对于Element的某些方法来说,返回值必须为Element。要向所有DOM元素添加方法,只需污染Node或Element的原型链。

起因

起因有二:

  1. 在看winter老师的分享:《一个前端的自我修养》时,有注意到这么一幅图,里面有写childNodechildren属性。
    node和element

  2. 昨天有学弟问起我,能否自己定义一个所有元素节点通用的方法,就像数组可以用 Array.prototype.xxx 来添加一个所有数组的方法。
    于是发现自己对于Node和Element的概念其实还不太清晰,所以上MDN看了看,写篇博客沉淀一下。

Node

Node类继承于EventTarget,下面是MDN给的解释。
浅析Node与Element第2张

Node在这儿指DOM节点,其中包括了我们最常见的元素节点,比如 div/p/span 之类的。除此之外还包括了 Document/Comment 之类的节点。
一个节点的类型,可以通过其nodeType类型查看到,具体的类型则可以看下图:
浅析Node与Element第3张

高频的属性与方法

Node定义了一些经典的节点操作方法,我这儿画了个简单的图,并没有列出全部属性
浅析Node与Element第4张
写前端的同学,日常应该都会频繁的用到这些方法。

当然,也有可能会遇到踩坑的现象。比如说在使用nextSibling完成遍历操作的时候,nextSibling有可能会返回的是文本节点而非元素节点,那么在调用一些元素节点的属性或方法时(如 innerHTML),就会出错。这也是为什么一定要区分清楚两种节点的原因。

Element

至于说Element, 大家肯定就熟悉多了。学前端入门的时候,就用过的 document.getElementBy* 的 Api,取出来的就是Element。
Element在MDN的解释如下:
浅析Node与Element第5张

这个其实大家日常的使用也非常多,就不多做解释了。

Node与Element的关系

至于Node与Element的关系,从继承方面讲可能为清晰很多。

Element 继承于 Node,具有Node的方法,同时又拓展了很多自己的特有方法。
所以在Element的一些方法里,是明确区分了Node和Element的,比如说:childNodes, children, parentNode, parentElement等方法。

而Node的一些方法,返回值为Node,比如说文本节点,注释节点之类的,而Element的一些方法,返回值则一定是Element。
区分清楚这点了,也能避免很多低级问题。

如何给所有DOM元素添加方法

由于JavaScript原型的特点,我们只要给原型添加方法,就可以在所有继承的子元素中调用此方法。

当然,在这儿你选择污染Element的原型也好,Node的原型也罢,都是可行的。
具体看你要调用这个方法的元素,是纯元素节点还是会有别的一些节点。
按需取用就行。

DEMO:

HTMLElement.prototype.sayHi = () => alert('hi')

const p = document.querySelector('p')
p.sayHi()

总结:

  1. Node是节点,其中包含不同类型的节点,Element只是Node节点的一种。

  2. Element继承与Node,可以调用Node的方法。

  3. 给所有DOM元素添加方法,只需要污染Node或者Element的原型链就行。

参考资料:

免责声明:文章转载自《浅析Node与Element》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇从网页抓取数据的一般方法项目版本控制工具VSS介绍--转载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用Xcode IDE写node.js

最近在玩node.js 但是发现很多IDE就是用不顺手后来发现Xcode可以剖析java script于是试着使用Xcode来当做node.js的编辑器 首先,在Mac上必须先安装node.js的相关开发工具用MacPorts比较省时间 开发环境搞定后,打开Xcode 点选: 'File->New->Project' 然后选择左下角Other...

vue element UI el-table 单元格中超出字省略号显示

filters: {     formatLongText(value) {     if(value===undefined||value===null||value===''){     return '暂无';     }else if(value.length>8){      return value.substr(0, 8...

C语言单链表实现19个功能完全详解

 * list.c//#include "stdafx.h"#include "stdio.h"#include <stdlib.h>#include "string.h"typedef int elemType ;/****************************************************************...

K8S线上集群排查,实测排查Node节点NotReady异常状态

一,文章简述 大家好,本篇是个人的第 2 篇文章。是关于在之前项目中,k8s 线上集群中 Node 节点状态变成 NotReady 状态,导致整个 Node 节点中容器停止服务后的问题排查。 文章中所描述的是本人在项目中线上环境实际解决的,那除了如何解决该问题,更重要的是如何去排查这个问题的起因。 关于 Node 节点不可用的 NotReady 状态,当时...

element ui Cascader 级联选择器 关闭tag时报错 :vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in callback for watcher "value": "TypeError: Cannot read property 'level' of null"

情况说明:多选后,点击关闭tag的按钮,会出现如下报错。   经过使用官网列子,及数据。发现删除tag并不会出现这个错误。经过对比,唯一不同的是官网的value 是字符串对象,而我使用的id是数字。将id改成字符串格式后,问题就解决了。 ☀ ░ 标记一下░  ☀...

Element中的Cascader 级联选择器高度不能正常显示如何解决2

新版本的element在使用级联选择器的时候,高度存在问题,如何解决呢,之前的旧版本 可以通过自定义属性popper-class解决,但是新版本的无法使用这个属性解决了,新版本的问题必须在全局的global.css中更改 具体的更改方法如下: 在你的全局global.css里面添加: .el-cascader-menu { height: 300px;...