温故知新——DOM节点增删查改替换复制

基于Flask+Vue构建个人B站视频知识库:从信息聚合到深度内化 在信息爆炸的时代,高效的知识管理成为个人学习和内容创作的关键。其核心原理在于将分散、非结构化的信息进行系统化聚合、分类与深度加工,从而构建可检索、可关联的个人知识体系。这一过程的技术价值在于,通过自定义的数据模型和检索逻辑,将被动接收转化为主动建构,极大提升了信息利用效率和知识留存率。典型的应用场景包括追踪技术动态、管理学习教程、归档研究资料等,尤其适用于视频这类富媒体内容的管理。本文以B站视频资料管理为例,详细阐述了如何利用Flask后端框架和Vue.js前端技术,实现一个支持视频信息抓取、结构化存储、个 阅读详情

DOM节点增删查改替换复制

这篇文章中总结的节点操作比较狭义,特指对 element 节点的操作,并没有包含其他内容,至于对文本内容和属性的操作就放在下一篇吧~

节点的“查”操作已经在上一篇文章中总结过了,在本文中主要包括创建节点、修改节点、插入节点、删除节点、替换节点、查看节点和复制节点

今天的通过下面这一段范例代码展开:

<ul id="users">
  <li class="user">小A君</li>
  <li class="user">小C君</li>
</ul>

我们可以设想这样一个应用场景,根据上面的结构,创建两个新的“小B君”和“小D君”,按照 ABCD 的顺序插入到上面的列表中

那么我们就开始吧~

创建节点

createElement

创建 element 节点主要依赖 createElement 方法,这个方法接受一个参数,即要创建的标签名:

let tempLi = document.createElement('li');
console.log(tempLi); // <li></li>

这个标签名并不区分大小写,但是按照标准最好还是采用小写~

当 element 被创建的时候,它所属的 document 就被设置好了,

修改节点

当一个空的 element 创建出来后,就要根据我们的需求为其添加内容

如果我们要添加的是文本内容,可以采用下面的几个方法;

  • innerText
  • textContent

而关于添加(插入)节点的内容就放在下一节 插入节点 中

innerText

innerText 属性是一个可读可写的属性,它可以操作元素中包含的所有文本内容,包括子文档树中的文本。在通过innerText读取值时,它会按照由浅入深地顺序,将子文档树中的所有文本拼接起来。在通过innerText写入值时,结果会删除元素的所有子节点,插入包含相应文本值的文本节点

console.log(document.getElementById('users').innerText); // 小A君 小B君 

而当我们进行写操作的时候,会直接将这个 element 中的所有子节点清除并添加一个文本节点(可以采用 element.innerText = '' 来清空一个元素),猜一下当我们执行下面这段代码的时候会发生什么:

let usersEle = document.getElementById('users');
usersEle.innerText = usersEle.innerText;

(如果真的写了这样的代码会被人打死的吧,咳咳~)

textContent

这个属性和 innerText 的使用方法基本一致,textContent 属性与 innerText 属性类似,该属性可读写。在读模式下,返回当前节点和它的所有后代节点的文本内容;在写模式下,结果会删除元素的所有子节点,插入包含相应文本值的文本节点

他们的主要区别在于 innerText 是 element 的属性,而 textContent 是 node 的属性且 textContent 不兼容 IE9 以下浏览器

console.log(document.getElementById('users').textContent); // 小A君 小B君 

插入节点

在创建好节点并添加好内容之后我们应该将节点插入到他们的父节点中了,插入节点的方法也不止一种

  • appendChild
  • insertBefore

appendChild

这个方法的作用可以很明显通过方法名理解,就是直接将一个 child 节点 append 进来,在节点的最后追加一个子节点

使用方法:

let tempLi = document.createElement('li');
tempLi.innerText = "小D君";
document.getElementById('users').appendChild(tempLi);

由于这个方法只能将节点添加到父节点的最后,所以在使用时需要注意顺序方面的要求,通常的做法是先进行一定的排序后再调用这个方法

⚠️注意: 如果要添加的节点已经存在在这个 document 中了,并不是新创建出来的 element,这时会发生的并不是单纯的插入,而是“移动”

<!-- html body -->
<ul id="users">
  <li class="user">小A君</li>
  <li class="user">小C君</li>
</ul>
<script>
  document.getElementById('users').appendChild(
    document.getElementsByClassName('user')[0]
  )
</script>

insertBefore

insertBefore() 方法接收两个参数:要插入的节点和作为参照的节点。插入节点后,被插入的节点会变成参照节点的前一个兄弟节点(previousSibling),同时被方法返回。如果参照节点是null,则insertBefore()与appendChild()方法执行相同的操作

同样地,如果插入的节点已经是文档的一部分了,那结果就是将该节点从原来的位置转移到新位置

这个方法就更加适合 “小B君” 的插入

let tempLi = document.createElement('li');
tempLi.innerText = "小B君";
document.getElementById('users').insertBefore(
  tempLi,
  document.getElementsByClassName('user')[1]
);

删除节点

removeChild

removeChild 方法接收一个参数,即要移除的节点,被移除的节点成为方法的返回值

