day6JS-DOM(文档对象模型)

news2024/11/25 20:42:16

DOM树

DOM 操作

1. 获取元素

1.1 根据id名获取元素

document.getElementById("id名");

案例:

<body>
    <div id="box">div盒子</div>
    <h1>一级标题</h1>
    <script>
        console.log(document.getElementById("box"))
    </script>
</body>

1.2 根据标签名获取

 // 返回一个集合 (类数组对象)从整个文档获取
document.getElementsByTagName("标签名")  

// 从element的后代元素中获取
element.getElementsByTagName("标签名")    

案例:

<body>
    <div id="box">div盒子</div>
    <h1>一级标题</h1>
    <p>段落1</p>
    <p>段落2</p>
    <p>段落3</p>
    <script>
        //获取到文档中所有的p标签,返回的是一个集合
        console.log(document.getElementsByTagName("p"))
    </script>
</body>

1.3 根据类名获取(不兼容ie6~8)

 // 返回一个集合(类数组对象)  从整个文档获取
document.getElementsByClassName("class名")  

// 从element的后代中获取
element.getElementsByClassName("class名")   

案例:

<body>
    <div class="box">div盒子</div>
    <h1>一级标题</h1>
    <p>段落1</p>
    <p>段落2</p>
    <p>段落3</p>
    <script>
        console.log(document.getElementsByClassName("box"))
    </script>
</body>

1.4 根据 name 属性值获取(适用于表单标签)

        正常的规范中,咱们只会给表单元素起name值,如果给其它元素设置name,在ie9以下版本浏览器不兼容,是获取不到的,所以为了这种情况,咱们以后养成习惯,只给表单元素用name非表单元素不用name

 //返回集合,只有document才有该方法
document.getElementsByName("name属性的值") 

案例: 

<body>
    用户名:<input type="text" name="usename" value="">
    用户名:<input type="password" name="pwd" value="">
    <script>
        console.log(document.getElementsByName("usename"))
    </script>
</body>

1.5 根据css选择器获取(重点记忆)

注意:querySelector() querySelectorAll() 在ie6-ie8 下不兼容。

 //选择器第一个满足选择器条件的
document.querySelector(选择器)
//选择所有满足选择器条件的,返回nodeList(类数组对象)  
document.querySelectorAll(选择器) 

element.querySelector(选择器)
element.querySelectorAll(选择器)

案例:

<body>
    <div id="divbox">
        <p class="pbox">段落1</p>
        <p>段落2</p>
        用户名:<input type="text" name="usename" value="">
    </div>
    <script>
        //querySelector只能获取第一个符合条件的元素
        console.log(document.querySelector("#divbox"))
        console.log(document.querySelector(".pbox"))
        console.log(document.querySelector("#divbox p"))
        // querySelectorAll获取所有符合条件的元素,返回的是集合
        console.log(document.querySelectorAll("#divbox"))
        console.log(document.querySelectorAll(".pbox"))
        console.log(document.querySelectorAll("#divbox p"))
        console.log(document.querySelectorAll("input"))
    </script>
</body>

注意!!!

根据css选择器获取时,是什么选择器就要带上该选择器的语法符号

例如:id选择器  ---- #选择器名; 类选择器 ---- .选择器名

1.6 获取Head元素对象

document.head 

案例:

<body>
    <script>
        console.log(document.head);
    </script>
</body>

1.7 获取body元素对象

document.body

案例: 

<body>
    <script>
        console.log(document.body);
    </script>
</body>

1.8 获取html元素对象

document.documentElement

案例:

<body>
    <script>
        console.log(document.documentElement);
    </script>
</body>

1.9 获取一屏幕的宽度或者高度

// 获取一屏幕的高度
let vH = document.documentElement.clientHeight || document.body.clientHeight;

// 获取一屏幕的宽度
let vW = document.documentElement.clientWidth || document.body.clientWidth;

1.10 id小妙招

 直接把id当成变量去用的时候,可以获取相应的id元素。(浏览器的机制)。

<div id="box1">111</div>
<script>
  console.log(box1)
</script>

2. 节点

