20道DOM相关前端面试题

DOM 相关面试题及答案

  1. 什么是 DOM?DOM 树的结构是怎样的?

    DOM(文档对象模型,Document Object Model)是 HTML/XML 文档的编程接口,将文档结构化为树形节点集合,允许程序动态访问和修改文档内容、结构和样式。

    DOM 树结构:以document为根节点,包含htmlheadbody等元素节点,元素内的文本为文本节点,属性为属性节点,节点间存在父子、兄弟关系(如bodyhtml的子节点,divp可能是兄弟节点)。

  2. DOM 节点有哪些类型?如何区分它们?

    常见 DOM 节点类型:
    ① 元素节点(Node.ELEMENT_NODE,值为 1,如<div>);
    ② 文本节点(Node.TEXT_NODE,值为 3,如标签内的文本);
    ③ 属性节点(Node.ATTRIBUTE_NODE,值为 2,元素的属性);
    ④ 注释节点(Node.COMMENT_NODE,值为 8,<!-- 注释 -->);
    ⑤ 文档节点(Node.DOCUMENT_NODE,值为 9,即document)。

    区分方式:通过节点的nodeType属性判断(如element.nodeType === 1表示元素节点)。

  3. 如何获取 DOM 元素?请列举至少 5 种方法。

  • document.getElementById('id'):通过 ID 获取唯一元素(效率高)。

  • document.getElementsByClassName('class'):通过类名获取元素集合(HTMLCollection,动态更新)。

  • document.getElementsByTagName('tag'):通过标签名获取元素集合(HTMLCollection)。

  • document.querySelector(selector):通过 CSS 选择器获取第一个匹配元素。

  • document.querySelectorAll(selector):通过 CSS 选择器获取所有匹配元素(NodeList,静态集合)。

  • document.getElementsByName('name'):通过name属性获取元素集合(如表单元素)。

  • 元素节点方法:parentNode.children(获取子元素)、element.querySelector()(获取子元素)。

  1. 什么是 DOM 的节点属性nodeValuetextContent?它们有什么区别?
  • nodeValue:返回或设置节点的值,仅对文本节点、注释节点有效(元素节点的nodeValuenull)。

  • textContent:返回或设置元素及其所有后代的文本内容(忽略 HTML 标签,仅保留文本)。

    区别:
    ① 适用节点:nodeValue针对文本 / 注释节点,textContent针对元素节点;
    ② 范围:textContent包含所有后代文本,nodeValue仅当前节点文本。

    示例:<div>hello <span>world</span></div>中,div.textContent"hello world"div.firstChild.nodeValue"hello "

  1. 如何创建、添加和删除 DOM 节点?
  • 创建节点:

  • document.createElement(tagName):创建元素节点(如 document.createElement('div'));

  • document.createTextNode(text):创建文本节点;

  • document.createComment(comment):创建注释节点。

  • 添加节点:

  • parentNode.appendChild(child):添加到父节点末尾;

  • parentNode.insertBefore(newNode, referenceNode):插入到参考节点之前;

  • element.replaceChild(newNode, oldNode):替换子节点。

  • 删除节点:parentNode.removeChild(child):从父节点中删除子节点(需先获取父节点);或child.remove()(直接删除自身,IE 不支持)。

  1. 什么是 DOM 的事件流?它包含哪些阶段?

    DOM 事件流指事件从产生到处理的完整过程,分为三个阶段:
    ① 事件捕获阶段:事件从window向下传播到目标元素;
    ② 目标阶段:事件到达目标元素;
    ③ 事件冒泡阶段:事件从目标元素向上传播到window

    示例:点击div内部的span,捕获阶段为window → document → html → body → div,目标阶段为span,冒泡阶段为span → div → body → html → document → window

  2. 如何阻止事件冒泡和事件默认行为?

  • 阻止事件冒泡:

  • ① 标准浏览器:event.stopPropagation()

  • ② IE8 及以下:event.cancelBubble = true

  • 阻止默认行为(如链接跳转、表单提交):

  • ① 标准浏览器:event.preventDefault()

  • ② IE8 及以下:event.returnValue = false

  • ③ 函数中返回false(仅在onxxx属性中有效,如<a href="#" onclick="return false">)。

    注意:event.stopImmediatePropagation()可同时阻止冒泡和当前元素后续事件监听器执行。

  1. 什么是事件委托?它的原理和优势是什么?

    事件委托指将子元素的事件监听器绑定到父元素,利用事件冒泡触发父元素的监听器,再通过event.target判断具体子元素。

    原理:事件冒泡机制(子元素事件会向上传播到父元素)。

    优势:
    ① 减少事件监听器数量(尤其列表等动态元素),优化性能;
    ② 自动支持动态添加的子元素(无需重新绑定事件)。

    示例:

ul.addEventListener('click', (e) => {if (e.target.tagName === 'LI') { // 判断点击的是liconsole.log(e.target.textContent);}});
  1. event.targetevent.currentTarget的区别是什么?
  • event.target:触发事件的具体元素(事件源,如点击列表中的某个litarget是该li)。

  • event.currentTarget:绑定事件监听器的元素(如事件绑定在ul上,currentTargetul)。

    区别:target是实际触发事件的元素,currentTarget是事件绑定的元素(this在监听器中等于currentTarget)。

  1. 如何获取元素的样式?element.stylegetComputedStyle有什么区别?
  • element.style:获取或设置元素的内联样式(style属性中的样式),仅能获取内联样式,返回值带单位(如"10px")。

  • getComputedStyle(element):获取元素的计算样式(包含内联、内部、外部样式,最终渲染的样式),返回CSSStyleDeclaration对象,IE8 及以下用element.currentStyle

    区别:
    ① 范围:style仅内联,getComputedStyle包含所有样式;
    ② 可写性:style可读写,getComputedStyle只读;
    ③ 伪元素:getComputedStyle可获取伪元素样式(如getComputedStyle(div, '::before'))。

  1. 什么是 DOM 重绘(Repaint)和回流(Reflow)?如何减少它们的发生?
  • 重绘:元素样式改变但不影响布局(如colorbackground),浏览器重新绘制元素,开销较小。

  • 回流(重排):元素布局改变(如widthposition、添加子元素),浏览器重新计算布局,开销较大(可能触发多个元素的重绘)。

    减少方法:
    ① 合并样式修改(如用class替换多个style属性);
    ② 操作脱离文档流的元素(如display: none后修改,再显示);
    ③ 使用documentFragment批量添加节点;
    ④ 避免频繁读取offsetWidth等布局属性(缓存结果);
    ⑤ 用transformopacity实现动画(仅触发合成,无回流)。

  1. 如何获取元素的偏移量、客户区大小和滚动偏移量?
  • 偏移量(相对于 offsetParent):

  • element.offsetTop:上边缘距离;

  • element.offsetLeft:左边缘距离;

  • element.offsetWidth:宽度(含边框、内边距);

  • element.offsetHeight:高度(含边框、内边距)。

  • 客户区大小(元素可视区域):

  • element.clientWidth:宽度(含内边距,不含边框、滚动条);

  • element.clientHeight:高度(同上);

  • element.clientTop:上边框宽度;

  • element.clientLeft:左边框宽度。

  • 滚动偏移量:

  • element.scrollTop:元素内容向上滚动的距离;

  • element.scrollLeft:元素内容向左滚动的距离;

  • element.scrollWidth:内容总宽度(含不可见部分);

  • element.scrollHeight:内容总高度(含不可见部分)。

  1. documentFragment的作用是什么?它有什么优势?

    documentFragment是轻量级文档对象,用于临时存储 DOM 节点,不属于 DOM 树。

    作用:批量操作 DOM 时,先将节点添加到documentFragment,再一次性插入 DOM 树,减少回流次数。

    优势:
    ① 减少回流(多次添加节点变为一次);
    ② 不影响页面渲染(未插入 DOM 树时不可见)。

    示例:

const fragment = document.createDocumentFragment();for (let i = 0; i < 100; i++) {const li = document.createElement('li');fragment.appendChild(li);}ul.appendChild(fragment); // 仅触发一次回流
  1. 如何判断一个元素是否包含另一个元素?
  • element.contains(otherElement):返回布尔值,判断otherElement是否为element的后代(包括自身)。

  • 比较node.parentNode:递归向上查找父节点,判断是否等于目标元素。

    示例:document.body.contains(div) → 判断div是否在body内。

  1. 什么是 DOM 遍历?常用的 DOM 遍历方法有哪些?

    DOM 遍历指按一定顺序访问 DOM 树中的节点。

    常用方法:
    parentNode:获取父节点;
    childNodes:获取所有子节点(NodeList,含文本、注释节点);
    children:获取所有子元素节点(HTMLCollection);
    firstChild/lastChild:第一个 / 最后一个子节点;
    firstElementChild/lastElementChild:第一个 / 最后一个子元素;
    nextSibling/previousSibling:下一个 / 上一个兄弟节点;
    nextElementSibling/previousElementSibling:下一个 / 上一个兄弟元素。

  2. 如何克隆 DOM 节点?cloneNode的参数有什么作用?

    使用element.cloneNode(deep)克隆节点,参数deep为布尔值:
    deep = true:深度克隆,复制节点及其所有后代;
    deep = false:浅克隆,仅复制节点本身,不包含后代。

    注意:
    ① 克隆节点不包含事件监听器(除非用addEventListener绑定且浏览器支持);
    ② 克隆的元素没有父节点,需手动添加到 DOM 树;
    ③ ID 属性会被复制,可能导致文档中 ID 重复(需手动修改)。

  3. 什么是 DOMParser 和 XMLSerializer?它们的作用是什么?

    作用:在不操作页面 DOM 的情况下,处理字符串形式的 HTML/XML(如动态生成 DOM 结构)。

  • DOMParser:将 XML 或 HTML 字符串解析为 DOM 文档。

    示例:

const parser = new DOMParser();const doc = parser.parseFromString('\<div>hello\</div>', 'text/html');const div = doc.body.firstChild;
  • XMLSerializer:将 DOM 节点序列化为 XML 或 HTML 字符串。

    示例:

const serializer = new XMLSerializer();const htmlString = serializer.serializeToString(div); // '\<div>hello\</div>'
  1. 如何检测 DOM 节点的可见性?
  • 方法 1:检查offsetParent是否为null(隐藏元素的offsetParent通常为null,但position: fixed元素例外)。

  • 方法 2:通过计算样式判断:

function isVisible(element) {const style = getComputedStyle(element);return style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0';}
  • 方法 3:使用IntersectionObserver监测元素是否进入视口(可见于页面)。
  1. 什么是 DOM Level 0、Level 1、Level 2、Level 3?它们的主要区别是什么?

    DOM 标准分为多个级别,逐步扩展功能:

  • Level 0:非官方标准,指早期浏览器支持的基本 DOM 操作(如element.innerHTMLonclick事件)。

  • Level 1:1998 年发布,分为 Core(核心,处理 XML)和 HTML(扩展 HTML),定义基本节点操作(如getElementById)。

  • Level 2:2000 年发布,新增事件模型(捕获 / 冒泡、addEventListener)、样式操作(getComputedStyle)、遍历 API 等。

  • Level 3:2004 年发布,新增 XPath 支持、事件类型扩展(如键盘事件)、加载 / 保存模块等。

    现代浏览器主要支持 Level 2 和 Level 3 的核心功能。

  1. 如何优化 DOM 操作的性能?
  • 减少回流重绘:

  • ① 批量修改样式(用class或脱离文档流操作);

  • ② 缓存布局属性(如const width = element.offsetWidth);

  • ③ 使用transform/opacity实现动画。

  • 减少 DOM 查询:

  • ① 缓存查询结果(const div = document.querySelector('div'));

  • ② 避免在循环中查询 DOM。

  • 批量添加节点:

  • ① 使用documentFragment

  • ② 先element.innerHTML拼接字符串,再一次性渲染。

  • 避免深层嵌套:简化 DOM 结构,减少遍历层级。

  • 使用高效选择器:优先用getElementByIdquerySelector(基于 CSS 选择器引擎,效率高)。

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

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

相关文章

CVE-2021-4300漏洞复现

Adminer是一个PHP编写的开源数据库管理工具&#xff0c;支持MySQL、MariaDB、PostgreSQL、SQLite、MS SQL、Oracle、Elasticsearch、MongoDB等数据库。在其版本1.12.0到4.6.2之间存在一处因为MySQL LOAD DATA LOCAL导致的文件读取漏洞。 一、伪造服务器 利用mysql-fake-serve…

【LeetCode题解】LeetCode 35. 搜索插入位置

【题目链接】 35. 搜索插入位置 【题目描述】 【题解】 通过题目可以知道这是一道经典的二分查找的题目&#xff0c;对于二分查找的题目&#xff0c;根据需要查找的两个边界点&#xff0c;分为两个不同的模板&#xff0c;如下图所示。 这道题要求在数组中查找目标值并返回其索…

RK3568 NPU RKNN(五):RKNN-ToolKit-lite2板端推理

文章目录1、前言2、目标3、安装RKNN-ToolKit-lite23.1、安装环境3.2、安装RKNN-ToolKit-lite23.3、验证4、完整的测试程序5、运行测试程序6、程序拆解7、总结1、前言 本文仅记录本人学习过程&#xff0c;不具备教学指导意义。 2、目标 之前提到过&#xff0c;RKNN-Toolkit2-…

二分查找。。

1 二分查找二分查找前提是数组有序。先令&#xff0c;left 0 , right 7mid (right left) / 2;如果mid的值大于要查找的值&#xff0c;则right mid - 1&#xff1b;如果小于&#xff0c;left mid 1&#xff1b;如果mid的值等于要查找的值&#xff0c;查找成功。重复步骤2…

Spring Ai 如何配置以及如何搭建

Spring Ai 如何配置以及如何搭建 解释什么是Spring ai 首先&#xff0c;我们用Spring ai 其实不是去了解他的LLM,以及底层用的一些东西&#xff0c;Spring AI,提供给我们的其实是对各种大模型快速调用&#xff0c;提供了大模型API的作用&#xff0c;Spring AI 的核心定位是提…

FCC认证三星XR头显加速全球量产,微美全息AI+AR技术引领智能眼镜硬件创新

据悉&#xff0c;三星(SSNGY.US)XR头显Project Moohan目前已获得美国FCC认证&#xff0c;FCC认证表明该款头显即将上市&#xff0c;之前三星财报会议也表明确认将于今年年底推出XR头显。此前有报道称&#xff0c;该设备将采用索尼旗舰级 OLEDoS 显示屏&#xff0c;像素密度高达…

洛谷P1595讲解(加强版)+错排讲解

前言接我原先的文章&#xff0c;因为一场考试&#xff0c;让我对这道题记忆深刻注&#xff1a;&#xff08;因为那道题&#xff0c;所以80分&#xff09;正文1.分析题目题目&#xff1a;某人写了 n 封信和 n 个信封&#xff0c;如果所有的信都装错了信封。求所有信都装错信封共…

提升化工制造质量的 7 种方法

尽管化工制造属于制造业的一个子类别&#xff0c;但它是一个广泛的范畴&#xff0c;涵盖了基础化学品、树脂和合成纤维、农药和化肥、涂料和粘合剂&#xff0c;甚至消费类化合物&#xff08;如肥皂和清洁化学品&#xff09;等所有领域。尽管这些细分领域差异巨大&#xff0c;但…

从“数据垄断”到“全民共建”:Dataparts如何重构智能时代的数据流通规则?

从“数据垄断”到“全民共建”&#xff1a;Dataparts如何重构智能时代的数据流通规则&#xff1f;在杭州某科技园区的会议室里&#xff0c;一场关于“AI大模型训练数据”的讨论正在激烈进行。某头部AI企业的技术总监指着屏幕上的“对话场景零件库”说&#xff1a;“过去我们花3…

31 HTB Union 机器 - 中等难度

第一阶段 侦查nmap扫描oxdfparrot$ nmap -p- --min-rate 10000 -oA scans/nmap-alltcp 10.10.11.128 Starting Nmap 7.80 ( https://nmap.org ) at 2021-11-19 08:29 EST Nmap scan report for 10.10.11.128 Host is up (0.092s latency). Not shown: 65534 filtered ports POR…

【数据分享】上市公司创新韧性数据(2007-2023)

数据介绍核心看点&#xff1a; 在复杂多变的市场环境中&#xff0c;企业如何通过创新维持竞争力&#xff1f;创新韧性是衡量企业在外部冲击下保持创新活力的关键指标。本文分享2007-2023年上市公司创新韧性数据&#xff0c;为研究企业抗风险能力提供核心支持。数据概览数据名称…

服务器配置开机自启动服务

一、配置启动文件sudo vim /etc/systemd/system/smartailab-backend.service sudo vim /etc/systemd/system/reall3d-frontend.servicesudo vim /etc/systemd/system/Culture_Liquor-backend.servicevim /etc/systemd/system/Culture_Liquor-backend.service内容&#xff1a;[U…

Ubuntu 25.04更新了哪些内容揭秘

2025年4月,Canonical正式推出Ubuntu 25.04 版本,代号"Plucky Puffin(勇敢的海鹦)"。此次发布围绕AI算力强化、桌面交互革新与跨架构支持三大核心方向展开,为开发者、创作者及企业用户带来多项突破性升级。 一、核心系统更新 systemd v257.4带来了重要的上游更新…

PHP反序列化的CTF题目环境和做题复现第2集_POP链构造

1 通过pop参数get方式提交反序列信息 2 题目 http://192.168.1.8/fxl2/fxl2_pop.php <?php highlight_file(__FILE__);class a {protected $var;public function hello(){echo $this->var;} }class b {public $cla;public function __destruct(){$this->cla->…

攻防世界—fakebook(两种方法)

一.审题这边先进行测试&#xff0c;login和join都失败了&#xff0c;所以没获取到什么消息。二.dirsearch工具扫描所以拿dirsearch扫一下&#xff0c;看看有没有什么文件可以访问。python3 dirsearch.py -u url可以看到当前目录下存在flag.php,robots.txt等&#xff0c;访问fla…

AI+物联网如何重塑仓储供应链?3个落地场景与系统架构设计思路

一、引言 在科技飞速发展的当下&#xff0c;AI与物联网技术的融合为仓储供应链领域带来了革新契机。这种融合不仅优化了传统运作模式&#xff0c;还催生出更智能、高效的管理方案&#xff0c;业财一体管理软件也在其中发挥着关键作用。 二、AI物联网在仓储供应链的落地场景 &am…

C++ 内存管理(内存分布 , 管理方式 , new和delete实现原理)

目录 1. C/C内存分布 练习: 2. C语言动态内存管理方式 2.1 malloc/calloc/realloc的区别 2.2 malloc的实现原理 2.3 内存块分布与扩容 3. C动态内存管理方式 3.1 new/delete操作类内置类型 1. new操作内置类型 2. delete操作内置类型 3.2 new/delete操作类自定义类型…

1.2. qemu命令起虚拟机增加网络配置

1. 网络配置 常见的网络模式分为tap网络和基础网络模式两种。 1.1. TAP网络&#xff08;桥接模式&#xff09; 虚拟机直接接入宿主机物理网络&#xff0c;获得独立IP 1.1.1. 使用tap方式起虚拟机网络-netdev tap,idhostnet0,ifnametap0 \-device virtio-net-pci,netdevhostnet0…

分享一个Oracle表空间自动扩容与清理脚本

一、基础环境准备&#xff08;首次执行&#xff09; -- 1. 创建表空间监控表&#xff08;存储使用率、容量等信息&#xff09; create table monitor_tablespace_rate (tbs_name varchar2(50), -- 表空间名total_gb number, -- 总容量(GB)used_gb number, …

Flink Sql 按分钟或日期统计数据量

一、环境版本 环境版本Flink1.17.0Kafka2.12MySQL5.7.33 【注意】Flink 1.13版本增加Cumulate Window&#xff0c;之前版本Flink Sql 没有 Trigger 功能&#xff0c;长时间的窗口不能在中途触发计算&#xff0c;输出中间结果。比如每 10S 更新一次截止到当前的pv、uv。只能用T…