「前端必修」BOM 全面解析:从 window 到 history 的完整指南

BOM(Browser Object Model)是浏览器提供的一组 API,用于操作浏览器窗口本身。它不是 ECMAScript 语言标准的一部分,而是浏览器厂商扩展出来的功能。常见的核心对象包括:

  • window
  • location
  • navigator
  • screen
  • history

1. window 对象

window 是 BOM 的核心对象,表示当前浏览器窗口或框架。

在浏览器中,window 也作为全局对象存在。所有全局变量和函数都属于 window

常见属性和方法:

javascript 复制代码
console.log(window.innerWidth, window.innerHeight); 
// 浏览器可视区域宽高(不包括菜单栏、工具栏)

console.log(window.location.href); 
// 当前页面的 URL 地址

window.alert("Hello, BOM"); 
// 系统对话框(警告框)

2. Global 作用域

在全局作用域中,var 声明的变量会自动挂载到 window 对象;

letconst 不会。

ini 复制代码
var a = 10;
let b = 20;

console.log(window.a); // 10
console.log(window.b); // undefined

3. 窗口关系

  • window.self:始终指向当前窗口。
  • window.top:指向最顶层窗口(即使嵌套在 iframe 中)。
  • window.parent:指向当前窗口的父级窗口。
javascript 复制代码
if (window.top !== window.self) {
  console.log("当前页面在 iframe 中");
}

4. 窗口位置与像素比

  • devicePixelRatio 表示 物理像素 / CSS 像素 的比率。

    • 普通屏幕:1
    • Retina 屏幕:2 或 3
javascript 复制代码
console.log(window.devicePixelRatio); 
// 例如 2,表示 1 个 CSS 像素 = 2 个物理像素

是否能设置?

不能直接修改 devicePixelRatio,但可以通过 <meta> 标签影响缩放:

ini 复制代码
<meta name="viewport" content="width=device-width, initial-scale=1.0">

5. 窗口大小与位置

常见属性:

  • innerWidth / innerHeight:可视区域大小。
  • outerWidth / outerHeight:包括浏览器工具栏的窗口总大小。
  • screenX / screenY:窗口左上角相对于屏幕的坐标。

设置窗口大小(仅对新窗口有效):

ini 复制代码
let win = window.open("about:blank", "test", "width=400,height=300");
win.resizeTo(600, 400); // 调整窗口大小
win.moveTo(100, 100);   // 移动到屏幕坐标 (100, 100)

6. 导航与打开新窗口

(1) 弹出窗口

javascript 复制代码
let popup = window.open(
  "https://example.com", 
  "myWin", 
  "width=500,height=400,resizable=yes"
);

(2) 安全限制

现代浏览器禁止非用户交互时的 window.open

必须由 用户点击事件 触发:

dart 复制代码
document.querySelector("#btn").onclick = () => {
  window.open("https://openai.com");
};

(3) 弹窗拦截

  • Chrome/Firefox 内置 弹窗屏蔽,自动弹出的窗口会被阻止。

7. 定时器

  • setTimeout(fn, ms):延时执行一次。
  • setInterval(fn, ms):循环执行。
  • clearTimeout(id) / clearInterval(id):取消定时器。
javascript 复制代码
let t1 = setTimeout(() => console.log("延时一次"), 1000);
let t2 = setInterval(() => console.log("循环执行"), 2000);

clearTimeout(t1);
clearInterval(t2);

8. 系统对话窗

  • alert(msg):提示框。
  • confirm(msg):确认框,返回 true/false
  • prompt(msg, default):输入框,返回用户输入或 null
  • print():打开打印对话框。
  • find():查找对话框(部分浏览器支持)。
erlang 复制代码
alert("这是提示框");

if (confirm("确定吗?")) {
  let name = prompt("请输入名字:", "默认值");
  console.log("输入内容:", name);
}

window.print(); // 打印当前页面

9. location 对象

location 表示当前页面的 URL 信息。

常见属性:

arduino 复制代码
console.log(location.href);      // 完整 URL
console.log(location.protocol);  // 协议,如 https:
console.log(location.hostname);  // 主机名
console.log(location.pathname);  // 路径部分
console.log(location.search);    // 查询字符串,如 ?id=123
console.log(location.hash);      // 锚点部分,如 #top

(1) 查询字符串

csharp 复制代码
let params = new URLSearchParams(location.search);
console.log(params.get("id")); // 获取 ?id=123 中的 123

10. 操作地址

assign()

跳转到新地址,保留历史记录

arduino 复制代码
location.assign("https://example.com");

replace()

跳转到新地址,不保留当前页面历史记录(无法后退)。

vbscript 复制代码
location.replace("https://example.com");

reload()

刷新页面:

ruby 复制代码
location.reload();     // 普通刷新(可能使用缓存)
location.reload(true); // 强制刷新(部分浏览器废弃 true 参数)

提供浏览器和系统信息:

arduino 复制代码
console.log(navigator.userAgent); // 浏览器 UA
console.log(navigator.language);  // 用户语言
console.log(navigator.onLine);    // 是否联网
console.log(navigator.platform);  // 操作系统平台

12. 检测插件

javascript 复制代码
for (let plugin of navigator.plugins) {
  console.log(plugin.name, plugin.filename, plugin.description);
}

13. 注册协议处理程序

ruby 复制代码
navigator.registerProtocolHandler(
  "web+chat", 
  "https://example.com/?msg=%s", 
  "My Chat App"
);
// 当用户访问 web+chat://hello 时,会跳转到
// https://example.com/?msg=hello

14. screen 对象

提供屏幕信息:

arduino 复制代码
console.log(screen.width, screen.height);     // 屏幕分辨率
console.log(screen.availWidth, screen.availHeight); // 可用分辨率
console.log(screen.colorDepth); // 每像素颜色位数

15. history 对象

(1) 导航

scss 复制代码
history.back();    // 相当于点击后退
history.forward(); // 相当于点击前进
history.go(-1);    // 后退 1 步
history.go(2);     // 前进 2 步

16. 历史状态管理

HTML5 提供了 pushState()replaceState() 用于 单页应用(SPA)的历史管理。

javascript 复制代码
history.pushState({page: 1}, "标题1", "?page=1"); 
// 添加一条历史记录(不会刷新页面)

history.replaceState({page: 2}, "标题2", "?page=2"); 
// 替换当前历史记录(不会新增)

window.onpopstate = (event) => {
  console.log("用户点击返回/前进:", event.state);
};
相关推荐
IT_陈寒3 分钟前
Redis性能提升50%的7个关键优化策略,90%开发者都不知道第5点!
前端·人工智能·后端
Hilaku10 分钟前
深入URL和URLSearchParams:别再用正则表达式去折磨URL了
前端·javascript·代码规范
pubuzhixing15 分钟前
Canvas 的性能卓越,用它解决一个棘手问题
前端
weixin_4569042716 分钟前
Vue.jsmain.js/request.js/user.js/store/index.js Vuex状态管理项目核心模块深度解析
前端·javascript·vue.js
伍哥的传说19 分钟前
Vue 3.6 Alien Signals:让响应式性能飞跃式提升
前端·javascript·vue.js·vue性能优化·alien-signals·细粒度更新·vue 3.6新特性
永日4567024 分钟前
学习日记-HTML-day51-9.9
前端·学习·html
狗头大军之江苏分军40 分钟前
iPhone 17 vs iPhone 17 Pro:到底差在哪?买前别被忽悠了
前端
小林coding40 分钟前
再也不怕面试了!程序员 AI 面试练习神器终于上线了
前端·后端·面试
文心快码BaiduComate1 小时前
WAVE SUMMIT深度学习开发者大会2025举行 文心大模型X1.1发布
前端·后端·程序员
babytiger1 小时前
python 通过selenium调用chrome浏览器
前端·chrome