Web前端入门第 71 问:JavaScript DOM 节点操作(增删改)常用方法
有一个深有体会的事:发现现在很多前端同学,经常用 Vue 开发项目之后,在某些需求场景要操作 DOM 节点的时,就不知道咋办了~~
以前接手过其他开发团队的项目,项目被漏洞扫描工具发现了异常,原因是用了一个 vue-video-player 插件用于播放视频,这插件又依赖了低版本的 video.js 插件,而扫描工具发现的异常就是低版本的 video.js 插件存在安全问题,而且最新版的 vue-video-player 插件依赖都还存在问题,所以通过升级 vue-video-player 并不能解决问题,这时候就必须使用原生的 video.js 插件,而不能套用 vue-video-player 插件。
当时在改这个漏洞的时候就在想一个问题:为什么不直接使用 video.js 插件?而要使用一个上层封装的 vue-video-player ?最后对比了两个插件代码才发现,上层封装的这个插件只是提供了相对简单的 Vue 组件语法糖,而底层的 video.js 必须要针对 DOM 节点进行操作~~到这里大概就懂了当时开发这个功能的心思了,不太想写原生代码去操作 HTML 的 DOM 节点,毕竟 Vue 代码写习惯了,谁还会去写 DOM 操作的方法呢?
开发建议
咱们在项目开发的时候,应该尽可能少的安装三方依赖,如果三方依赖过多,不仅仅是代码的体积增大,还会导致供应链拉长,在这些过多的供应链中,如果某个依赖包存在漏洞,那么这个漏洞就会传播到项目,从而导致项目被攻击,这就是攻防体系中的 供应链攻击。
说回正题~~
DOM 操作
虽然 Vue/React 这些项目中咱们开发的时候不会写 DOM 操作的逻辑方法,但它们的本质还是离不开 DOM 节点的 增删改,毕竟要更新浏览器页面中的 HTML 元素,只能针对 DOM 节点进行操作。
创建 DOM 节点
常用的 DOM 节点操作方法就几个,其他不太常用的就不在此处列举~~
document.createElement(tagName)
document.createTextNode(text)
document.createComment(data)
示例:
// 创建元素节点
const div = document.createElement('div')
// 创建文本节点
const text = document.createTextNode('文本:前端路引')
// 创建注释节点
const comment = document.createComment('注释内容:公众号')
// 创建文档片段
const fragment = document.createDocumentFragment()
// 向文档片段中添加内容
fragment.appendChild(div)
fragment.appendChild(text)
fragment.appendChild(comment)
// 将文档片段添加到页面中
document.body.appendChild(fragment)
文档片段 这个方法是起到一个优化批量操作的作用,如果每次创建一个节点就往页面中添加,会导致页面频繁的回流重绘。使用 文档片段 这种方法,将要插入的节点内容,先缓存到文档片段中,然后再一次性添加到页面中,这样,页面就只会进行一次回流重绘,从而提高性能。

题外话:createComment 创建的注释节点,不仅仅可用于文档注释说明,还能用于保存其他一些数据在注释中,在需要的时候可以通过注释获取,比如:
const comment = document.createComment('注释内容')
comment.data = '公众号:前端路引'
document.body.appendChild(comment)
// 在需要的时候,可以通过 data 属性获取数据内容
console.log(comment.data)
所有的 HTML 节点上都可以新增自定义属性,用于保存一些自定义数据内容。
插入 DOM 节点
几个 create 创建方法,是通过 document 对象调用,但是要往页面中插入元素的时候,需要在要插入的节点上调用对应方法。
// 末尾插入
node.appendChild(node)
// 指定位置插入
node.insertBefore(newNode, referenceNode)
/*
更灵活的插入,position 支持
beforebegin 元素自身的前面。
afterend 元素自身的后面。
afterbegin 插入元素内部的第一个子节点之前。
beforeend 插入元素内部的最后一个子节点之后。
*/
element.insertAdjacentHTML(position, html)
示例:
<div id="container">
</div>
<script>
const container = document.querySelector('#container')
// 创建元素节点
const div = document.createElement('div')
div.textContent = '新文本节点:前端路引'
// 向 container 中添加 div
container.appendChild(div)
// 创建 span 节点
const span = document.createElement('span')
span.textContent = '这里是span节点'
// 在 div 前添加 span
container.insertBefore(span, div)
container.insertAdjacentHTML('beforebegin', `container 前面`)
container.insertAdjacentHTML('afterend', `container 后面`)
container.insertAdjacentHTML('afterbegin', `<div> container 内部开头</div>`)
container.insertAdjacentHTML('beforeend', `<div>container 内部结尾</div>`)
</script>
运行结果:

DOM 节点删除与替换
这类操作常用于删除页面中的某个元素,或者要将已经存在的元素替换为新的 HTML 元素。
node.remove()
node.replaceChild(newNode, oldNode)
示例:
<div id="container">
<h2>这里是容器:</h2>
<div class="content">这里是内容区域</div>
</div>
<script>
const container = document.querySelector('#container')
// 创建元素节点
const div = document.createElement('div')
div.textContent = '新文本节点:前端路引'
container.appendChild(div)
// 替换 .content 节点为 span 节点
const span = document.createElement('span')
span.textContent = '这里是span节点'
container.replaceChild(span, container.querySelector('.content'))
</script>
运行结果:

