什么是DOM和BOM?

news2024/11/25 2:56:02

一、什么是DOM

DOM 全称是 Document Object Model,也就是文档对象模型。提供操作页面元素的方法和属性,是HTML和XML的API,DOM把整个页面规划成由节点层级构成的文档。

DOM 树

DOM树是Web页面的模型,当浏览器加载一个Web页面时,它会创建这个页面的模型,称为DOM树。

DOM树主要由4类主要节点组成:文档节点,元素节点,属性节点,文本节点。

①.文档节点:在树的顶端是文档节点,它呈现整个页面。

②.元素节点:需要访问DOM树时,需要从查找元素开始。一旦找到所需的元素,然后就可以根据需要来访问它的文本和属性节点。

③.属性节点:属性节点不是所在元素的子节点,它们是这个元素的一部分。当访问一个元素时,有特定的方法和属性用来读取或修改这个元素的属性。

④.文本节点:当访问元素节点,可以访问元素内部的文本。文本节点没有子节点。

DOM 节点

常见的DOM节点主要有三种

①.元素节点,如<html>,<a>,<body>等都是元素节点,即标签

②.文本节点,向用户展示的内容,如<title>...</title>中的“文档标题”

③.属性节点,元素的属性,如<a>中的href属性

通过document.getElementById 和 document.body 获取的元素就是获取元素的节点
 

以百度网站为例,在浏览器控制台,我们也能清晰看到DOM的层级关系

DOM树种的节点均可通过javascript进行访问,所有html节点均可被修改或删除,也可以创建新节点

下面列举一些常用的DOM操作方法

  • document.title     // 设置页面title
  • document.getElementById(id)    // 根据id获取元素
  • document.getElementsByTagName(name)    // 根据tag获取元素
  • document.createElement(name)     // 创建元素
  • parentNode.appendChild(node)     // 向子节点列表末尾添加一个节点
  • parentNode.insertBefore()     // 把要插入的节点放到某个特定的位置
  • parentNode.removeChild()    // 移除节点
  • parentNode.cloneNode()     //  对节点进行复制,接受一个布尔值参数,true为深拷贝,false为浅拷贝
  • element.innerHTML      // 设置/获取元素内容
  • element.styles     // 设置/获取元素样式
  • element.setAttribute()     // 设置元素属性值
  • element.getAttribute()     // 获取元素属性值
  • element.addEventListener()     // 添加事件绑定

DOM事件流

事件流所描述的就是从页面中接受事件的顺序

DOM事件流(event flow)存在三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。

①捕获阶段:一开始从文档的根节点流向目标对象;(从上往下)
②目标阶段:然后在目标对向上被触发;
③冒泡阶段:之后再回溯到文档的根节点。(从下往上)

①事件捕获
当鼠标点击或者触发 dom 事件时,浏览器会从根节点开始由外到内进行事件传播,即点击了子元素,如果父元素通过事件捕获方式注册了对应的事件的话,会先触发父元素绑定的事件。

在事件捕获的概念下在p元素上发生click事件的顺序应该是document -> html -> body -> div -> p

②事件冒泡
与事件捕获恰恰相反,事件冒泡顺序是由内到外进行事件传播,直到根节点。

在事件冒泡的概念下在p元素上发生click事件的顺序应该是p -> div -> body -> html -> document

DOM标准事件流的触发的先后顺序为:先捕获再冒泡,即当触发 dom 事件时,会先进行事件捕获,捕获到事件源之后通过事件传播进行事件冒泡。

不同的浏览器对此有着不同的实现,IE10 及以下不支持捕获型事件,所以就少了一个事件捕获阶段,IE11、Chrome 、Firefox、Safari等浏览器则同时存在。

二、什么是BOM

BOM 全称是 Browser Object Model,也就是浏览器对象模型。是JavaScript中用于表示和操作浏览器窗口及其相关组件的对象模型。

BOM提供了一组API(Application Programming Interface,应用程序编程接口),允许开发者通过JavaScript与浏览器进行交互。BOM的核心对象是window对象,它代表了浏览器窗口,并提供了许多属性和方法来操作窗口、导航、处理事件等。

BOM 对象

 

window 对象的主要方法

