news 2026/4/2 19:20:11

WebAPI 全面解析:BOM与DOM核心指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WebAPI 全面解析:BOM与DOM核心指南

WebAPI 学习文档

概述

WebAPI 是浏览器提供的一套 API,用于操作浏览器窗口和界面,与 JavaScript 标准库不同,它依赖于浏览器环境。WebAPI 主要包含两部分:

  • BOM(Browser Object Model):浏览器模型,提供和浏览器相关的操作
  • DOM(Document Object Model):文档模型,提供和页面相关的操作

BOM(浏览器对象模型)

BOM 提供了一系列对象和函数,用于操作浏览器本身。

window 对象

window 是浏览器的全局对象,所有 BOM 和 DOM 的功能都以某种方式与 window 对象相关联。

API含义备注
open()打开一个新的浏览器窗口返回新窗口的 window 对象
close()关闭浏览器窗口只能关闭使用 open 打开的窗口
setTimeout()设置计时器,一段时间后执行函数参数1:回调函数(this 指向 window);参数2:延迟时间(毫秒);返回:计时器 ID
clearTimeout()清除指定 ID 的计时器需传入 setTimeout 返回的 ID
setInterval()设置计时器,每隔一段时间执行函数参数1:回调函数;参数2:间隔时间(毫秒);返回:计时器 ID
clearInterval()清除指定 ID 的计时器需传入 setInterval 返回的 ID
alert()弹出提示框外观因操作系统而异
confirm()弹出确认框点击确定返回 true,取消返回 false

示例代码:

// 打开新窗口constnewWindow=window.open('https://example.com','_blank','width=500,height=300');// 3秒后执行consttimer=setTimeout(()=>{console.log('3秒后执行');},3000);// 清除计时器clearTimeout(timer);// 每隔1秒执行一次constinterval=setInterval(()=>{console.log('每隔1秒执行');},1000);// 5秒后停止间隔执行setTimeout(()=>{clearInterval(interval);},5000);

window.location

提供地址栏的相关操作,用于获取或修改当前页面的 URL 信息。

API含义备注
href获取或设置页面当前地址设置地址会导致页面跳转
protocol获取或设置地址中的协议部分http:https:
host获取或设置主机名和端口号example.com:8080
hostname获取或设置主机名example.com
port获取或设置端口号8080
pathname获取或设置路径部分/page/index.html
search获取或设置参数部分?id=1&name=test
hash获取或设置 hash 部分#section1
reload()刷新页面类似 F5 刷新

示例代码:

// 获取当前URLconsole.log(location.href);// 输出完整URL// 跳转到新页面location.href='https://example.com';// 获取URL参数console.log(location.search);// 输出"?id=1&name=test"// 刷新页面location.reload();

window.history

提供当前窗口历史记录的操作。

API含义备注
back()后退到上一页类似浏览器的后退按钮
forward()前进到下一页类似浏览器的前进按钮
go(n)跳转到相对当前页面的第 n 条记录n 为正数前进,负数后退
pushState()在历史记录中添加一条新记录页面不刷新
replaceState()替换当前历史记录页面不刷新

示例代码:

// 后退一页history.back();// 前进一页history.forward();// 前进两页history.go(2);// 添加新的历史记录history.pushState({page:1},"页面1","/page1");

DOM(文档对象模型)

DOM 将 HTML 文档表示为一个树状结构,每个节点都是一个对象,通过操作这些对象可以改变页面的结构、内容和样式。

获取 DOM 元素

API含义备注
document.getElementById()根据 ID 获取元素返回单个 DOM 元素
document.getElementsByTagName()根据标签名获取元素返回元素集合(伪数组)
document.getElementsByClassName()根据类名获取元素返回元素集合(伪数组)
document.querySelector()根据 CSS 选择器获取元素返回第一个匹配的元素
document.querySelectorAll()根据 CSS 选择器获取元素返回所有匹配的元素(伪数组)
document.documentElement获取 html 元素直接访问根元素
document.body获取 body 元素直接访问 body 元素
dom.children获取元素的子元素返回子元素集合(伪数组)
dom.parentElement获取元素的父元素返回父元素
dom.previousElementSibling获取前一个兄弟元素返回前一个同级元素
dom.nextElementSibling获取后一个兄弟元素返回后一个同级元素

示例代码:

// 根据ID获取constbox=document.getElementById('box');// 根据标签名获取constdivs=document.getElementsByTagName('div');// 根据类名获取constitems=document.getElementsByClassName('item');// 根据CSS选择器获取constfirstItem=document.querySelector('.list .item');constallItems=document.querySelectorAll('.list .item');// 获取子元素constchildren=box.children;// 获取父元素constparent=box.parentElement;

创建 DOM 元素

