BOM(Browser Object Model,浏览器对象模型)是连接 JavaScript 与浏览器的核心桥梁。它为我们提供了操作地址栏、管理历史记录、获取浏览器信息、控制窗口行为等一系列与浏览器环境交互的能力。无论是开发单页应用的路由跳转,还是实现定时任务与响应式布局,掌握 BOM 都是前端开发者的必备技能。今天,我们就来系统地拆解 BOM 的核心对象和功能。
一、什么是BOM?
1. 核心概念
BOM 是浏览器提供的一套用于操作浏览器窗口和页面环境的对象模型。其最核心的对象是 window,它作为全局对象存在,所有 BOM 的子对象(如 location、history)都作为 window 对象的属性,可以直接使用。
2. 核心特性
window 是全局对象,所有全局变量、函数以及 BOM 和 DOM 对象都挂载在它上面。因此,我们通常可以省略 window. 前缀,例如直接使用 alert() 等同于 window.alert()。
- 每一个浏览器窗口、标签页或 iframe 都对应一个独立的
window 对象,它们之间互不干扰。
- BOM 对象大多是只读的,并且受到浏览器安全策略的严格限制,例如跨域时无法访问其他窗口的 BOM 属性。
二、BOM常用子对象
BOM 的强大能力由其子对象提供,主要包括 location(地址栏)、history(历史记录)、navigator(浏览器信息)和 screen(屏幕信息)。
1. location对象(地址栏信息与导航)
核心作用
用于获取或修改浏览器地址栏的 URL 信息,是实现页面跳转、刷新、参数解析等导航功能的核心对象。
常用属性与语法
| 属性 |
含义 |
语法示例 |
应用场景 |
| href |
完整的 URL 地址(可读可写) |
window.location.href |
获取当前地址、实现页面跳转 |
| protocol |
协议(如 http:、https:) |
location.protocol |
判断协议类型,适配不同环境 |
| host |
主机名 + 端口号 |
location.host |
获取当前域名和端口信息 |
| search |
URL 中 ? 之后的查询参数字符串 |
location.search |
获取页面跳转时携带的参数(如 ?id=123) |
| hash |
URL 中 # 之后的锚点值 |
location.hash |
单页应用(SPA)路由控制、页面内锚点跳转 |
常用方法
location.assign(url):跳转到指定 URL,浏览器历史记录会新增一条,可以后退到上一页。
location.replace(url):跳转到指定 URL,并替换当前历史记录,无法后退到原页面。
location.reload():刷新当前页面。传入参数 true 表示强制刷新,忽略浏览器缓存。
案例演示(可直接运行)
// 1. 获取地址栏信息
console.log("完整URL:", location.href);
console.log("协议:", location.protocol);
console.log("查询参数:", location.search);
console.log("锚点:", location.hash);
// 2. 页面跳转
function jumpToBaidu() { location.href = "https://www.baidu.com"; }
function jumpWithAssign() { location.assign("https://www.jd.com"); }
function jumpWithReplace() { location.replace("https://www.taobao.com"); }
// 3. 刷新页面
function refreshPage() { location.reload(); }
// 4. 获取URL参数(实用函数)
function getUrlParam(name) {
var search = location.search.slice(1);
var paramArr = search.split("&");
for (var i = 0; i < paramArr.length; i++) {
var item = paramArr[i].split("=");
if (item[0] === name) return item[1];
}
return null;
}
// 示例:console.log(getUrlParam("id"));
2. history对象(浏览器历史记录)
核心作用
用于操作浏览器的历史记录栈,实现前进、后退、以及添加无刷新的历史记录,是构建单页应用导航和多步骤表单的关键。
常用方法与语法
| 方法 |
含义 |
语法示例 |
应用场景 |
| back() |
后退到上一页,等同于点击浏览器后退按钮 |
history.back() |
页面导航后退功能 |
| forward() |
前进到下一页,等同于点击浏览器前进按钮 |
history.forward() |
页面导航前进功能 |
| go(n) |
跳转到历史记录中指定位置的页面(n为数字) |
history.go(-1) |
灵活控制前进后退(正数前进,负数后退) |
| pushState() |
添加新的历史记录,且不刷新页面 |
history.pushState(state, title, url) |
单页面应用(SPA)实现无刷新路由跳转 |
案例演示
// 前进后退
function goBack() { history.back(); }
function goForward() { history.forward(); }
function goToPage(n) { history.go(n); }
// 单页应用添加历史记录
function addHistoryRecord() {
history.pushState({ id: 1 }, "", "/page1");
console.log("URL更新:", location.href);
}
// 监听历史记录变化
window.onpopstate = function(event) {
console.log("历史记录变化:", event.state);
};
3. navigator对象(浏览器信息)
核心作用
获取浏览器的基本信息,如类型、版本、操作系统、语言等。常用于浏览器适配、环境判断以及用户行为统计等场景。
常用属性与语法
| 属性 |
含义 |
语法示例 |
应用场景 |
| userAgent |
浏览器用户代理字符串(包含浏览器类型、版本、系统信息) |
navigator.userAgent |
判断浏览器类型(Chrome/Firefox/Edge)及设备类型(PC/移动端) |
| language |
浏览器的默认语言设置 |
navigator.language |
页面语言自动适配(如中英文切换) |
| onLine |
判断浏览器是否在线 |
navigator.onLine |
离线状态提示、离线存储功能适配 |
案例演示(判断浏览器类型与设备)
// 获取浏览器基础信息
console.log("用户代理:", navigator.userAgent);
console.log("浏览器语言:", navigator.language);
// 判断Chrome浏览器
function isChrome() {
return navigator.userAgent.indexOf("Chrome") > -1 && navigator.userAgent.indexOf("Edge") === -1;
}
// 判断移动端设备
function isMobile() {
var mobileReg = /Android|iPhone|iPad|iPod|BlackBerry|Windows Phone/i;
return mobileReg.test(navigator.userAgent);
}
// 监听网络状态
window.ononline = function() { alert("网络已连接"); };
window.onoffline = function() { alert("网络已断开"); };
4. screen对象(屏幕信息)
核心作用
获取用户设备屏幕的尺寸信息,这对于实现响应式布局、全屏功能或确保弹窗居中显示至关重要。
常用属性与语法
| 属性 |
含义 |
语法示例 |
应用场景 |
| width/height |
屏幕分辨率的宽度和高度(包含系统任务栏) |
screen.width |
获取屏幕总尺寸,适配不同分辨率显示器 |
| availWidth/availHeight |
可用屏幕的宽度和高度(不包含系统任务栏) |
screen.availHeight |
计算页面实际可展示区域的大小 |
案例演示(弹窗居中)
// 获取屏幕信息
console.log("屏幕分辨率:", screen.width + "x" + screen.height);
console.log("可用屏幕:", screen.availWidth + "x" + screen.availHeight);
// 弹窗居中逻辑
function showCenterDialog() {
var dialogW = 400, dialogH = 300;
var left = (screen.availWidth - dialogW) / 2;
var top = (screen.availHeight - dialogH) / 2;
console.log("弹窗位置:left=" + left + "px, top=" + top + "px");
}
showCenterDialog();
三、BOM核心功能实战
1. 弹出层(alert/confirm/prompt)
核心作用
浏览器内置的三种基础交互弹窗,分别用于信息提示、操作确认和获取用户输入。它们样式由浏览器控制,自定义能力有限,适用于简单的交互场景。
三种弹出层语法与场景
// 提示弹窗
function showAlert() { window.alert("操作成功!"); }
// 确认弹窗(危险操作)
function showConfirm() {
if (window.confirm("确定删除?")) {
console.log("执行删除");
} else {
console.log("取消删除");
}
}
// 输入弹窗(获取昵称)
function showPrompt() {
var username = window.prompt("请输入昵称:", "默认昵称");
if (username) window.alert("欢迎你," + username + "!");
}
这些弹窗方法实际属于 window 对象,只是我们通常省略了 window. 前缀。
2. 窗口尺寸与滚动控制
核心作用
获取浏览器窗口可视区域的尺寸,以及控制页面的滚动行为。这是实现响应式布局、“回到顶部”按钮、无限滚动加载等功能的基石。
常用语法与案例
// 获取窗口可视尺寸
function getWindowSize() {
var w = window.innerWidth || document.documentElement.clientWidth;
var h = window.innerHeight || document.documentElement.clientHeight;
return { width: w, height: h };
}
// 获取滚动距离
function getScrollOffset() {
var top = window.pageYOffset || document.documentElement.scrollTop;
var left = window.pageXOffset || document.documentElement.scrollLeft;
return { top: top, left: left };
}
// 平滑回到顶部
function scrollToTop() {
var timer = setInterval(function() {
var top = getScrollOffset().top;
if (top <= 0) return clearInterval(timer);
window.scrollTo(0, top - 50);
}, 16);
}
// 监听窗口大小变化
window.onresize = function() {
console.log("窗口尺寸:", getWindowSize());
};
3. 浏览器事件
核心作用
监听浏览器层面的事件,如页面加载完成、窗口关闭、滚动、缩放、网络变化等,从而触发相应的页面交互逻辑。
常用BOM事件与案例
// 页面加载完成
window.onload = function() {
console.log("页面已完全加载");
};
// 页面关闭/刷新
window.onunload = function() {
console.log("页面即将关闭");
};
// 页面滚动监听
window.onscroll = function() {
var top = getScrollOffset().top;
console.log("滚动距离:", top);
var btn = document.getElementById("topBtn");
if (btn) btn.style.display = top > 500 ? "block" : "none";
};
// 窗口缩放事件(resize)
// 作用:窗口尺寸改变时触发,适配响应式布局、元素重定位
window.onresize = function() {
var size = getWindowSize();
console.log("窗口尺寸变化:", size.width + "px × " + size.height + "px");
// 实战场景:窗口缩小时重新计算弹窗位置
showCenterDialog();
};
// 页面离开提示
window.onbeforeunload = function(event) {
event = event || window.event;
event.returnValue = "有未保存内容,确定离开?";
return event.returnValue;
};
4. 定时器(setTimeout/setInterval)
核心作用
实现代码的延迟执行或周期重复执行,是处理异步任务、创建动画效果、实现定时更新的核心工具。
两种定时器语法与区别
| 定时器类型 |
语法 |
含义 |
核心区别 |
| setTimeout |
setTimeout(fn, delay) |
延迟 delay 毫秒后执行一次 fn 函数 |
只执行一次,执行后自动失效 |
| setInterval |
setInterval(fn, delay) |
每隔 delay 毫秒重复执行 fn 函数 |
重复执行,必须手动清除才会停止 |
案例演示(含清除定时器)
// 延迟执行(3秒后提示)
var timer1 = setTimeout(function() {
alert("3秒后提示");
}, 3000);
// clearTimeout(timer1);
// 倒计时(10秒)
var count = 10;
var timer2 = setInterval(function() {
count--;
console.log("倒计时:" + count + "秒");
if (count <= 0) clearInterval(timer2);
}, 1000);
// 验证码倒计时
function countDown() {
var btn = document.getElementById("codeBtn");
var time = 60;
btn.disabled = true;
btn.innerHTML = time + "秒后重获";
var timer = setInterval(function() {
time--;
btn.innerHTML = time + "秒后重获";
if (time <= 0) {
clearInterval(timer);
btn.disabled = false;
btn.innerHTML = "重新获取";
}
}, 1000);
}
5. 同步与异步讲解(结合BOM)
核心概念
JavaScript 是单线程语言,代码执行顺序分为同步和异步。BOM 中的定时器、网络请求等都属于异步任务,理解这两者的区别是掌握 JavaScript 执行机制的关键。
- 同步任务:按照代码书写顺序依次执行,前一个任务完成才会执行后一个,会阻塞后续代码(如变量声明、函数调用、循环等)。
- 异步任务:不会阻塞后续代码。它们会被放入异步任务队列,等待当前所有同步任务都执行完毕后,再按顺序从队列中取出执行(如定时器回调、事件监听、AJAX请求)。
案例演示(理解执行顺序)
// 同步任务
console.log("同步任务1执行");
console.log("同步任务2执行");
// 异步任务(延迟0毫秒仍异步)
setTimeout(function() {
console.log("异步任务执行");
}, 0);
// 多个异步任务顺序
setTimeout(function() { console.log("异步任务1"); }, 1000);
setTimeout(function() { console.log("异步任务2"); }, 500);
// 执行结果:同步1 → 同步2 → 异步任务执行 → 异步任务2 → 异步任务1
6. 窗口控制(打开/关闭/聚焦)
核心作用
控制浏览器窗口的打开、关闭、聚焦与失焦。常用于新页面跳转、弹窗应用或多窗口交互场景(请注意,现代浏览器对此有较严格的安全策略限制)。
常用方法与案例
// 打开居中新窗口
function openNewWindow() {
var w = 800, h = 600;
var left = (screen.availWidth - w) / 2;
var top = (screen.availHeight - h) / 2;
var features = "width=" + w + ",height=" + h + ",left=" + left + ",top=" + top;
return window.open("https://www.baidu.com", "_blank", features);
}
var newWin = openNewWindow();
// 关闭窗口
function closeWindow(win) {
if (win && win.close) win.close();
}
// 窗口聚焦/失焦
function focusWindow(win) { if (win) win.focus(); }
function blurWindow(win) { if (win) win.blur(); }
// 监听窗口焦点变化
window.onfocus = function() { console.log("窗口获得焦点"); };
window.onblur = function() { console.log("窗口失去焦点"); };
四、BOM常见兼容性问题与注意事项
- 兼容性:对旧版本浏览器(如 IE)需要做兼容处理,例如窗口尺寸的获取、
resize 事件的监听等,建议封装成兼容性函数。
- 安全限制:浏览器对跨域访问其他窗口的 BOM 对象有严格限制,部分行为(如自动弹窗)也可能被浏览器拦截。
- 定时器精度:
setTimeout 和 setInterval 的延迟时间并非绝对精确,受系统负载影响,不适用于高精度计时场景。
- 内存泄漏:务必及时清除不再需要的定时器 (
clearTimeout, clearInterval) 和事件监听器,避免造成内存占用过高。
- 移动端适配:移动端设备的
userAgent 和屏幕尺寸获取方式可能有所不同,需要单独进行适配处理。
五、总结与学习建议
BOM 是 JavaScript 与浏览器环境交互的核心。本文系统讲解了 location、history、navigator、screen 等核心子对象,以及弹出层、窗口控制、定时器和异步机制等关键功能,每个知识点都配有可直接运行的代码示例,旨在帮助你理解其在实际 前端开发 中的应用。
学习建议:
- 动手实践:在浏览器控制台中运行本文的每一个案例,观察效果,尤其是异步任务和定时器的执行顺序,这能加深你对 JavaScript 事件循环机制的理解。
- 整合应用:尝试将 BOM 知识与之前学到的 DOM 操作结合起来,例如用定时器实现轮播图动画,或用
location.search 获取参数后动态渲染页面内容。
- 打好基础:重点理解同步/异步机制和定时器,这是后续深入学习 AJAX、
Promise、async/await 等现代异步编程概念的基石。
- 关注兼容:在实际开发中养成封装兼容性函数的习惯,让你的代码能更好地适应不同的浏览器和环境。
希望这份详细的 BOM 指南能成为你前端学习路上的实用参考。如果你想与其他开发者交流心得或获取更多学习资源,欢迎访问 云栈社区 的相关板块进行探讨。