方法描述
window.alert()在浏览器中显示一个带有消息和确定按钮的警告框。
window.prompt()在浏览器中显示一个带有消息和输入框的提示框,接收用户输入的文本。
window.confirm()在浏览器中显示一个带有消息和确定/取消按钮的确认框,返回用户的选择结果。
window.open()打开一个新的浏览器窗口或标签页,并加载指定的URL。
window.close()关闭当前浏览器窗口或标签页。
window.setTimeout()在指定的延迟时间后执行一次指定的函数或一段代码。
window.setInterval()每隔指定的时间间隔重复执行指定的函数或一段代码。
window.clearTimeout()取消之前通过setTimeout()方法设置的定时器。
window.clearInterval()取消之前通过setInterval()方法设置的定时器。
window.scrollTo()在窗口中滚动到指定的位置。
window.scrollBy()在窗口中相对于当前滚动位置滚动指定的偏移量。
window.innerWidth返回窗口的内部宽度(不包括滚动条)。
window.innerHeight返回窗口的内部高度(不包括滚动条)。
window.outerWidth返回窗口的外部宽度(包括边框和滚动条)。
window.outerHeight返回窗口的外部高度(包括边框和滚动条)。
window.location.reload()重新加载当前页面。
window.location.href获取或设置当前页面的URL。
window.location.assign()加载指定的URL。
window.location.replace()用指定的URL替换当前页面,无法通过后退按钮返回。

这只是window对象的一部分方法,还有许多其他方法可用于操作窗口、处理定时器、导航等。请注意,某些方法可能在移动设备上具有不同的行为或受限制。 

document 对象主要方法

方法描述
document.getElementById(id)根据元素的 id 属性获取对应的元素。
document.getElementsByClassName(className)根据元素的 class 属性获取对应的元素集合。
document.getElementsByTagName(tagName)根据元素的标签名获取对应的元素集合。
document.querySelector(selector)根据 CSS 选择器选择匹配的第一个元素。
document.querySelectorAll(selector)根据 CSS 选择器选择匹配的所有元素。
document.createElement(tagName)创建指定标签名的元素节点。
document.createTextNode(text)创建包含指定文本内容的文本节点。
document.appendChild(node)将一个节点添加为另一个节点的子节点。
document.removeChild(node)从父节点中移除指定的子节点。
document.replaceChild(newNode, oldNode)将一个节点替换为另一个节点。
document.cloneNode(deep)克隆一个节点,并可选择是否深度克隆其子节点。
document.setAttribute(name, value)设置元素的指定属性名的属性值。
document.getAttribute(name)获取元素的指定属性名的属性值。
document.removeAttribute(name)移除元素的指定属性名。
document.addEventListener(type, listener)为元素添加事件监听器。
document.removeEventListener(type, listener)移除元素的事件监听器。
document.querySelector(selector)根据 CSS 选择器选择匹配的第一个元素。
document.querySelectorAll(selector)根据 CSS 选择器选择匹配的所有元素。
document.getElementById(id)根据元素的 id 属性获取对应的元素。
document.getElementsByClassName(className)根据元素的 class 属性获取对应的元素集合。
document.getElementsByTagName(tagName)根据元素的标签名获取对应的元素集合。
document.createElement(tagName)创建指定标签名的元素节点。
document.createTextNode(text)创建包含指定文本内容的文本节点。
document.appendChild(node)将一个节点添加为另一个节点的子节点。
document.removeChild(node)从父节点中移除指定的子节点。
document.replaceChild(newNode, oldNode)将一个节点替换为另一个节点。
document.cloneNode(deep)克隆一个节点,并可选择是否深度克隆其子节点。
document.setAttribute(name, value)设置元素的指定属性名的属性值。
document.getAttribute(name)获取元素的指定属性名的属性值。
document.removeAttribute(name)移除元素的指定属性名。
document.addEventListener(type, listener)为元素添加事件监听器。
document.removeEventListener(type, listener)移除元素的事件监听器。
document.querySelector(selector)根据 CSS 选择器选择匹配的第一个元素。
document.querySelectorAll(selector)根据 CSS 选择器选择匹配的所有元素。
document.getElementById(id)根据元素的 id 属性获取对应的元素。
document.getElementsByClassName(className)根据元素的 class 属性获取对应的元素集合。
document.getElementsByTagName(tagName)根据元素的标签名获取对应的元素集合。
document.createElement(tagName)创建指定标签名的元素节点。
document.createTextNode(text)创建包含指定文本内容的文本节点。
document.appendChild(node)将一个节点添加为另一个节点的子节点。
document.removeChild(node)从父节点中移除指定的子节点。
document.replaceChild(newNode, oldNode)将一个节点替换为另一个节点。
document.cloneNode(deep)克隆一个节点,并可选择是否深度克隆其子节点。
document.setAttribute(name, value)设置元素的指定属性名的属性值。
document.getAttribute(name)获取元素的指定属性名的属性值。
document.removeAttribute(name)移除元素的指定属性名。
document.addEventListener(type, listener)为元素添加事件监听器。
document.removeEventListener(type, listener)移除元素的事件监听器。
document.querySelector(selector)根据 CSS 选择器选择匹配的第一个元素。
document.querySelectorAll(selector)根据 CSS 选择器选择匹配的所有元素。