API含义备注
document.createElement(tagName)创建一个新元素参数为标签名,返回新创建的元素

示例代码:

// 创建一个div元素constnewDiv=document.createElement('div');newDiv.textContent='新创建的元素';newDiv.className='new-class';

更改 DOM 结构

API含义备注
dom.remove()从文档树中删除元素移除自身
dom.removeChild(child)删除子元素参数为要删除的子元素
dom.insertBefore(newNode, referenceNode)在指定子元素前插入新元素第一个参数为新元素,第二个为参考元素
dom.appendChild(child)向元素末尾添加子元素参数为要添加的子元素

示例代码:

constparent=document.getElementById('parent');constchild=document.createElement('div');// 添加子元素parent.appendChild(child);// 在第一个子元素前插入新元素constfirstChild=parent.firstElementChild;parent.insertBefore(child,firstChild);// 删除子元素parent.removeChild(child);// 移除自身child.remove();

DOM 属性操作

标准属性

HTML 元素的标准属性(如hrefsrcvalue等)可以直接通过dom.属性名访问和修改。

注意:

  • 布尔属性会自动转换为 boolean 类型
  • 路径类属性会转换为绝对路径
  • class属性需使用className访问(避免与关键字冲突)

示例代码:

constlink=document.querySelector('a');console.log(link.href);// 获取href属性link.href='https://example.com';// 设置href属性constinput=document.querySelector('input');input.value='默认值';// 设置输入框值constdiv=document.querySelector('div');div.className='active';// 设置类名
自定义属性

自定义属性需要通过setAttributegetAttribute方法操作。

示例代码:

constdiv=document.querySelector('div');// 设置自定义属性div.setAttribute('data-id','123');div.setAttribute('data-name','test');// 获取自定义属性console.log(div.getAttribute('data-id'));// 输出"123"

DOM 内容操作

API含义备注
dom.innerText获取或设置元素的文本内容设置时会自动进行 HTML 实体编码
dom.innerHTML获取或设置元素的 HTML 内容可以解析 HTML 标签

示例代码:

constdiv=document.querySelector('div');// 设置文本内容div.innerText='Hello <strong>World</strong>';// 显示为"Hello <strong>World</strong>"// 设置HTML内容div.innerHTML='Hello <strong>World</strong>';// 显示为"Hello World"(World会加粗)// 获取内容console.log(div.innerText);// 获取文本内容console.log(div.innerHTML);// 获取HTML内容

DOM 样式操作

JS 中可以操作两种样式:内联样式和计算样式(最终样式),但只能设置内联样式。

