【面试题】DOM

news2024/11/25 4:19:49

1. DOM的本质

DOM(Document Object Model),文档对象模型。DOM的本质是从HTML文件中解析出来的一棵树。DOM的数据结构是树形结构(DOM树)

2. DOM节点操作

2.1 获取DOM节点

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>获取DOM节点</title>
    <style>
        .container{border: 1px solid red; width: 200px;}
    </style>
</head>
<body>
    <div id="div1" class="container">
        <p>一段文字1</p>
        <p>一段文字2</p>
    </div>
    <div id="div2" class="container">
        <p>一段文字3</p>
        <p>一段文字4</p>
    </div>
    <script>
        // getElementById
        const div1 = document.getElementById('div1')
        console.log('div1', div1)

        // getElementsByTagName
        const divList = document.getElementsByTagName('div')
        console.log('divList', divList)
        console.log('divList.length', divList.length)
        console.log('divList[0]', divList[0])

        // getElementsByClassName
        const containerList = document.getElementsByClassName('container')
        console.log('containerList', containerList)
        console.log('containerList.length', containerList.length)
        console.log('containerList[0]', containerList[0])

        // querySelectorAll
        const pList = document.querySelectorAll('p')
        console.log('pList', pList)
    </script>
</body>
</html>

在这里插入图片描述
在这里插入图片描述

2.2 property

property:修改对象属性,不会体现到html结构中。

// querySelectorAll
const pList = document.querySelectorAll('p')
console.log('pList', pList)

const p = pList[0]
console.log(p.style.width)
console.log(p.className)

p.style.width = '100px'
p.className = 'p1'

console.log(p.style.width)
console.log(p.className)

在这里插入图片描述

2.3 attribute

attribute:修改html属性,会改变html结构。
property和attribute都会引起DOM重新渲染。

// attribute
const p1 = pList[1]

p1.setAttribute('data-name', 'imooc')
console.log(p1.getAttribute('data-name'))

p1.setAttribute('style', 'font-size:30px;')
console.log(p1.getAttribute('style'))

在这里插入图片描述
在这里插入图片描述

3. DOM结构操作

3.1 插入新的节点

// 新建节点
const newP = document.createElement('p')
newP.innerHTML = 'this is newP'
newP.className = 'newP'
// 插入节点
div1.appendChild(newP)

在这里插入图片描述

3.2 移动已有的节点

// 移动已有节点
const div2 = document.getElementById('div2')
div2.appendChild(p1)

在这里插入图片描述

3.3 获取子元素列表

const div1Child = div1.childNodes
console.log(div1Child)

在这里插入图片描述
在这里插入图片描述
通过判断nodeType,可以取出p标签,nodeType === 1 表示p标签

const div1ChildP = Array.prototype.slice.call(div1.childNodes).filter(a=>{
    if(a.nodeType === 1){
        return true
    }
    return false
})
console.log(div1ChildP)

在这里插入图片描述

3.4 获取父元素

console.log(p1.parentNode)

在这里插入图片描述

3.4 删除节点

div1.removeChild(div1ChildP[0])

在这里插入图片描述

4. 优化DOM操作性能

DOM操作会占用较多CPU,频繁操作会导致卡顿。
解决方案:

  • 对DOM查询做缓存
  • 频繁操作改为一次性操作

4.1 对DOM查询做缓存

在这里插入图片描述

4.2 频繁操作改为一次性操作

新建10个li,频繁操作的情况:

<body>
    <ul id="list">

    </ul>
    
    <script>
        const list = document.getElementById('list')
        for(let i =0; i < 10; i++){
            const li = document.createElement('li')
            li.innerHTML = `List item ${i}`
            list.appendChild(li)
        }
    </script>
</body>

改为一次性操作:

const list = document.getElementById('list')

// 首先,创建一个文档片段,没有插入到DOM结构中
const frag = document.createDocumentFragment()

for(let i =0; i < 10; i++){
    const li = document.createElement('li')
    li.innerHTML = `List item ${i}`
    // 然后,再文档片段中插入DOM元素
    frag.appendChild(li)
}