这些方法可以对文档进行访问、创建、修改、删除等操作。

 

history 对象主要方法

方法描述
history.back()加载历史记录中的上一个页面。
history.forward()加载历史记录中的下一个页面。
history.go()根据历史记录中的相对位置加载页面。 go(0) 刷新页面,go(1) 向前跳转,go(-1) 向后跳转
history.pushState()向浏览器历史记录添加一个状态,并且不触发页面刷新。
history.replaceState()替换当前的历史记录状态,并且不触发页面刷新。

这些方法允许开发者在不导致页面刷新的情况下,通过JavaScript代码控制浏览器的历史记录,实现前端路由和状态管理等功能。

location 对象主要方法

方法描述
location.assign(url)加载指定的URL。
location.reload()重新加载当前页面。
location.replace(url)用指定的URL替换当前页面,不会在历史记录中创建新条目。
location.toString()返回当前URL的字符串表示。
location.hostname设置或返回URL的主机名部分。
location.pathname设置或返回URL的路径部分。
location.search设置或返回URL的查询字符串部分。
location.hash设置或返回URL的片段标识符部分。
location.protocol设置或返回URL的协议部分。
location.href设置或返回完整的URL。
location.origin返回URL的协议、主机和端口部分。
location.reload(forced)重新加载当前页面,可强制从服务器获取最新页面。
location.replace(url)用指定的URL替换当前页面。
location.searchParams返回URL查询字符串的URLSearchParams对象。

这些方法可以用来获取或设置location对象的不同部分,如主机名、路径、查询字符串等,并且可以通过调用这些方法来导航到其他页面或重新加载当前页面。 

navigator 对象主要方法

方法功能
navigator.userAgent返回浏览器的用户代理字符串
navigator.cookieEnabled检查浏览器是否启用了Cookie
navigator.platform返回运行浏览器的操作系统平台
navigator.language返回用户使用的浏览器的首选语言
navigator.onLine检查浏览器是否处于在线状态
navigator.geolocation.getCurrentPosition()获取用户的地理位置
navigator.mediaDevices.getUserMedia()请求用户的媒体设备,如摄像头和麦克风
navigator.vibrate()控制设备振动,使设备产生震动效果
navigator.sendBeacon()异步发送数据到服务器,适用于小量数据

不同浏览器的navigator对象可能会提供不同的方法和属性。因此,在使用特定方法或属性时,请务必进行兼容性检查,以确保代码在各种浏览器中正常运行。

screen 对象主要方法

方法描述
screen.availHeight返回屏幕可用高度(除去操作系统任务栏和工具栏)
screen.availWidth返回屏幕可用宽度
screen.height返回屏幕的总高度
screen.width返回屏幕的总宽度
screen.colorDepth返回屏幕的颜色深度(位数)
screen.pixelDepth返回屏幕的像素深度(位数)

这些方法提供了关于用户屏幕的一些信息,例如屏幕的尺寸、可用空间和颜色深度。通过这些方法,可以根据屏幕的特性来调整页面布局或显示不同的内容。