克隆节点
此方法用于复制节点,一般用于创建副本。
// deep=true 会克隆子节点
node.cloneNode(deep)
示例:
<div class="container">
<h2>这里是容器:</h2>
<div class="content">这里是内容区域</div>
</div>
<script>
const container = document.querySelector('.container')
// 复制元素节点,不包含子节点
const clone = container.cloneNode()
document.body.appendChild(clone)
// 复制元素节点,包含子节点
const clone2 = container.cloneNode(true)
document.body.appendChild(clone2)
</script>
运行结果:

写在最后
DOM 操作是最底层的方法,在 Vue/React 出现之前,jQuery 能统治一个时代,就是它内部封装了优秀的 DOM 操作方法,通过一些 API 暴露封装后更简单的方法,让前端不至于频繁的去写一些复杂的 DOM 操作代码。
更多内容参考 MDN:
https://developer.mozilla.org/zh-CN/docs/Web/API/Element
https://developer.mozilla.org/zh-CN/docs/Web/API/Node
Web前端入门第 71 问:JavaScript DOM 节点操作(增删改)常用方法的更多相关文章
- HTML DOM节点的增删改查
上篇博客中,我们已经初步接触了DOM基础,可是我们学习是为了可以更好地应用,今天我们就来看看DOM节点的增删改查. 无论在哪里,我们想要操作一个东西,总是应该先去获得它.那么我们怎么获得呢? HTML ...
- JavaScript DOM节点操作总结
节点类型 节点类型主要有三种:元素节点,属性节点和文本节点. 而对DOM的主要也就是围绕元素节点和属性节点的增删改查.下面就分别从对元素节点的操作和对属性节点的操作来介绍. 元素节点 查 在对DOM进 ...
- JavaScript DOM–节点操作
节点 节点至少拥有nodeType(节点类型).nodeName(节点名称)和nodeValue(节点值)这三个基本属性. 元素节点 nodeType 为1 属性节点 nodeType 为2 文本 ...
- DOM节点的增删改查
在开始展开DOM操作前,首先需要构建一棵DOM树. <!DOCTYPE html> <html lang="en"> <head> <me ...
- DOM节点的增删改查以及class属性的操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JS DOM节点的增删改查
合并拆分 行内样式 script写在html里面
- web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史
秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...
- 前端JavaScript之DOM节点操作
1.HTML DOM是啥 Document Object Model:定义了访问和操作HTML文档的标准方法,把HTML文档呈现为带有元素,属性和文本的树状结构 2.解析过程 HTML加载完毕,渲染引 ...
- 前端之javascript的节点操作和Event
一 节点的增删改查 创建节点:createElement(标签名):创建一个指定名称的节点. 追加节点: 追加一个子节点:somenode.appendChild(标签名) 指定某个位置前面添加一个节 ...
- JavaScript DOM 基础操作
JavaScript DOM 基础操作 一.获取元素的六方式 document.getElementById('id名称') //根据id名称获取 document.getElementsByclas ...
随机推荐
- Momentum Contrast for Unsupervised Visual Representation Learning论文精读
目录 Birth of MoCo Supervised Learning Contrastive Learning MoCo Dictionary Limits of the early learni ...
- 分享 3 款基于 .NET 开源且免费的远程桌面工具
前言 今天大姚给大家分享 3 款基于 .NET 开源.免费.功能强大的远程桌面工具,希望可以给大家的远程工作和学习带来便利. 1Remote 1Remote是一款基于 .NET 开源(GPL-3.0 ...
- redis的fd与epoll是怎么使用的
Redis 的高性能网络模型核心依赖于 文件描述符(fd) 和 epoll 的协同工作.下面我将从底层机制到实际应用,详细解析它们的配合方式: 一.核心组件关系图 二.fd 在 Redis 中的具体应 ...
- java基础之接口、多态
一.接口:是Java语言中一种引用类型[组数.类也是引用类型],内部主要就是封装了方法, 包括(抽象方法.默认方法.静态方法.私有方法) 格式: public interface 接口名称 { // ...
- markdown文本编辑器--核心功能(解析和渲染)
开源项目地址 GitHub 开源地址(YtyMark-java) 欢迎提交 PR.Issue.Star ️! 1. 简述 YtyMark-java项目分为两大模块: UI界面(ytyedit-mark ...
- [亲测]ThinkPHP中where方法中变量不解析的解决方法
2018年5月4日 01:15 血的教训,今天做一个项目,需要批量更新数据,所以where中必须用变量.发现where里的变量不解析并且会直接报错,然后通过搜索发现可以在双引号中的左右加号中包裹变量 ...
- NPOI,给指定的excle创建个下拉框验证
NPOI,给指定的excle创建个下拉框验证 先大致看下效果吧 Nuget 搜索 NPOI,一般出来的第一个就是,安装NPOI基础环境 1 using NPOI.HSSF.UserModel; 2 ...
- Sentinel源码—9.限流算法的实现对比
大纲 1.漏桶算法的实现对比 (1)普通思路的漏桶算法实现 (2)节省线程的漏桶算法实现 (3)Sentinel中的漏桶算法实现 (4)Sentinel中的漏桶算法与普通漏桶算法的区别 (5)Sent ...
- Cline技术分析:基于Cline Prompt的File Tools MCP Server实现
我们将基于Cline prompt技术,构建一个基于MCP协议的文件工具服务器.我们将从任务定义开始,并在任务执行过程中探讨各个关键环节. 任务提示词定义 1. 访问[hub.gitmirror.co ...
- 使用DVC管理大文件变更历史(基于git)
DVC(Data Version Control) 是一个专门用于管理数据和二进制文件版本控制 的工具,它特别适合那些需要处理大量非文本文件(如图像.视频.模型.数据集等)的项目. 一般地,如果项目中 ...