BOM常见对象及其使用JS操作
BOM(Browser Object Model,浏览器对象模型)是 JavaScript
操作浏览器功能的接口,它以 window 为核心
window是整个BOM树食物链的顶端,因此每一个新打开的窗口,都被认为是一个window对象。
window 是 BOM 的顶层对象,代表整个浏览器窗口,所有 BOM
对象都是 window 的属性。
- 全局变量和全局函数会自动成为
window的属性(例如window.alert()可简写为alert())。 window可省略(如window.location可简写为location)。
window.location:控制地址栏与页面跳转
location 对象管理当前页面的 URL 信息,可用于获取 URL
细节或跳转页面。
| 属性 / 方法 | 说明 |
|---|---|
href |
获取或设置完整 URL(最常用,用于页面跳转)。 |
protocol |
协议(如 http:、https:)。 |
host |
主机名 + 端口(如 www.baidu.com:80)。 |
hostname |
主机名(如 www.baidu.com)。 |
pathname |
URL 中的路径(如 /search)。 |
search |
URL 中的查询字符串(如 ?id=1&name=test)。 |
hash |
URL 中的哈希(锚点,如
#top,常用于单页应用路由)。 |
reload() |
刷新当前页面(参数 true
表示强制从服务器刷新,不使用缓存)。 |
assign(url) |
跳转到指定 URL(会在历史记录中添加新记录,可后退)。 |
replace(url) |
跳转到指定 URL(替换当前历史记录,不可后退到原页面)。 |
origin |
协议 + 主机名 + 端口(只读属性,无法修改) |
1 | // 获取当前 URL |
location 对象演示
当前 URL:
协议:
主机名:
window.history:操作浏览器历史记录
history
对象管理浏览器的访问历史,可实现前进、后退等操作(类似浏览器的 “前进 /
后退” 按钮)。
| 方法 / 属性 | 说明 |
|---|---|
length |
历史记录的数量(当前页面为起点,包含前进和后退的页面数)。 |
back() |
后退一页(相当于点击浏览器 “后退” 按钮)。 |
forward() |
前进一页(相当于点击浏览器 “前进” 按钮)。 |
go(n) |
跳转到历史记录中第 n 个页面(n=1
前进一页,n=-1 后退一页,n=0 刷新)。 |
1 | // 查看历史记录数量 |
history 对象演示
历史记录数量:
window.navigator:获取浏览器与设备信息
navigator
对象包含浏览器的标识信息(如浏览器类型、版本、设备类型等),常用于做浏览器兼容性处理或设备判断。
| 常用属性 | 说明 |
|---|---|
userAgent |
浏览器的用户代理字符串(包含浏览器类型、版本、操作系统等信息)。 |
platform |
运行浏览器的操作系统平台(如
Win32、MacIntel、Linux x86_64)。 |
appName |
浏览器名称(现代浏览器多返回
Netscape,兼容性差,少用)。 |
appVersion |
浏览器版本信息(包含内核版本等)。 |
language |
浏览器的默认语言(如 zh-CN、en-US)。 |
onLine |
布尔值,表示浏览器是否联网(true
为在线,false 为离线)。 |
1 | // 判断是否为移动设备(通过 userAgent 包含手机关键词) |
navigator 对象演示
<script> function showNavigatorInfo() { const info = ` <p>浏览器信息: ${navigator.userAgent}</p> <p>平台: ${navigator.platform}</p> <p>语言: ${navigator.language}</p> <p>是否在线: ${navigator.onLine ? '是' : '否'}</p> <p>是否为移动设备: ${/Mobile|Android|iPhone/.test(navigator.userAgent) ? '是' : '否'}</p> `; document.getElementById('navigatorInfo').innerHTML = info; } </script> </div>
window.screen:获取屏幕信息
screen
对象包含用户设备屏幕的信息(如分辨率、可用区域等),常用于适配不同屏幕尺寸。
| 常用属性 | 说明 |
|---|---|
width |
屏幕的总宽度(像素)。 |
height |
屏幕的总高度(像素)。 |
availWidth |
屏幕的可用宽度(总宽度 - 系统任务栏等占用的宽度)。 |
availHeight |
屏幕的可用高度(总高度 - 系统任务栏等占用的高度)。 |
colorDepth |
屏幕的颜色深度(如 24 表示支持 24 位真彩色)。 |
1 | // 获取屏幕分辨率 |
screen 对象演示
<script> function showScreenInfo() { const info = ` <p>屏幕分辨率: ${screen.width} × ${screen.height}</p> <p>可用屏幕区域: ${screen.availWidth} × ${screen.availHeight}</p> <p>颜色深度: ${screen.colorDepth} 位</p> `; document.getElementById('screenInfo').innerHTML = info; } </script> </div>
window.frames:访问框架页面的窗口对象
window.frames 是一个类数组对象,用于访问当前页面中所有
<frame> 或 <iframe>
标签对应的子窗口(window
对象)。每个框架(<frame>/<iframe>)都是一个独立的窗口环境,拥有自己的
document、location 等对象。
- 框架(Frame):指
<frame>或<iframe>标签,用于在当前页面中嵌入另一个 HTML 文档(子页面)。 frames与框架的对应关系:window.frames的索引或名称与页面中框架的顺序或name属性一一对应。例如,第一个<iframe>对应frames[0],name="frame1"的框架对应frames['frame1']。
| 属性 / 访问方式 | 说明 | 示例 |
|---|---|---|
frames[index] |
通过索引访问子框架(按页面中
<frame>/<iframe> 出现的顺序,从 0
开始)。 |
const firstFrame = window.frames[0];(获取第一个框架的窗口对象) |
frames[name/id] |
通过框架的 name 或 id
属性访问(更直观,推荐使用)。 |
<iframe name="userFrame" id="userFrame"> →
frames['userFrame'] |
length |
返回当前页面中框架的总数(<frame> 和
<iframe> 都算)。 |
console.log(frames.length);(输出框架数量,无框架则为
0) |
self |
指向当前窗口自身(若在主页面,self === window;若在子框架,self
是子窗口)。 |
frame.self.document(等价于
frame.document,访问子框架文档) |
parent |
指向当前窗口的直接父窗口(子框架中使用,主页面的
parent === self)。 |
子框架中:parent.document(访问主页面文档) |
top |
指向最顶层窗口(无论嵌套多少层框架,top
始终是主页面窗口)。 |
多层嵌套框架中:top.document(穿透所有层级,访问最外层主页面) |
1 | <!-- parent.html --> |
弹窗相关方法(window
直接提供)
浏览器提供了几个原生弹窗方法,用于简单的交互(但样式固定,体验一般,实际开发中多自定义弹窗)。
| 方法 | 说明 |
|---|---|
alert(message) |
显示警告弹窗(只有 “确定” 按钮)。 |
confirm(message) |
显示确认弹窗(有 “确定” 和 “取消” 按钮,返回布尔值
true/false)。 |
prompt(message, default) |
显示输入弹窗(可输入内容,返回输入的字符串或
null)。 |
1 | // 警告弹窗 |
弹窗方法演示
<script> function showConfirm() { const result = confirm('你确定要执行这个操作吗?'); document.getElementById('dialogResult').textContent = `确认结果: ${result ? '确定' : '取消'}`; } function showPrompt() { const name = prompt('请输入你的名字:', '张三'); if (name !== null) { document.getElementById('dialogResult').textContent = `你输入的名字是: ${name}`; } else { document.getElementById('dialogResult').textContent = '你取消了输入'; } } </script> </div>
window
其他常用属性与方法
| 功能 | 说明 |
|---|---|
| 窗口尺寸 | innerWidth/innerHeight:浏览器窗口的内部宽度
/
高度(包含滚动条)。outerWidth/outerHeight:浏览器窗口的外部宽度
/ 高度(包含边框)。 |
| 滚动控制 | scrollTo(x, y):滚动到页面指定坐标。scrollBy(x, y):相对当前位置滚动指定距离。 |
| 定时器 | setTimeout(fn, delay):延迟 delay
毫秒后执行
fn(只执行一次)。setInterval(fn, interval):每隔
interval 毫秒执行一次
fn(重复执行)。clearTimeout(timer)/clearInterval(timer):清除定时器。 |
1 | // 获取窗口内部宽度(可视区域宽度) |
窗口控制演示
<script> function showWindowSize() { const info = ` <p>窗口内部宽度: ${window.innerWidth}px</p> <p>窗口内部高度: ${window.innerHeight}px</p> `; document.getElementById('windowInfo').innerHTML = info; } function scrollToTop() { window.scrollTo(0, 0); } </script> </div>
定时器演示
<script> let intervalId; function startTimeout() { document.getElementById('timerResult').textContent = '3秒后将显示提示...'; setTimeout(() => { document.getElementById('timerResult').textContent = '3秒时间到!'; }, 3000); } function startInterval() { let count = 0; intervalId = setInterval(() => { count++; document.getElementById('timerResult').textContent = `计数器: ${count}秒`; }, 1000); } function stopInterval() { clearInterval(intervalId); document.getElementById('timerResult').textContent = '计数器已停止'; } </script> </div>
JS操作BOM对象
JS操作window.location
location 对象的属性对应 URL
的各个组成部分,所有属性都可读写(修改属性会触发页面跳转或
URL 变化)。
以
https://www.example.com:8080/path?name=test&id=1#top
为例
1 | // 1. 获取 URL 各部分信息 |
location 提供了三个方法用于主动控制页面行为,与修改
href 不同,这些方法有更具体的场景用途。
| 方法名 | 说明 | 与 href 的区别 |
|---|---|---|
assign(url) |
跳转到指定 URL,会在浏览器历史记录中添加新记录(支持 “后退” 返回原页面) | 等价于 location.href = url,但语义更清晰(明确表示
“导航到新页面”) |
replace(url) |
跳转到指定 URL,替换当前历史记录(无法 “后退” 返回原页面) | 适合不需要保留原页面历史的场景(如登录后跳转,避免后退回到登录页) |
reload(force) |
刷新当前页面,force 为布尔值(可选) |
force=true:强制从服务器刷新(忽略缓存);force=false(默认):优先使用缓存 |
1 | // 1. 普通跳转(可后退) |
解析URL参数是最常用的,因为location.search 包含 URL
中的查询参数(如
?name=test&id=1),需手动解析为对象才方便使用
1 | function getUrlParams() { |
强制使用 HTTPS 协议也是常用的,通过修改 protocol 实现
HTTP 到 HTTPS 的跳转:
1 | if (location.protocol !== "https:") { |
当 URL 包含中文、空格等特殊字符时,需用
encodeURIComponent() 编码,避免解析错误
1 | const name = "张三"; |
JS操作window.history
基础操作
操作的时候,history
对象仅有一个常用的属性,length,它返回当前会话中历史记录的总条数(包含当前页面,以及可前进
/ 后退的页面)。
1 | // 假设用户从 A 页 → B 页 → 当前页(C 页) |
其中,length 仅反映当前会话的历史记录数,无法获取具体的
URL 或内容
| 方法名 | 说明 | 示例(假设当前在历史记录的第 N 条) |
|---|---|---|
back() |
后退到上一条历史记录(等价于浏览器 “后退” 按钮)。 | 从 N → N-1 条记录 |
forward() |
前进到下一条历史记录(等价于浏览器 “前进” 按钮)。 | 从 N → N+1 条记录(若存在) |
go(n) |
跳转到历史记录中相对于当前位置的第 n
条记录(n 为整数)。 |
go(-1) 等价于 back(),go(1)
等价于 forward(),go(0) 等价于刷新页面 |
1 | // 后退一页(如从详情页回到列表页) |
无刷新路由
HTML5 为 history 新增了 pushState() 和
replaceState()
方法,允许开发者在不刷新页面的情况下修改浏览器地址栏 URL
并操作历史记录,这是单页应用(SPA)实现无刷新路由的核心技术。
history.pushState(state, title, url)功能:向历史记录中添加一条新记录,同时修改地址栏 URL,但不会触发页面刷新。
参数说明:
state:一个与新记录关联的状态对象(可在popstate事件中获取),容量上限约 640KB。title:新记录的标题(目前主流浏览器基本忽略此参数,通常传空字符串)。url:新的 URL(必须与当前页面同源,否则会报错),可为相对路径或绝对路径。
history.replaceState(state, title, url)功能:替换当前历史记录(而非新增),其他行为与
pushState()一致。适用场景:修改当前页面的 URL 但不希望增加历史记录(如更新页面参数后不保留原参数的历史)。
注意,他们存在同源限制,pushState() 和
replaceState() 的 url
参数必须与当前页面同源(协议、域名、端口一致),否则会抛出
SecurityError。
1 | <!-- 单页应用中,点击导航切换内容,URL 同步变化但不刷新页面 --> |
popstate
事件(监听历史记录变化)
当用户通过
back()、forward()、go()
方法或浏览器的前进 / 后退按钮切换历史记录时,会触发名为
popstate 的事件。
- 注意:
pushState()和replaceState()方法不会触发popstate事件,只有用户主动切换历史记录时才会触发。
1 | // 监听历史记录变化 |
结合前面的示例,当用户点击浏览器 “后退” 按钮时,popstate
事件会触发,页面内容会自动切换到上一个历史记录对应的页面,实现与 URL
同步的无刷新导航。
JS操作 window.screen
screen
对象的属性均为只读属性,用于获取屏幕的各种物理或可用信息
所以说。。。。。怎么操作
但是获取他们并自己做出决定就足矣,这是移动端适配的核心
screen.orientation
是一个专门用于获取和控制屏幕方向的对象(部分移动浏览器支持方向锁定),其核心属性和方法如下:
| 属性 / 方法 | 说明 |
|---|---|
type |
屏幕方向类型,常见值:landscape-primary(主横屏)、landscape-secondary(副横屏,倒转)、portrait-primary(主竖屏)、portrait-secondary(副竖屏,倒转)。 |
angle |
屏幕旋转角度(0°、90°、180°、270°),与 type
对应(如横屏通常为 0° 或 180°)。 |
lockOrientation(方向) |
锁定屏幕方向(仅部分移动浏览器支持,如 Chrome
移动版),参数为方向类型(如 "landscape" 锁定横屏)。 |
unlockOrientation() |
解除屏幕方向锁定。 |
那么假如我们需要监听屏幕方向变化,就可以这么写
1 | // 监听屏幕方向变化事件 |
通过屏幕信息判断当前窗口是否全屏,也是最常用的了,配合
requestFullscreen() 实现全屏功能:
1 | // 全屏按钮点击事件 |
根据屏幕可用区域,让弹窗居中显示(避免超出屏幕范围)
1 | function showCenterDialog() { |
这三个都是巨有用的东西