注意:使用BOM时应考虑兼容性、安全性、性能和异步操作等方面的注意事项。合理使用BOM的功能,可以实现与浏览器窗口、历史记录、屏幕尺寸等相关的交互,提供更好的交互体验。

在前端开发中,DOM和BOM通常一起使用,通过DOM操作文档内容,而通过BOM与浏览器进行交互,实现与用户界面和浏览器环境的交互效果。

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

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

相关文章

A Framework for Evaluating Gradient Leakage Attacks in Federated Learning

联邦学习中梯度泄漏攻击评估框架 摘要&#xff1a; 针对问题&#xff1a;从客户端向联邦服务器共享本地参数更新也可能容易受到梯度泄漏攻击&#xff0c;并侵犯客户端关于其训练数据的隐私。 提出了一个原则性框架&#xff0c;用于评估和比较不同形式的客户端隐私泄露攻击。…

路径规划算法:基于纵横交叉优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于纵横交叉优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于纵横交叉优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

Eclipse导入项目的配置步骤说明

1.数据库创建并导入 &#xff08;1&#xff09;打开navicat&#xff0c;右击&#xff0c;选择创建数据库&#xff0c;进入新建数据库页面&#xff0c;输入数据库名称。我这里创建的是report数据库。 &#xff08;2&#xff09;右击自己创建的数据库&#xff0c;选择运行sql文件…

【C++】STL——stack OJ练习

文章目录 1. 最小栈思路分析AC代码拓展思维 2. 栈的压入、弹出序列思路讲解AC代码 3. 逆波兰表达式求值思路讲解AC代码拓展&#xff1a;中缀表达式如何转后缀 这篇文章我们来做几道stack相关的OJ题&#xff0c;练习一下stack的使用。 1. 最小栈 先来看第一道题——&#xff1a…

【人工智能】常见问题以及解答

1 什么是人工智能 人工智能&#xff08;Artificial Intelligence, AI&#xff09;是一门涉及计算机科学、数学、心理学、哲学等多个领域的交叉学科&#xff0c;旨在研究如何使计算机能够像人一样地思考、学习和行动。 在过去几十年中&#xff0c;人工智能技术得到了广泛的应用…

LNMP部署

LNMP部署 一、安装Nginx服务二、安装mysql服务三、安装配置PHP解析环境四、部署 Discuz&#xff01;社区论坛 Web 应用五、fpm参数优化 LNMP架构&#xff1a; LNMP代表的就是&#xff1a;Linux系统下NginxMySQLPHP这种网站服务器架构Linux是一类Unix计算机操作系统的统称&#…

【P47】JMeter JSON断言(JSON Assertion)

文章目录 一、JSON断言&#xff08;JSON Assertion&#xff09;参数说明二、准备工作三、测试计划设计3.1、Assert JSON Path exists3.2、Additionally assert value3.3、Expect null3.4、Invert assertion &#xff08;will fail if above conditions met&#xff09; 一、JSO…

双链表、循环链表、静态链表

目录 一、双链表1、为什么要引入双链表2、双链表的插入操作3、双链表的插入操作 二、循环链表1、循环单链表2、循环双链表 三、静态链表 一、双链表 1、为什么要引入双链表 单链表结点中只有一个指向其后继的指针&#xff0c;使得单链表只能从头结点依次顺序地向后遍历。要访…

数据治理核心保障数据质量监控开源项目Apache Griffin分享

文章目录 概述定义为何要做数据质量监控基本概念特性架构 安装Docker部署Docker 镜像批处理使用Docker 镜像流处理使用UI界面操作 概述 定义 Apache Griffin 官网地址 https://griffin.apache.org/ 源码release最新版本0.6.0 Apache Griffin 官网文档地址 https://griffin.apa…

MySQL学习(联结,组合查询,全文本搜索)

联结 SQL最强大的功能之一就是能在数据检索查询的执行中联结表&#xff1b; 关系表 为什么要使用关系表&#xff1f; 使用关系表可以储存数据不重复&#xff0c;从而不浪费时间和空间&#xff1b;如果有数据信息变动&#xff0c;只需更新一个表中的单个记录&#xff0c;相关…

研发工程师玩转Kubernetes——Node失效后的Pod的调度实验