2.1 常用的节点5个

  • 文档节点
  • 属性节点
  • 元素(标签)节点
  • 文本节点
  • 注释节点

2.2 文档节点

  • nodeType(节点类型):9(类型值9就是文档节点)
  • nodeName(节点名称):" #document "
  • nodeValue(节点值): null

案例:

<body>
    <script>
        console.log(document.nodeType);//9
        console.log(document.nodeName);//#document
        console.log(document.nodeValue);//null
    </script>
</body>

2.3 元素节点(重点记忆)

  • nodeType(节点类型):1(类型值1就是元素节点)
  • nodeName(节点名称):大写的标签名
  • nodeValue(节点值): null

案例:

<body>
    <div id="box">111</div>
    <div class="one">222</div>
    <h1>大标题</h1>
    <script>
        // 1.根据id属性先获取元素
        let divBox = document.getElementById("box");
        console.log(divBox.nodeType);//1
        console.log(divBox.nodeName);//DIV
        console.log(divBox.nodeValue);//null

        let divBox2 = document.querySelector("h1");
        console.log(divBox2.nodeType);//1
        console.log(divBox2.nodeName);//H1
        console.log(divBox2.nodeValue);//null
    </script>
</body>

2.4 属性节点

  • nodeType(节点类型):2(类型值2就是属性节点)
  • nodeName(节点名称):属性名
  • nodeValue(节点值): 属性值

getAttributeNode("属性名") 方法从当前元素中通过属性名称获取属性节点

案例:

<body>
    <div id="box" class="one" name="xiaoxiao">111</div>
    <script>
        // 1.先获取属性
        var myclass1 = box.getAttributeNode("class");
        // 2.在控制台输出
        console.log(myclass1);//class="one"
        console.log(myclass1.nodeType);//2
        console.log(myclass1.nodeName);//class
        console.log(myclass1.nodeValue);//one

        // 1.先获取属性
        var myclass2 = box.getAttributeNode("name");
        // 2.在控制台输出
        console.log(myclass2);//name="xiaoxiao"
        console.log(myclass2.nodeType);//2
        console.log(myclass2.nodeName);//name
        console.log(myclass2.nodeValue);//xiaoxiao
    </script>
</body>

2.5 文本节点

  • nodeType(节点类型):3(类型值3就是文本节点)
  • nodeName(节点名称):" # text "
  • nodeValue(节点值): 文本内容
  • 在标准浏览器中,换行和空格也属于文本节点

使用childNodes方法获得文本内容。

案例:

<body>
    <div id="box">111</div>
    <div class="one">222</div>
    <h1>大标题</h1>
    <script>
        // 1.根据id属性先获取元素
        let h1Box = document.querySelector("h1");
        let textBox = h1Box.childNodes[0];
        console.log(textBox);//"大标题"
        console.log(textBox.nodeType);//3
        console.log(textBox.nodeName);//#text
        console.log(textBox.nodeValue);//大标题
    </script>
</body>

2.6 注释节点

  • nodeType(节点类型):8(类型值8就是注释节点)
  • nodeName(节点名称):" #comment "
  • nodeValue(节点值): 注释的内容
<body>
    <!--这是一个div -->
    <div id="box">111</div>
    <script>
        let commentBox = document.body.childNodes[1];
        console.log(commentBox);//<!--这是一个div -->
        console.log(commentBox.nodeType);//8
        console.log(commentBox.nodeName);//#comment
        console.log(commentBox.nodeValue);//这是一个div
    </script>
</body>

3. 节点之间关系的属性

3.1 节点类

parentNode :父节点。

childNodes :所有子节点的集合。

firstChild :第一个子节点。

lastChild :最后一个子节点。

previousSibling :上一个兄弟节点。

nextSibling :下一个兄弟节点。

3.2 元素类

children :所有子元素的集合。

firstElementChild :第一个子元素 IE9+。

lastElementChild :最后一个子元素 IE9+。

previousElementSibling :上一个兄弟元素 IE9+。

nextElementSibling :下一个兄弟元素 IE9+。

4. 节点查找方式

4.1 parentNode(父节点)

获取当前节点唯一的父亲节点

