前端面试必备 | DOM/BOM 篇(P1-20)

alt

DOM

1. 请解释什么是DOM。

DOM(文档对象模型)是一种用于表示和操作HTML、XML以及XHTML文档的接口

它将整个文档表示为一个由节点组成的树结构,每个节点都表示文档中的一个元素、属性、文本或注释。

DOM提供了一组API(应用程序接口),允许开发者通过JavaScript等脚本语言来访问、操纵和修改文档的内容、结构和样式。

DOM树由多个节点构成,每个节点都可以有零个或多个子节点,还可以有一个父节点。 根节点是整个文档,文档的每个部分都是一个节点。

节点可以是

  • 元素节点(表示HTML元素,如div、p等)
  • 文本节点(表示元素之间的文本内容)
  • 属性节点(表示元素的属性)

alt

通过DOM,开发者可以利用JavaScript操作文档的结构和内容,例如查找和访问特定元素、修改元素的属性、添加、移动或删除节点,并对文档中的事件进行监听和响应。

总而言之,DOM为开发者提供了一种以标准的、平台无关的方式来操纵和交互网页的方法,使其能够动态地更新和响应用户的操作。

2. 请解释DOM树结构。

DOM树结构是指根据HTML、XML或XHTML文档的层次结构对文档进行组织和表示的一种树形结构。 它将整个文档表示为一个由节点(nodes)组成的层次结构,每个节点都代表文档中的一个元素、属性、文本或注释。

DOM树的根节点是整个文档的表示节点。 文档会按照从上到下的顺序被解析,构建出一个树状的结构。 节点之间通过父子关系连接起来,父节点是子节点的直接上级,子节点是父节点的直接下级。

DOM树中的每个元素都被表示为一个元素节点,如div、p、a等。元素节点可以包含其他元素节点、文本节点或其他类型的节点。文本节点用于表示元素之间的文本内容,而属性节点用于表示元素的属性。

DOM树结构的层次性使得我们可以方便地对文档进行操作和访问。 通过DOM树结构,开发者可以使用各种方法和属性来定位、操纵和修改文档中的特定节点,以实现对HTML、XML或XHTML文档的动态更新和交互。

alt

总结起来,DOM树结构提供了一种树形层次的表示方式,用于描述和访问文档中的节点,使开发者可以方便地操作和控制文档的内容和结构。

3. 请解释DOM节点。

DOM节点是DOM树结构中的基本构建块,它表示文档中的一个元素、属性、文本或注释。 每个节点都具有特定的类型和相关属性,用于描述其在文档中的不同角色和特性。

在DOM中,常见的节点类型包括:

  1. 元素节点(Element Node):表示HTML或XML文档中的标签元素,如<div><p><a>等。元素节点可以拥有属性、子节点或文本内容。

  2. 文本节点(Text Node):表示文档中的文本内容,例如Hello World。文本节点是元素节点的子节点,用于存储元素标签之间的文本。

  3. 属性节点(Attribute Node):表示元素节点的属性,如srcclassid等。属性节点包含属性的名称和值。

  4. 注释节点(Comment Node):表示文档中的注释内容,即<!-- 注释 -->

  5. 文档节点(Document Node):表示整个文档的根节点。

  6. 文档类型节点(Document Type Node):表示文档的类型声明,即<!DOCTYPE>

alt

节点之间通过父子关系来形成DOM树的层次结构。 每个节点可以有一个父节点和零个或多个子节点。 根节点是整个文档的起始节点,而叶子节点是没有子节点的节点。

通过使用节点对象提供的属性和方法,开发者可以访问、操作和修改文档中的节点。 例如,可以通过节点的属性来获取或修改元素的文本内容、属性值,还可以通过方法来添加、移动或删除节点。

总结来说,DOM节点是DOM树中的构建块,表示文档中的不同组成部分,如元素、属性、文本和注释。开发者可以使用节点来访问和操作文档的结构和内容。

4. 请解释HTML和XML之间的区别,并说明DOM是如何处理这两者的。

HTML(超文本标记语言)和XML(可扩展标记语言)都是用于描述和组织数据的标记语言,但它们有一些重要的区别。

  1. 语法:HTML拥有一套预定义的标签和属性,用于表示网页的结构和内容。XML没有预定义的标签,用户可以自定义任何标签和属性,用于表示各种数据结构。

  2. 目的:HTML主要用于构建网页和显示内容,具有丰富的样式和交互功能。XML更通用,可以用于表示各种数据结构和传输数据。

  3. 语义:HTML标签具有语义含义,用于表示特定的内容类型,例如<p>表示段落,<table>表示表格等。XML标签没有固定的语义,由用户自行定义和解释。