在《研发工程师玩转Kubernetes——多Worker Node部署》中&#xff0c;我们创建了Master Node: UbunutA&#xff0c;以及四个Worker Node:UbunutB、UbunutC、UbunutD和UbunutE。本节我们将使用Deployment创建只含有一个nginx的Pod&#xff0c;然后关掉它所在的主机以模拟Node失效…

使用Adobe Acrobat DC对.jpg和.png格式图片转换为.eps图片格式举例

使用Adobe Acrobat DC对.jpg和.png等格式图片转换为.eps图片格式举例 在进行有的文档排版编辑时候&#xff08;比如使用winEdt进行排版CTEX文件时候&#xff09;&#xff0c;需要添加.eps格式的图片&#xff0c;然而电脑中的画图&#xff0c;word和ppt等中无法实现.eps格式图片…

centos7 glib2.0 arm版本的编译

最近在看bluez代码&#xff0c;想编译个例子来玩一下&#xff0c;然后bluez里的例子会用到 libglib-2.0 库里的接口&#xff0c;于是开始了漫长的编译 arm 版本的 libglib-2.0&#xff0c;Linux 系统有时就是很麻烦&#xff0c;要编译一个库&#xff0c;结果发现依赖一大堆库&a…

Linux命令学习之帮助命令man

cat /proc/version和uname -a可以查看CentOS内核使用版本。 我使用的Linux操作系统发行版本号是7.6.1810&#xff0c;可以通过cat /etc/redhat-release进行查看。 man man是manual的缩写&#xff0c;是操作说明的意思。 使用man touch想要看一下touch的使用帮助&#xff0c;…

OpenMMLab开营笔记

摘要 很高兴能加入OpenMMLab AI实战营&#xff0c;成为第二期4班的一名学员。OpenMMLab经过几年的发展和沉淀&#xff0c;其开源项目已经覆盖到计算机视觉的各个领域。OpenMMLab 为香港中文大学-商汤科技联合实验室 MMLab 开源的算法平台&#xff0c;不到两年时间&#xff0c;…

文件操作之文件包含全解(41)

<!#include file”1.asp”--> 作者&#xff1a;沙漠里的鲸 https://www.bilibili.com/read/cv14178731/ 出处&#xff1a;bilibili 文件包含的作用就是将这个文件包含进去之后&#xff0c;会调用指定文件的代码。先将文件包含才能执行里面的一些相关代码&#xff0c;比如…

SAP-MM-标准报表路径

一、SAP MM模块系统自带的标准报表很多&#xff0c;常见报表都放在每个主题的“清单显示”和“报表”文件夹下&#xff0c;如下图所示&#xff1a; 二、另外&#xff0c;还有一些报表&#xff0c;放在另外一个地方&#xff0c;需要时&#xff0c;可以随时进行查看&#xff0c;前…

陷入困境?Taos创建超表带来的错误!

taos创建超表时报错 运行如下命令 let res await cursor.query("CREATE STABLE meters1 (ts TIMESTAMP, value FLOAT, slot INT,rack INT,nameId VARCHAR(32),adName VARCHAR(32),dbNumber INT,dataType VARCHAR(28), unit VARCHAR(28)) TAGS (location binary(64), gr…

2GT齿轮的齿形参数

文章目录 2GT齿轮的齿形参数概述笔记齿的种类方形齿半圆弧齿全圆弧齿精确圆弧齿修正圆弧齿梯形齿齿形参数用SW画一个2GT齿END 2GT齿轮的齿形参数 概述 零件上用到了2GT的同步轮和惰轮, 想在装配图上将2个齿轮皮带都画上, 看看有没有干涉. 整体修改是否合理. 在淘宝店家的主页…

Linux系统下imx6ull QT编程——开发环境及 U盘拷贝文件(十)

Linux QT编程 文章目录 Linux QT编程前言一、开发环境二、文件拷贝 前言 前面学习了一些基础&#xff0c;然后qt我也有学过&#xff0c;直接动手在开发板上进行编程吧&#xff0c;但是开发板需要安装环境&#xff0c;需要拷贝一些文件&#xff0c;我使用得是U盘。 一、开发环…