JavaScript的BOM(Browser Object Model)即浏览器对象模型,是JavaScript与浏览器交互的核心接口集合,它不需要依赖页面内容就能直接操作浏览器的各种功能和属性,是前端开发中处理浏览器环境相关需求的基础。

BOM的核心:window对象
window对象是BOM的顶层对象,所有其他BOM对象都是window的属性,同时它也是全局作用域的载体,在全局作用域中声明的变量和函数都会成为window的属性或方法。
window对象的常用属性
我们可以通过window对象获取浏览器窗口的相关信息,也可以通过它执行一些全局操作:
// 获取浏览器窗口的宽度和高度(包含滚动条)
const windowWidth = window.outerWidth;
const windowHeight = window.outerHeight;
console.log(`浏览器窗口宽度:${windowWidth},高度:${windowHeight}`);
// 获取页面可视区域的宽度和高度(不包含滚动条、工具栏等)
const viewWidth = window.innerWidth;
const viewHeight = window.innerHeight;
console.log(`页面可视区域宽度:${viewWidth},高度:${viewHeight}`);
// 全局函数调用,等价于直接调用alert
window.alert('这是通过window对象调用的提示框');
window对象的常见方法
window对象提供了很多控制浏览器窗口的方法,比如打开新窗口、关闭窗口、定时器等:
// 打开新窗口,第一个参数是URL,第二个是窗口名称,第三个是窗口特性
const newWindow = window.open('https://ipipp.com', '_blank', 'width=800,height=600');
// 3秒后关闭新打开的窗口
setTimeout(() => {
if (newWindow && !newWindow.closed) {
newWindow.close();
}
}, 3000);
// 定时器示例,每2秒执行一次回调
const timer = setInterval(() => {
console.log('定时器执行中');
}, 2000);
// 5秒后清除定时器
setTimeout(() => {
clearInterval(timer);
}, 5000);
控制页面导航:location对象
location对象包含了当前页面的URL信息,同时提供了页面跳转、刷新等导航相关的操作能力,它是开发中处理页面路由和跳转的常用对象。
location对象的属性解析
location对象的每个属性对应URL的不同部分,我们可以通过这些属性获取当前URL的各个片段:
| 属性名 | 说明 | 示例(假设当前URL为https://ipipp.com:8080/path/page?name=test#top) |
|---|---|---|
| href | 完整URL | https://ipipp.com:8080/path/page?name=test#top |
| protocol | 协议部分 | https: |
| host | 主机名+端口 | ipipp.com:8080 |
| hostname | 主机名 | ipipp.com |
| port | 端口号 | 8080 |
| pathname | 路径部分 | /path/page |
| search | 查询参数 | ?name=test |
| hash | 锚点部分 | #top |
location对象的导航方法
通过location对象的方法可以实现页面跳转、刷新等操作:
// 跳转到指定URL,会保留当前页面的历史记录
location.assign('https://ipipp.com/list');
// 替换当前页面,不会保留历史记录,无法后退
location.replace('https://ipipp.com/detail');
// 重新加载页面,参数为true时强制从服务器加载,默认从缓存加载
location.reload();
// 修改hash值,不会触发页面刷新,常用于单页应用的路由切换
location.hash = '#content';
操作浏览器历史:history对象
history对象用于管理浏览器的历史记录栈,开发者可以通过它实现页面前进、后退,以及在历史记录中添加状态,是现代单页应用路由实现的基础之一。
基础历史记录操作
history对象提供了前进、后退、跳转到指定历史记录位置的方法:
// 后退到上一个页面,等价于点击浏览器的后退按钮 history.back(); // 前进到下一个页面,等价于点击浏览器的前进按钮 history.forward(); // 跳转到历史记录中的指定位置,参数为正数表示前进,负数表示后退 // 比如go(-1)等价于back(),go(1)等价于forward() history.go(-2); // 后退两个页面
history的pushState和replaceState方法
这两个方法可以在不刷新页面的情况下修改浏览器的历史记录和地址栏,是单页应用实现无刷新路由的核心:
// pushState:向历史记录栈中添加一条新记录,不会触发页面刷新
// 参数1:状态对象,可以存储自定义数据,后续可以通过popstate事件获取
// 参数2:标题,目前大部分浏览器忽略这个参数,可传空字符串
// 参数3:新的URL,必须是同域的URL,不会触发页面跳转
history.pushState({ page: 'home' }, '', '/home');
// replaceState:替换当前历史记录,不会新增记录
history.replaceState({ page: 'about' }, '', '/about');
// 监听历史记录变化事件,当用户点击前进后退按钮时会触发
window.addEventListener('popstate', (event) => {
console.log('当前状态对象:', event.state);
// 可以根据状态对象更新页面内容
});
获取浏览器信息:navigator对象
navigator对象包含了浏览器的相关信息,比如浏览器名称、版本、操作系统、是否支持某些特性等,常用于做浏览器兼容性判断或者设备类型识别。
// 获取浏览器的用户代理字符串,包含浏览器、操作系统等信息
const ua = navigator.userAgent;
console.log('用户代理:', ua);
// 判断是否移动端设备
const isMobile = /Mobile|Android|iPhone|iPad|iPod/i.test(ua);
console.log('是否为移动端:', isMobile);
// 获取浏览器支持的插件列表
const plugins = navigator.plugins;
console.log('安装的插件数量:', plugins.length);
// 检查浏览器是否支持某个特性,比如判断是否支持地理定位
if (navigator.geolocation) {
console.log('浏览器支持地理定位');
} else {
console.log('浏览器不支持地理定位');
}
其他常用BOM对象
screen对象
screen对象用于获取用户屏幕的相关信息,比如屏幕的宽度、高度、颜色深度等,常用于适配不同分辨率的设备:
// 获取屏幕的宽度和高度(物理分辨率)
const screenWidth = screen.width;
const screenHeight = screen.height;
console.log(`屏幕分辨率:${screenWidth} * ${screenHeight}`);
// 获取屏幕可用高度(不包含任务栏等系统组件)
const availHeight = screen.availHeight;
console.log(`屏幕可用高度:${availHeight}`);
frames对象
如果页面中包含<iframe>或者框架集,frames对象可以获取页面中的所有子框架,每个子框架都有自己独立的window对象:
// 获取页面中第一个iframe的window对象
const firstFrame = window.frames[0];
// 操作子框架的内容
if (firstFrame) {
firstFrame.document.body.style.backgroundColor = 'lightgray';
}
实际应用场景示例
下面是一个结合多个BOM对象实现的实际场景:页面加载时判断设备类型,移动端自动跳转到移动版页面,同时记录跳转状态到历史记录中:
window.addEventListener('load', () => {
const ua = navigator.userAgent;
const isMobile = /Mobile|Android|iPhone|iPad|iPod/i.test(ua);
// 如果是移动端,且当前不是移动版页面
if (isMobile && !location.pathname.startsWith('/m/')) {
// 使用replaceState避免后退到桌面版后再次跳转
history.replaceState(null, '', '/m' + location.pathname);
// 如果需要真正跳转可以用location.assign
// location.assign('/m' + location.pathname);
}
// 获取屏幕信息,适配不同尺寸
const screenWidth = screen.width;
if (screenWidth < 768) {
document.body.classList.add('small-screen');
}
});
通过上述内容可以看到,BOM对象覆盖了浏览器环境中大部分的交互和操作需求,熟练掌握这些对象的使用方法,能够帮助开发者更高效地实现浏览器相关的功能,提升前端应用的用户体验。
JavaScriptBOM对象浏览器环境window对象location对象修改时间:2026-06-20 09:30:44