DOM(文档对象模型)是一种用于处理HTML和XML文档的编程接口。

它将文档表示为一个树状结构,通过DOM可以对文档进行访问、修改和操作。 DOMHTMLXML文档解析为一个由节点组成的层次结构,每个节点表示文档中的一个元素、属性、文本或注释等。 通过DOM提供的API,开发者可以通过编程方式搜索、遍历和修改文档的内容和结构。 无论是HTML还是XML,DOM都可以进行相同的操作,并提供了统一的接口,使得开发者可以以相似的方式处理这两者。

5. 如何使用JavaScript创建一个DOM元素?

要使用JavaScript创建一个DOM元素,可以按照以下步骤进行操作:

  1. 首先,使用document.createElement()方法创建一个新的元素节点。需要传入一个参数指定要创建的元素的标签名,例如divpspan等。

  2. 然后,可以使用.setAttribute()方法为新创建的元素设置属性。需要传入两个参数,第一个参数是属性名称,第二个参数是属性值。例如,.setAttribute('class', 'my-class')可以给元素添加一个名为class的属性,并将其值设置为'my-class'

  3. 接下来,可以使用.appendChild()方法将新创建的元素添加到文档中的某个已有元素中。需要传入一个参数,表示要添加的子元素。例如,.appendChild(newElement)可以将新创建的元素作为子元素添加到某个已有元素中。

以下是一个简单的示例:

// 创建一个新的div元素
var newElement = document.createElement('div');

// 设置div元素的属性
newElement.setAttribute('class', 'my-class');
newElement.setAttribute('id', 'my-id');

// 将新创建的div元素添加到文档中的某个元素中
var parentElement = document.getElementById('parent');
parentElement.appendChild(newElement);

这样就创建了一个新的div元素,并将其添加到了idparent的元素中。你可以根据需要修改和扩展这个示例来创建其他类型的元素,并设置更多的属性。

6. 如何通过JavaScript获取DOM元素?

要通过JavaScript获取DOM元素,可以使用以下方法之一:

  1. document.getElementById():通过元素的id属性获取元素。该方法返回匹配指定id的第一个元素,如果没有找到匹配的元素则返回null。
var element = document.getElementById('elementId');
  1. document.getElementsByClassName():通过元素的class属性获取元素。该方法返回一个包含所有匹配指定class的元素的HTMLCollection。
var elements = document.getElementsByClassName('className');
  1. document.getElementsByTagName():通过元素的标签名获取元素。该方法返回一个包含所有匹配指定标签名的元素的HTMLCollection。
var elements = document.getElementsByTagName('tagName');
  1. document.querySelector():通过CSS选择器获取元素,返回匹配选择器的第一个元素,如果没有找到匹配的元素则返回null。
var element = document.querySelector('selector');
  1. document.querySelectorAll():通过CSS选择器获取元素,返回一个包含所有匹配选择器的元素的NodeList。
var elements = document.querySelectorAll('selector');

需要注意的是,getElementById()返回单个元素,而其他方法返回的是一个类数组对象(HTMLCollection 或 NodeList)。如果需要操作其中的元素,可以使用索引或迭代的方式进行访问。另外,这些方法都是在文档(document)对象上调用的,因此需要确保在DOM加载完成后才能正确获取到元素。

7. 请解释DOM的事件冒泡和捕获。

DOM事件模型中存在两种不同的事件传播方式,即事件冒泡(event bubbling)和事件捕获(event capturing)。

事件冒泡:在事件冒泡中,当一个元素触发了某个事件,事件将从最具体的元素开始,然后逐级向上传播到父级元素,直到传播到最顶层的文档对象。也就是说,事件首先在最内部的目标元素上触发,然后沿着DOM树向上冒泡到更外层的元素。

事件捕获:与事件冒泡相反,在事件捕获中,事件从最顶层的文档对象开始传播,然后逐级向下传播到具体的目标元素。也就是说,事件首先在最顶层的元素上触发,然后向下捕获到更深层的元素。

事件传播的过程可以用下图表示:

     ┌──────────────────────┐
     │    ┌──────────────┐  │
     │    │   Capture    │  │
     │    └──────────────┘  │
     │         Event        │
     │       Target       │
     │    ┌──────────────┐  │
     │    │     Bubble    │  │
     │    └──────────────┘  │
     └──────────────────────┘

在DOM事件模型中,默认情况下,事件会首先触发捕获阶段,然后触发目标元素上的事件,最后触发冒泡阶段。但是,可以通过使用addEventListener()方法的第三个参数来显式指定是在捕获阶段还是冒泡阶段处理事件。

例如:

element.addEventListener('click', handleClick, true); // 使用捕获阶段处理点击事件
element.addEventListener('click', handleClick, false); // 使用冒泡阶段处理点击事件(默认)

总结来说,事件冒泡和捕获提供了一种方便的方式来处理在DOM树上发生的事件。通过理解事件传播的概念,可以更好地控制和处理事件,以实现更复杂的交互功能。

8. 如何修改DOM元素的样式?

要修改DOM元素的样式,可以使用JavaScript中的style属性。 style属性是一个对象,它包含了元素的所有样式属性和对应的值。

以下是一些常用的方法来修改DOM元素的样式:

  1. 直接修改样式属性的值:
var element = document.getElementById('elementId');
element.style.property = 'value';

例如,要修改元素的背景颜色,可以使用以下代码:

var element = document.getElementById('elementId');
element.style.backgroundColor = 'red';
  1. 使用setProperty()方法:
var element = document.getElementById('elementId');
element.style.setProperty('property', 'value');

例如,要修改元素的字体大小,可以使用以下代码:

var element = document.getElementById('elementId');
element.style.setProperty('font-size', '20px');
  1. 添加或移除CSS类:
var element = document.getElementById('elementId');
element.classList.add('className'); // 添加CSS类
element.classList.remove('className'); // 移除CSS类

例如,要添加一个名为highlight的CSS类,可以使用以下代码:

var element = document.getElementById('elementId');
element.classList.add('highlight');

这些方法可以用于修改元素的各种样式属性,如背景颜色、字体大小、边框样式等。需要注意的是,使用style属性修改的样式是直接应用在元素上的内联样式,会覆盖外部样式表中定义的样式。如果需要修改外部样式表中的样式,可以使用CSS选择器来选择元素并修改对应的样式规则。

9. 如何在DOM元素之间移动和重排?

在DOM中移动和重排元素可以通过以下方法实现:

  1. 使用appendChild():将一个元素添加到另一个元素的子元素列表的末尾,从而移动元素位置。
const parentElement = document.getElementById('parent');
const childElement = document.getElementById('child');
parentElement.appendChild(childElement);

这将把childElement移动到parentElement的子元素列表的末尾。

  1. 使用insertBefore():在指定的已存在元素之前插入一个新元素,从而重排元素位置。
const newElement = document.createElement('div');
const referenceElement = document.getElementById('reference');
const parentElement = referenceElement.parentNode;

parentElement.insertBefore(newElement, referenceElement);

这将在referenceElement之前插入一个新的newElement,从而重排元素位置。

  1. 使用replaceChild():用一个新元素替换现有的元素。
const newElement = document.createElement('div');
const oldElement = document.getElementById('old');
const parentElement = oldElement.parentNode;

parentElement.replaceChild(newElement, oldElement);

这将用newElement替换掉oldElement,从而重排元素位置。

请注意,上述示例中的parentchildreferenceold等是示意值,你需要根据你的实际情况替换为相应的DOM元素。

10. 如何向DOM元素添加和移除类?

要向DOM元素添加和移除类,可以使用以下方法:

  1. 添加类:使用classList.add()方法向元素添加一个或多个类。
const element = document.getElementById('myElement');
element.classList.add('className');

这将向element元素添加名为className的类。你还可以在一个add()调用中添加多个类。

element.classList.add('class1', 'class2', 'class3');
  1. 移除类:使用classList.remove()方法从元素中移除一个或多个类。
element.classList.remove('className');

这将从element元素中移除名为className的类。同样,你可以在一个remove()调用中移除多个类。

element.classList.remove('class1', 'cl

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

前端面试必备 文章被收录于专栏

前端面试必备知识点:HTML和CSS、JS(变量/数据类型/操作符/条件语句/循环;面向对象编程/函数/闭包/异步编程/ES6)、DOM操作、HTTP和网络请求、前端框架、前端工具和构建流程、浏览器和性能优化、跨浏览器兼容性、前端安全、数据结构和算法、移动端开发技术、响应式设计、测试和调试技巧、性能监测等。准备面试时,建议阅读相关的技术书籍、参与项目实践、刷题和练习,以深化和巩固你的知识。

全部评论
DOM事件模型中存在两种不同的事件传播方式,即事件冒泡(event bubbling)和事件捕获(event capturing)。
点赞 回复 分享
发布于 2023-09-01 23:03 广东
DOM提供了一组API(应用程序接口),允许开发者通过JavaScript等脚本语言来访问、操纵和修改文档的内容、结构和样式。
点赞 回复 分享
发布于 2023-09-01 15:56 广东

相关推荐

牛客848095834号:举报了
点赞 评论 收藏
分享
评论
3
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务