let user0 = document.getElementsByClassName('user')[0];
document.getElementById('users').removeChild(user0);

remove()

remove 方法不太常见,直接在当前节点使用 remove() 方法就可以删除该节点,无返回值

要实现和上面一样的效果只需要

document.getElementsByClassName('user')[0].remove();

替换节点

replaceChild

replaceChild 接收的两个参数是要插入的节点和要替换的节点,要替换的节点将由这个方法返回并从文档树中移除,同时由要插入的节点占据其位置

let tempLi = document.createElement('li');
tempLi.innerText = "替换节点";
document.getElementById('users').replaceChild(
  tempLi,
  document.getElementsByClassName('user')[0]
);

复制节点

cloneNode

cloneNode 方法用于克隆一个节点

调用者是要被复制的 node,返回值是这个 node 的副本

它接受一个布尔值作为参数,表示是否执行深复制。在参数为true时,执行深复制,也就是复制节点及整个子节点树。在参数为false的情况下,执行浅复制,即复制节点本身

let dupUsers = document.getElementById('users').cloneNode(true);
console.log(dupUsers);

⚠️注意: 由于不同版本规范中 cloneNode 方法的默认参数不同,所以请一定加上参数

终极大招 innerHTML

上述提到的所有问题,都可以通过 innerHTML 解决

这个方法和前文中提到的 innerText 很相似

  • 在读模式下,返回与调用元素的所有子节点(包括元素、注释和文本节点)对应的HTML字符串;
  • 在写模式下,innerHTML会根据指定的值创建新的DOM树,然后用这个DOM树完全替换调用元素原先的所有子节点

我们可以在读模式下获取到我们要操作的 node 或者他的 父节点,之后通过字符串处理方法进行操作,然后再写入

但是我们一般不会这样做

主要是因为它存在安全问题,innerHTML不会检查代码,直接运行,会有风险

所以innerHTML方法建议仅用于新的节点,比如创建插入,内容最好是可控的,而不是用户填写的内容

Flutter 响应式状态管理框架GetX 在Flutter的状态管理框架中,主流的状态管理框架有四个:GetX(又称为Get)、BLoC、MobX、Provider。 阅读详情

相关推荐

利用vue.js插入dom节点的方法