// 最后,统一插入到DOM结构中
list.appendChild(frag)

在这里插入图片描述

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

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

相关文章

【毕业设计】30-基于单片机矿井瓦斯_气体浓度_烟雾浓度报警设计(原理图+源代码+仿真+答辩论文+答辩PPT)

【毕业设计】30-基于单片机矿井瓦斯/气体浓度/烟雾浓度报警设计&#xff08;原理图源代码仿真答辩论文答辩PPT&#xff09; 文章目录【毕业设计】30-基于单片机矿井瓦斯/气体浓度/烟雾浓度报警设计&#xff08;原理图源代码仿真答辩论文答辩PPT&#xff09;任务书设计说明书摘要…

Kafka(二)- Kafka集群部署

文章目录一、安装部署1. 集群规划2. 虚拟机前置准备工作&#xff08;1&#xff09;配置IP&#xff08;2&#xff09;修改主机名称和hosts文件&#xff08;3&#xff09;关闭防火墙&#xff0c;关闭防火墙开机自启&#xff08;4&#xff09;克隆虚拟机3. 集群部署&#xff08;1&…

Oracle中ALTER TABLE的五种用法(三)

首发微信公众号&#xff1a;SQL数据库运维 原文链接&#xff1a;https://mp.weixin.qq.com/s?__bizMzI1NTQyNzg3MQ&mid2247485212&idx1&sn450e9e94fa709b5eeff0de371c62072b&chksmea37536cdd40da7a94e165ce4b4c6e70fb1360d51bed4b3566eee438b587fa231315d0a5a…

BP神经网络PID从Simulink仿真到PLC控制实现(含博途PLC完整SCL源代码)

单神经元自适应PID控制博途PLC完整源代码,请参看下面的文章链接: 博途PLC单神经元自适应PID控制_RXXW_Dor的博客-CSDN博客_单神经元pid控制1、单神经元作为构成神经网络的基本单位,具有自学习和自适应能力,且结构简单易于计算,传统的PID具有结构简单、调整方便和参数整定…

RationalDMIS 2020一平面与两偏置圆找正(原点不在偏置圆上)

在批量加工箱体、杠杆、盖板类零件时,大多是以工件上一个平面和两定位孔作为定位基准实现组合定位,简称"一面两孔(一面两销)定位。 采用"一面两孔,定位,能使工件在各道工序上的定位基准统一,进而可减少因定位基准多次变换而产生的定位误差,提高工件的加工精…

学术论文引言、正文和致谢格式规范标准 - 易智编译EaseEditing

1 引言1.1 定义 国家标准GB7713-87规定&#xff1a;“引言(或绪论)简要说明研究工作的目的、范围、相关领域的前人工作和知识空白、理论基础和分析、研究设想、研究方法和实验设计、预期结果和意义等。 引言应言简意赅&#xff0c;不要与摘要雷同&#xff0c;不要成为摘要的注…

vue3 antd table表格的增删改查(二)input输入框根据关键字搜索【后台管理系统 请求后端接口 前后端交互】

input输入框——关键字模糊搜索知识调用场景复现准备工作解决方法step1 请求接口step2 根据id搜索step3 优化处理&#xff08;输入框监听&#xff09;知识调用 功能实现可能要用到的知识&#xff1a;vue3数据变化侦测&&信息筛选过滤.filter() .map() .forEach(). find…

【SVA】SystemVerilog assertion语法速查

seq与property|->,|>\##[*n ][n ]andintersectorfirst_match![在这里插入图片描述](https://img-blog.csdnimg.cn/015bf766991947e0bbe95356ba2a0036.png)throughoutwithinifended局部变量与赋值在sequence、property中调用display[->1]$rose $fell $isunknow$stable$…

#国产工业软件#外行人看工业软件,接轨还是出轨?

​ 有些人整天特么的自毁自恨&#xff0c;说&#xff1a;“什么我们中国人不追求真理&#xff0c;什么我们中国人没有科学精神&#xff0c;我们大部分科研人员都是混饭吃的&#xff0c;所有人都忙着生活没有人拼搏搞科研。“ 你们这些神经病该歇歇了&#xff0c;要是欧洲社会…