方法含义备注
dom.style获取元素的内联样式可读写,属性为驼峰命名法(如fontSize
getComputedStyle(dom)获取元素的计算样式只读,返回最终应用到元素上的所有样式

示例代码:

constdiv=document.querySelector('div');// 设置内联样式div.style.color='red';div.style.fontSize='16px';div.style.backgroundColor='#f0f0f0';// 获取内联样式console.log(div.style.color);// 输出"red"// 获取计算样式constcomputedStyle=getComputedStyle(div);console.log(computedStyle.width);// 输出元素的实际宽度console.log(computedStyle.marginTop);// 输出元素的实际上边距

事件监听

事件监听是指当某个 DOM 元素发生特定事件时,执行相应的处理函数。

事件类型
表单类事件
事件名称触发时机备注
submit表单被提交时注册到 form 元素上
input文本框内容改变时注册到 input、textarea 上
change内容改变且失去焦点时(下拉列表、单选框、复选框改变时立即触发)注册到 input、select、textarea 上
focus元素获得焦点时-
blur元素失去焦点时-
鼠标类事件
事件名称触发时机备注
click鼠标点击时-
mousedown鼠标按下时-
mouseup鼠标抬起时-
mousemove鼠标在元素上移动时-
mouseenter鼠标进入元素时不冒泡
mouseleave鼠标离开元素时不冒泡
键盘类事件
事件名称触发时机备注
keydown键盘按键按下时-
keyup键盘按键抬起时-
注册事件的方式
方式 1:通过元素属性(不推荐)
<buttononclick="handleClick()">点击我</button><script>functionhandleClick(){console.log('按钮被点击了');}</script>
方式 2:通过 DOM 属性
constbutton=document.querySelector('button');button.onclick=function(){console.log('按钮被点击了');};// 移除事件监听button.onclick=null;
方式 3:通过addEventListener方法(推荐)
constbutton=document.querySelector('button');functionhandleClick(){console.log('按钮被点击了');}// 添加事件监听button.addEventListener('click',handleClick);// 移除事件监听button.removeEventListener('click',handleClick);
事件对象

事件处理函数会接收一个事件对象参数,包含事件相关的信息。

示例代码:

document.querySelector('button').addEventListener('click',function(e){console.log('鼠标X坐标:',e.clientX);console.log('鼠标Y坐标:',e.clientY);console.log('事件源:',e.target);});

DOM 进阶

事件默认行为

某些事件会触发浏览器的默认行为(如 a 标签的跳转、表单的提交等),可以通过e.preventDefault()阻止。

示例代码:

// 阻止a标签跳转document.querySelector('a').addEventListener('click',function(e){e.preventDefault();// 阻止默认跳转行为console.log('链接被点击,但不跳转');});// 阻止表单提交document.querySelector('form').addEventListener('submit',function(e){e.preventDefault();// 阻止默认提交行为console.log('表单被提交,但不刷新页面');});
事件传播机制

事件传播分为三个阶段:捕获阶段、目标阶段、冒泡阶段。

  • 捕获阶段:事件从最外层元素向内传播到目标元素
  • 目标阶段:事件到达目标元素
  • 冒泡阶段:事件从目标元素向外传播到最外层元素

示例代码:

// 在捕获阶段触发parent.addEventListener('click',function(){console.log('捕获阶段 - 父元素');},true);// 在冒泡阶段触发(默认)parent.addEventListener('click',function(){console.log('冒泡阶段 - 父元素');},false);// 阻止事件冒泡child.addEventListener('click',function(e){e.stopPropagation();// 阻止事件继续传播console.log('子元素被点击');});
DOM 尺寸和位置

可以通过以下属性和方法获取元素的尺寸和位置信息:

  • dom.offsetWidth/dom.offsetHeight:元素的宽高(包括边框和内边距)
  • dom.clientWidth/dom.clientHeight:元素的宽高(包括内边距,不包括边框)
  • dom.scrollWidth/dom.scrollHeight:元素内容的实际宽高(包括滚动隐藏部分)
  • dom.offsetTop/dom.offsetLeft:元素相对于 offsetParent 的位置
  • dom.scrollTop/dom.scrollLeft:元素滚动的距离
  • dom.getBoundingClientRect():获取元素相对于视口的位置和尺寸

示例代码:

constbox=document.querySelector('.box');// 获取元素尺寸console.log('宽:',box.offsetWidth);console.log('高:',box.offsetHeight);// 获取元素位置console.log('距离顶部:',box.offsetTop);console.log('距离左侧:',box.offsetLeft);// 获取相对于视口的位置constrect=box.getBoundingClientRect();console.log('视口顶部:',rect.top);console.log('视口左侧:',rect.left);// 滚动到顶部box.scrollTo(0,0);

总结

WebAPI 是前端开发的基础,包含 BOM 和 DOM 两部分:

  • BOM 用于操作浏览器窗口,包括窗口控制、地址栏操作、历史记录等
  • DOM 用于操作网页内容,包括元素获取、创建、修改、样式设置和事件处理等

掌握 WebAPI 是进行前端开发的必备技能,通过灵活运用这些 API,可以实现丰富的交互效果和功能。建议结合实际项目多练习,加深对这些 API 的理解和应用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/31 16:15:27

终极指南:如何用Lucky实现ACME自动证书申请,告别SSL续期烦恼

终极指南&#xff1a;如何用Lucky实现ACME自动证书申请&#xff0c;告别SSL续期烦恼 【免费下载链接】lucky 软硬路由公网神器,ipv6/ipv4 端口转发,反向代理,DDNS,WOL,ipv4 stun内网穿透,cron,acme,阿里云盘,ftp,webdav,filebrowser 项目地址: https://gitcode.com/GitHub_Tr…

作者头像 李华
网站建设 2026/3/27 22:33:16

大模型Agent核心架构拆解:从原理到可落地的智能任务规划器开发

引言 一、大模型Agent的核心逻辑&#xff1a;不止是“调用工具” 大模型Agent之所以能突破传统AI的“指令执行”边界&#xff0c;核心在于构建了“感知-规划-执行-反馈”的闭环系统&#xff0c;这一架构本质是将大模型的语义理解能力转化为自主决策与任务拆解能力。不同于简单…

作者头像 李华
网站建设 2026/4/1 8:46:56

vue基于Spring Boot框架 一站式考研服务电子商务平台的设计与实现_0d7wq4r3_

目录已开发项目效果实现截图开发技术介绍系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华
网站建设 2026/4/2 12:00:02

汽车涂装工艺的智能化与绿色化升级:技术、案例与趋势

汽车涂装工艺正在经历一场深刻的变革&#xff0c;从传统的人工喷涂向智能化、环保化方向发展。在这一过程中&#xff0c;技术创新发挥着关键作用&#xff0c;而广域铭岛作为工业智能体领域的先行者&#xff0c;其解决方案在多个环节展现出显著优势。例如&#xff0c;领克汽车成…

作者头像 李华