<body>
    <div id="box">111</div>
    <script>
        console.log(box.parentNode);
    </script>
</body>

4.2 childNodes(子节点)

获取当前节点所有的子节点。

<body>
    <div id="box">111</div>
    <ul id="ulBox">
        <li>查找子节点1</li>
        <li>查找子节点2</li>
        <li>查找子节点3</li>
    </ul>
    <script>
        console.log(ulBox.childNodes);//NodeList(7)
    </script>
</body>

注意!!!

在js中换行和空格也算是text文本内容

4.3 firstChild

获取当前节点的第一个子节点

<body>
    <div id="box">111</div>
    <ul id="ulBox">
        <li>查找子节点1</li>
        <li>查找子节点2</li>
        <li>查找子节点3</li>
    </ul>
    <script>
        console.log(ulBox.firstChild);//#text
    </script>
</body>

4.4 lastChild

获取被选节点的最后一个子节点

<body>
    <div id="box">111</div>
    <ul id="ulBox">
        <li>查找子节点1</li>
        <li>查找子节点2</li>
        <li>查找子节点3</li>
    </ul>
    <script>
        console.log(ulBox.lastChild);//#text
    </script>
</body>

4.5 previousSibling

获取当前节点的上一个兄弟节点

<body>
    <div id="box">111</div>
    <ul id="ulBox">
        <li>查找子节点1</li>
        <li>查找子节点2</li>
        <li>查找子节点3</li>
    </ul>
    <h1>标题</h1>
    <script>
        console.log(ulBox.previousSibling);//#text
    </script>
</body>

4.6 nextSibling

获取当前节点的下一个兄弟节点

<body>
    <div id="box">111</div>
    <ul id="ulBox">
        <li>查找子节点1</li>
        <li>查找子节点2</li>
        <li>查找子节点3</li>
    </ul>
    <h1>标题</h1>
    <script>
        console.log(ulBox.nextSibling);//#text
    </script>
</body>

5. 元素查找方式

5.1 children

获取当前元素所有的元素子节点

<body>
    <div id="box">111</div>
    <ul id="ulBox">
        <li>查找子节点1</li>
        <li>查找子节点2</li>
        <li>查找子节点3</li>
    </ul>
    <h1>标题</h1>
    <script>
        console.log(ulBox.children);//[li,li,li]
    </script>
</body>

5.2 firstElementChild

获取当前节点的第一个元素子节点

<body>
    <div id="box">111</div>
    <ul id="ulBox">
        <li>查找子节点1</li>
        <li>查找子节点2</li>
        <li>查找子节点3</li>
    </ul>
    <h1>标题</h1>
    <script>
        console.log(ulBox.firstElementChild);//<li>查找子节点1</li>
    </script>
</body>

5.3 lastElementChild

获取当前节点的最后一个元素子节点

<body>
    <div id="box">111</div>
    <ul id="ulBox">
        <li>查找子节点1</li>
        <li>查找子节点2</li>
        <li>查找子节点3</li>
    </ul>
    <h1>标题</h1>
    <script>
        console.log(ulBox.lastElementChild);//<li>查找子节点3</li>
    </script>
</body>

5.4 previousElementSibling

获取当前节点的上一个兄弟元素节点

<body>
    <div id="box">111</div>
    <ul id="ulBox">
        <li>查找子节点1</li>
        <li>查找子节点2</li>
        <li>查找子节点3</li>
    </ul>
    <h1>标题</h1>
    <script>
        console.log(ulBox.previousElementSibling);//<div id="box">111</div>
    </script>
</body>

5.5 nextElementSibling

获取当前节点的下一个兄弟元素节点

<body>
    <div id="box">111</div>
    <ul id="ulBox">
        <li>查找子节点1</li>
        <li>查找子节点2</li>
        <li>查找子节点3</li>
    </ul>
    <h1>标题</h1>
    <script>
        console.log(ulBox.nextElementSibling);//<h1>标题</h1>
    </script>
</body>

6.练习题

使用previousSibling编写出previousElementSibling的效果。