springboot高校学生宿舍水电费报修考勤管理系统

宿舍水电管理系统的开发过程中&#xff0c;采用B / S架构&#xff0c;主要使用jsp技术进行开发&#xff0c;中间件服务器是Tomcat服务器&#xff0c;使用Mysql数据库和Eclipse开发环境。该宿舍水电管理系统包括学生、维修员和管理员。其主要功能包括宿舍公告、维修员、学生、宿…

IBO对中文A文学课程IA有何规定?

又到11月中旬&#xff0c;许多IB学校开始确定IA和EE选题。在IB选课时&#xff0c;IB学生必选语言A&#xff08;母语&#xff09;和语言B。在语言A科目组的课程中&#xff0c;大部分中国的IB学生都会选择IB语文&#xff08;中文A&#xff09;。 众所周知&#xff0c;历经改革&am…

解决nginx: [emerg] unknown directive “stream“ in /etc/nginx/nginx.conf问题

文章目录1.未报错时nginx配置&#xff1a;2.报错时nginx配置&#xff1a;3.增加配置报错&#xff1a;4.增加配置位置如下&#xff1a;5.解决办法&#xff1a;6.测试&#xff1a;nginx -t1.未报错时nginx配置&#xff1a; #user nginx; user root; worker_processes auto;er…

【C++】STL —— map和set的模拟实现

目录 一、基础铺垫 二、基本结构分析 1. 节点结构分析 2. 模板参数中仿函数分析 三、正向迭代器 四、封装完成的红黑树 五、map的模拟实现 六、set的模拟实现 一、基础铺垫 在前面的博客中我们了解了map和set的基本使用&#xff0c;以及对二叉搜索树、AVL树和红黑树的…

数据结构学习笔记(VI):图

目录 1 图的基本概念 6.1 图的基本概念 1.定义 2.边 3.连通 4.子图 5.连通分量 6. 生成树与森林 7.权 8.特殊的图 2 图的存储 2.1 邻接矩阵法 1.实现 2.性能分析 3.性质 2.2 邻接表法 1.实现 2.对比 2.3 十字链表与邻接多重表 1.十字链表存储有向图 2…

梦开始的地方——C语言柔性数组

文章目录柔性数组什么是柔性数组&#xff1f;柔性数组的使用柔性数组的优点柔性数组 什么是柔性数组&#xff1f; 在C99中&#xff0c;结构体最后一个元素它允许是一个未知大小的数组&#xff0c;这就叫做柔性数组成员。 这个概念听起来可能有点不可以思议&#xff0c;但它的…

KVC原理与数据筛选

作者&#xff1a;宋宏帅 1 前言 在技术论坛中看到一则很有意思的KVC案例&#xff1a; interface Person : NSObject property (nonatomic, copy) NSString *name; property (nonatomic, assign) NSInteger age; end Person *person [Person new]; person.name "Tom&q…

[附源码]计算机毕业设计springboot基于JavaWeb的学校社团活动管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

小知识· Zigbee 简介

1. 介绍 ZigBee是一种近距离、低复杂度、低功耗、低速率、低成本的双向无线通讯技术 ZigBee建立在IEEE 802.15.4标准&#xff08;定义了PHY和MAC层&#xff09;之上&#xff0c;ZigBee联盟对其网络层和应用层进行了标准化 ZigBee协议栈可分为五层 - 物理层&#xff08;PHY&a…

时间序列建模三部曲

与大多数高级分析解决方案不同&#xff0c;时间序列建模是一种低成本解决方案&#xff0c;可提供强大的洞察力。 本文将介绍构建质量时间序列模型的三个基本步骤&#xff1a;使数据平稳&#xff0c;选择正确的模型并评估模型的准确性。这篇文章中的例子使用了一家主要汽车营销…

[附源码]Python计算机毕业设计SSM旅行网的设计与实现(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…