本文主要介绍的是vue.js插入dom节点的方法,下面话不多说,来看看详细的介绍吧。 html代码: js代码: var MyComponent = Vue.extend({ template: 'Hello World' }) var myAppendTo = Vue.extend({ template:'appendTo' }) var myBefore = Vue.extend({ template:'before' }) var myAfter = Vue.extend({ templ

vue项目中 实现复制功能

vue使用插件 vue 可使用 vue-clipboard 插件 npm i vue-clipboard2 -S 安装插件 在main.js 中引入 import VueClipboard from ‘vue-clipboard2’ Vue.use(VueClipboard) <el-input v-model="input" size="mini" placeholder="请输入内容"></el-input> <el-button type="text" icon="

weixin_48022484的博客 1945

中图法第五版SQL,支持树形结构可直接导入使用

基于第五版中图法官方数据收集整理,效果图如下:

cloudin_adin的博客 978

vue 如何实现复制功能

vue实现复制功能

qq_45565693的博客 6418

【IT小趣闻】免费的DeepSeek是如何赚钱的?

导语:目前很多的通用人工智能也就是所谓的AGI例如文心一言、豆包、通义千问和最近大火的DeepSeek都是免费给普通用户使用的,对开源商业模式不太熟悉的普通人可不太了解这免费背后的商业套路,下面我们就一起来揭秘。开源模式能降低用户信任成本、加速技术普及,而商业化服务则针对企业级需求。DeepSeek 可通过组合上述策略,在服务开发者社区的同时,满足企业客户的深度需求,实现可持续发展。你也看出来了,上边是DeepSeek生成的,讲的还是挺明白的。

SunMy的博客 1762

团结引擎+OpenHarmony 2实战篇:从零构建鸿蒙应用开发环境

本文详细介绍了如何从零开始构建鸿蒙应用开发环境,重点讲解了团结引擎与OpenHarmony 2的实战配置步骤。内容包括DevEco Studio安装、OpenHarmony SDK配置、团结引擎集成及项目创建等关键环节,帮助开发者快速搭建高效的开发环境,提升鸿蒙应用开发效率。

weixin_29294395的博客 262

【转载】Vue 实现复制功能

Vue 实现复制功能

qq_39249627的博客 950

用于多种无人机协作的群体智能算法:综合综述

随着无人机技术的快速高水平发展,将多架无人机作为自主控制的编队应用于复杂情况是一个新兴领域的代表之一。在实现自主控制的挑战中,碰撞避免、任务分配、路径规划和编队重构是关键功能。本文对各种经典的无人机群智能算法进行了系统的总结和分析。

erjia_的博客 1万+

VUE自定义新增、复制、删除dom元素

实现思路:定义一个数量和一个数组,然后使用循环遍历展示内容,新增或删除时只需要改变定义的数量,然后删除对应数组元素即可。功能需求,能灵活新增或删除一个dom元素,在此dom元素中还存在能灵活新增、删除的dom元素。点击新增策略,能新增整个策略dom。

编程不过是一门失传艺术的别名,这门艺术的名字叫做“思考” 1395

记录rk3588 在Linux 6.1内核版本声卡 bug。

rk3588 Audio bug

Yongheng6的博客 855

EEGnet模型论文讲解(画图详解三种卷积层操作)

我录了一个讲解视频:https://www.bilibili.com/video/BV1si4y1s7g7/ 目录 一、整体介绍 二、梳理激活函数 三、图解三种卷积层 (核心内容) 四、总结 一、整体介绍 EEGnet是为专门一般的脑电图识别任务而设计的通用且紧凑的卷积神经网络。(设计思路借鉴了MobileNet) 下图是EEGnet的整体结构图,只有三个卷积模块,重点是depthwise conv 和separable conv这两个卷积模块。 表格表明了EEGnet的...

Amigo_1997的博客 2万+

JS温故知新

JS回顾JS的概述什么是JSJS的三大特性JS的组成JS的编写JS与HTML的结合JS基本语法变量JS的数据类型JS语句判断语句循环语句选择语句JS的运算符`=` 、 `==` 和 ``===``的区别JS数组JS数组的定义常用属性常用用操作JS的函数函数定义函数重载JS作用域String对象常用属性常用方法JS的Date对象创建Date对象常用方法Math对象常用方法全局函数什么是全局函数常用的...

班的博客 264

SLAM算法的优缺点

SLAM(Simultaneous Localization and Mapping,同时定位与地图构建)算法是一种通过传感器数据实时估计机器人自身位置和构建环境地图的技术。

selenia8860的博客 2906

vue3增删查改(规范版)- 规范如下图

页面结构 修改规范 DetailModal DetailModal.ts DetailModal.vue AppManage AppManage.ts AppManage.vue types(枚举)

qq_42556628的博客 2300

Apple Store 上架过包:iOS审核4.3被拒原因分析与解决修改方案

Apple Store 上架过包:iOS审核4.3被拒原因分析与解决修改方案

专业解决各种上架过包问题,专业团队专业处理 749

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

深度剖析 Vue3 如何通过虚拟DOM更新页面

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。

发果叁 2401

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

vue3+ts+element-plus管理系统实际开发业务之增删改查

vue3+ts+elementPlus实现一个页面,包括列表搜索,增删改查功能

3744

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

添加dom节点的复制功能自定义指令

import UiBtnTip from '@/components/ui-btn-tip.vue' export default function (Vue) { let rs = false Vue.directive('copy', { bind: function (el, binding, oldVnode) { el.handle = () => { el.$value = el.innerText .

weixin_45524809的博客 464

DOM ------ 克隆节点

克隆节点:node.cloneNode() //html代码 <ul> <li>1</li> <li>2</li> <li>3</li> </ul> //js代码 // 复制节点 node.cloneNode() var ul = document.querySelector('ul') /

HuoZhiyan 的博客 972

日常记录(3)

关于clone() 方法 clone() 方法生成被选元素的副本,包含子节点、文本和属性。 克隆所有的 <p> 元素,并插入到 <body> 元素的结尾: $("button").click(function(){ $("p").clone().appendTo("body"); }); vue组件嵌套: 包括全局注册组件以及局部注册组件(按理来说由于全局组...

走在路上的张先森 209

vue中如何进行DOM转移?

vue关于如何实现DOM转移

mengran_code的博客 1023

使用vueuse实现点击复制功能【Vue3,vueuse】

本文详细介绍了如何通过 Vue 3 和 VueUse 实现点击复制功能,包括具体的实现步骤、相关优化以及浏览器兼容性处理。在开发过程中,通过合理的错误处理和用户提示,不仅可以提升代码的可靠性,还能够极大地改善用户体验。希望本文对你在开发类似功能时有所帮助。

qq_22841387的博客 4126

vue 实现一键复制功能(复制图片和文字)

一键复制这个功能也是经常使用到的,实现起来并没有那么复杂原理就是找到这个Dom元素把这个元素里面的文字和图片直接复制下来。细节复制方法的时候可能会出现斜杆(不是不生效不用管),图片大小会维持原来的图片大小。注意在页面scss写的样式复制出来并不会生效,记得写行内样式才能识别到。

路虽远行则将至,事虽难做则必成。 3074

vue实现复制功能

用Vue实现复制功能,横向展开同样的方法也可用来给所需字段加标签。

m0_51066449的博客 1万+

vue clone html,Vue.js之slot深度复制详解

前言在Vue中,slot是一个很有用的特性,可以用来向组件内部插入一些内容。slot就是“插槽”的意思,用大白话说就是:定义组件的时候留几个口子,由用户来决定插入的内容。例如我们定义一个组件MyComponent,其包含一个slot:Vue.component('MyComponent', {template: ``})当调用123时,会渲染为如下DOM结构:123现在又有新需求了,我们希望调用1...

weixin_34512248的博客 543
上一篇: 温故知新——DOM操作之获取节点
Raaabbit
博客等级 码龄9年 47粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值