<body>
    <div id="box">111</div>
    <ul id="ulBox">
        <li>查找子节点1</li>
        <li>查找子节点2</li>
        <li>查找子节点3</li>
    </ul>
    <h1>标题</h1>
    <script>
        function getPreviousSibling(itme) {
            let getPrevious = itme.previousSibling;
            while (getPrevious && getPrevious.nodeType !== 1) {
                getPrevious = getPrevious.previousSibling;
            }
            return getPrevious;
        }
        let ulBox = document.querySelector("#ulBox");
        let result = getPreviousSibling(ulBox);
        console.log(result);
    </script>
</body>

DOM 的增删改

1. createElement:创建一个元素

document.createElement("标签名");

案例:

<body>
    <script>
        // 1.创建标签
        let div = document.createElement("div");
        // 2.给标签添加内容
        div.innerHTML = "这是一个div标签";
        // 3.把标签写入页面
        document.body.appendChild(div);
    </script>
</body>

2. createTextNode: 创建一个文本节点

var/let 变量名 = document.createTextNode("文本内容");

案例:

<body>
    <script>
        // 1.创建标签
        let div = document.createElement("div");
        // 2.给标签添加内容
        let divText = document.createTextNode("这是一个div标签");
        div.appendChild(divText);
        // 3.把标签写入页面
        document.body.appendChild(div);
    </script>
</body>

3. appendChild: 把元素追加到一个容器的末尾

语法:父元素.appendChild(子元素);

<body>
    <script>
        // 1.创建标签
        let div = document.createElement("div");
        // 2.给标签添加内容
        let divText = document.createTextNode("这是一个div标签");
        div.appendChild(divText);
        // 3.把标签写入页面
        document.body.appendChild(div);
    </script>
</body>

4. insertBefore: 把一个元素插入到另一个元素的前面

步骤一:创建一个标签(元素)。

步骤二:给标签(元素)添加内容。

步骤三:获取到指定一个父节点。然后父节点使用insertBefore插入。

语法:
var/let 变量名 = 父节点.insertBefore(新的子元素, 旧的子元素)

案例:

<body>
    <ul>
        <li>1</li>
        <li id="two">2</li>
    </ul>
    <script>
        // 1.创建标签
        let li = document.createElement("li");
        // 2.给标签添加内容
        li.innerHTML = "3";
        // 3.获取到要加入的父元素
        let ulParent = document.querySelector("ul");
        // 4. 将新元素插入到旧的元素之前
        ulParent.insertBefore(li, two);
    </script>
</body>

使用该方法还可以交换标签的位置。

<body>
    <ul>
        <li id="one">1</li>
        <li id="two">2</li>
    </ul>
    <script>
        // 1.获取到要加入的父元素
        let ulParent = document.querySelector("ul");
        // 1. 交换位置
        ulParent.insertBefore(two, one);
    </script>
</body>

5. cloneNode: 把某一个节点进行克隆

  • cloneNode()浅克隆: 只是克隆了一个节点,里面的内容还有样式都没克隆
  • cloneNode(true)深克隆:把节点包含的所有内容和样式进行克隆
<body>
    <ul>
        <li id="one" style="color: red">111</li>
        <li id="two">222</li>
    </ul>
    <script>
        // 1.获取到要克隆的元素
        let ulParent = document.querySelector("ul");
        // 2. 无参,只克隆了一个节点,不克隆样式
        let con1 = ulParent.cloneNode();
        document.body.appendChild(con1);//页面不显示内容
        // 3. 有参,既有内容,又有样式
        let con2 = ulParent.cloneNode(true);
        document.body.appendChild(con2);
    </script>
</body>

6. removeChild:移除某个节点

【context】.removeChild(ele);

<body>
    <ul>
        <li id="one" style="color: red">111</li>
        <li id="two">222</li>
    </ul>
    <script>
        // 1.获取到要克隆的元素
        let ulParent = document.querySelector("ul");
        ulParent.removeChild(one);
        console.log(ulParent);
    </script>
</body>

7. set/get/removeAttribute()

  • setAttribute():设置当前元素的某一个自定义属性。
  • getAttribute():获取当前元素的某一个自定义属性。
  • removeAttribute():删除当前元素的某一个自定义属性。
box.setAttribute("index", 1);
box.getAttribute("index");
box.removeAttribute("index");
console.log(box)
// 设置
// box["aa"] = 22;
// 获取
// box["aa"]
//移除
// delete box["aa"];

        基于键值对方式增删改:修改当前对象的堆内存空间完成的(在堆内存空间可以看到)

        基于Attribute dom方法增删改,是修改html结构来完成的(此种方法设置的在结构上可以看到)。

以上两种方式不能混用

8. 练习题

利用a标签的href来重新获取url参数。

前置知识:a标签的两个方法:

<a href="http://www.zhufengpeixun.cn?name=lili&age=18#123"></a>

a.search :截取网址?(包括?)之后的内容。例如:?name=lili&age=18

a.hash:截取网址#(包括#)之后的内容。例如:#123

<body>
    <a href="http://www.zhufengpeixun.cn?name=lili&age=18#123"></a>
    <script>
        function getUrl() {
            let a = document.querySelector("a");
            let obj = {};
            obj.hash = a.hash.slice(1);
            let searchStr = a.search.slice(1).split("&");
            for (let i = 0; i < searchStr.length; i++) {
                let arr = searchStr[i].split("=");
                obj[arr[0]] = arr[1];
            }
            return obj;
        }
        console.log(getUrl());
    </script>
</body>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061282.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试费用怎么算?湖南软件测评公司简析

随着信息技术的迅猛发展&#xff0c;软件在各行各业中的应用日益广泛&#xff0c;软件测试的重要性愈加凸显。特别是对于各种规模的企业&#xff0c;确保软件质量和安全性不仅是提升竞争力的关键因素&#xff0c;更是维护用户信赖的基础。 软件测试作为软件开发过程中的关键环…

IO进程线程8月21日

1&#xff0c;思维导图 2&#xff0c;登录 #ifndef __LOG_H__ #define __LOG_H__ #include<myhead.h> typedef struct {char name[20];char pwd[20]; }str;int regist();int login(); #endif#include"log.h" int login() {char a[20]"\n";str p,s;…

IPC进程间通信方式及网络通信

一、IPC进程间通信方式 1.共享内存&#xff08;最高效的进程间通信方式&#xff09; 其允许两个或多个进程共享一个给定的存储区&#xff0c;这一段存储区可以被两个或以上的进程映射至自己的地址空间中&#xff0c;一个进程写入共享内存的信息&#xff0c;可以被其他使用这个…

SQL Server数据库查询常用语句汇总

这里&#xff0c;汇总了在使用SQL Server数据库的过程中经常会写的查询语句。 情形1 根据时间查询最新一条数据 &#xff08;dtime类型为datetime&#xff09; select top 1 名称 as name,列名1 as parname1,列名2 as parname2,dtime,col1,col2 from demo order by dtime …

算法基础及例题

1、双指针 维护区间信息、子序列匹配、利用序列有序性、单项链表找环双指针 - OI Wiki (oi-wiki.org) 盛最多水的容器https://leetcode.cn/problems/container-with-most-water/ public class Solution {public int maxArea(int[] height) {int l 0, r height.length - 1;int…

docker 导出导入镜像

这两天我在自己的虚拟机器上想docker pull tomcat 但是一直失败&#xff0c;那么我想到了一个思路就是在阿里云上的服务器上把镜像打包&#xff0c;然后倒导入的本地的虚拟机上。 查看当前的镜像&#xff1a; 我们现在想要打包哪个镜像呢&#xff0c;比如打包&#xff1a;tom…

线段树-点修区查

翻博客的时候突然发现线段树好像一个没有&#xff0c;我就准备把线段树给讲一下 分三个章节 点修区查 区修区查 区修区查&#xff08;带乘法&#xff09; 今天这一章比较简单&#xff0c;最多就区查稍微要动一点脑子 题目简介 输入n和m&#xff0c;n代表数的个数&#x…

python多进程multiprocessing(共享字典)

一&#xff0c;线程与进程的区别 纲领&#xff1a;进程是资源分配的最小单位&#xff0c;线程是CPU调度的最小单位 听老师傅说&#xff0c;在python上线程作用不大&#xff0c;最好还是使用多进程。 二&#xff0c;简单使用multiprocessing 检测一下电脑性能如何&#xff1a…

Mac电脑遇到DNS解析失败,ip可以访问,域名无法访问

当Mac电脑遇到DNS解析失败的问题时&#xff0c;可以尝试以下几个解决方法‌&#xff1a; 1.检查网络连接‌&#xff1a;确保Mac已连接到可用的网络&#xff0c;并且网络连接正常。可以尝试重新连接Wi-Fi或使用有线连接来排除网络问题。 2.清除DNS缓存‌&#xff1a;打开终端应…

技术革新,智能恢复:2024年AI驱动的数据恢复软件

数据的脆弱性不容忽视&#xff0c;误删、格式化、硬盘损坏等意外情况时有发生&#xff0c;让我们面临数据丢失的风险。幸运的是现在有不少数据恢复精灵应运而生。今天&#xff0c;就让我们一起探索2024年大家都在用的数据恢复精灵工具。 1.福昕数据恢复 链接直达&#xff1a;…

项目控件组(基于项)Item-Based-Qt-思维导图-学习笔记

项目控件组&#xff08;基于项&#xff09;Item-Based 控件组 &#xff08;1&#xff09;List Widget:清单控件 QListWidget 控件简介 继承关系&#xff1a;继承自 QListView 功能&#xff1a;提供一个基于项的列表小部件&#xff0c;允许添加和删除项目&#xff0c;使用内部…

springboot的启动流程原理

目录 一:入口简介: 二。创建SpringApplication对象 1.推倒出当前项目的启动类型 2.设置Initializer初始化器 3.初始化Listerner监听器 4.反推出main方法所在的class对象。 三.运行SpringApplication#run(java.lang.String...)方法 1):获取运行监听器: 2)发布启动过程中…

IPC进程通信以及网络通信

一、IPC 进程间通信方式 共享内存 //最高效的进程间通信方式 不需要把用户的东西再复制到内核 他们与内核进行绑定 共享内存&#xff1a; 1、是一块&#xff0c;内核预留的空间 2、最高效的通信方式 //避免了用户空间到内核空间的数据拷贝 IPC通信方式 ---操作流程类似的…

“决胜面试:高频题目与算法策略一览”

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

wps题注为表格或图片编号

word中为表格添加题注&#xff1a; 问题&#xff1a;多次或多人编辑导致--序号不能联动更新&#xff08;域代码不一致,如图&#xff09; 所以是否可以批量替换word里的域代码&#xff1f;如果可以这问题就解决了————失败 解决办法&#xff1a; 如图&#xff0c;复制表头&…

[数据集][目标检测]工程机械车辆检测数据集VOC+YOLO格式3189张10类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3189 标注数量(xml文件个数)&#xff1a;3189 标注数量(txt文件个数)&#xff1a;3189 标注…

万户 ezOFFICE receivefile_gd.jsp SQL注入漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

Thymeleaf+Bootstrap封装分页组件

效果 代码 templates/components/pagination.html <!doctype html> <html lang"zh-CN" xmlns:th"http://www.thymeleaf.org"> <body> <div class"d-flex justify-content-between align-items-center mb-3" th:fragment&…

Neo4j 图数据库入门

图形数据库存储节点和关系&#xff0c;而不是表或文档。数据的存储方式就像你在白板上勾画想法一样。您的数据存储不受预定义模型的限制&#xff0c;允许以非常灵活的方式考虑和使用它。 一、核心概念&#xff1a;属性图形模型 Neo4j使用属性图数据库模型。图数据结构由节点(离…

React错误:无法在‘node’上执行‘insertBefore‘:要在其前插入新节点的节点不是此节点的子节点

我在NextJS中用cloudinary实现了一个上传图片的页面&#xff0c;结果图片上传之后页面就无法点击操作&#xff0c;并在控制台报错&#xff1a; Failed to execute insertBefore on Node: The node before which the new node is to be inserted is not a child of this node. …