当前位置: 首页 > news >正文

BOM 核心对象

系列文章目录

《JavaScript 基础与进阶笔记》(前期偏基础巩固与常见面试点,后续进入闭包、异步、工程化等进阶主题)

  • 第 01 篇:数据类型与类型判断
  • 第 02 篇:变量声明与作用域
  • 第 03 篇:闭包与高阶函数
  • 第 04 篇:函数工厂
  • 第 05 篇:this 指向与绑定
  • 第 06 篇:原型与原型链
  • 第 07 篇:类与继承
  • 第 08 篇:JS 执行机制与异步队列
  • 第 09 篇:数组常用方法
  • 第 10 篇:字符串算法
  • 第 11 篇:常见手写题合集(上)
  • 第 12 篇:常见手写题合集(下)
  • 第 13 篇:Promise 与 async/await
  • 第 14 篇:数据结构基础
  • 第 15 篇:垃圾回收与内存
  • 第 16 篇:DOM 基础全面解析
  • 第 17 篇:DOM 性能与渲染
  • 第 18 篇:DOM 交互补充
  • 第 19 篇:DOM 实战案例
  • 第 20 篇:CSS 布局与可视化高频
  • 第 21 篇:移动端与 viewport
  • 第 22 篇:BOM 核心对象(本文)

文章目录

  • 系列文章目录
  • 前言
  • 一、BOM 与 DOM 的关系
  • 二、window
    • 2.1 尺寸与滚动
    • 2.2 对话框与开窗
    • 2.3 定时器(与第 8 篇事件循环衔接)
    • 2.4 事件
  • 三、location
    • 3.1 常用属性
    • 3.2 导航方法
  • 四、navigator
    • 4.1 常用属性
    • 4.2 能力检测(推荐)
    • 4.3 其他(了解)
  • 五、history
    • 5.1 基础 API
    • 5.2 pushState / replaceState(SPA 核心)
    • 5.3 popstate(面试高频)
  • 六、screen 与 document(简要)
  • 七、易混淆点归纳
  • 八、思考与练习
  • 总结

前言

DOM管页面节点;BOM(Browser Object Model,浏览器对象模型)管浏览器窗口与环境——地址栏 URL、前进后退、设备信息、定时器等。日常与面试最高频的四个对象:windowlocationnavigatorhistory。本篇按对象展开常用 API 与易混点;pushState与 SPA 路由的完整串联放在下一篇「前端路由原理」。


一、BOM 与 DOM 的关系

window(全局对象 + BOM 根) ├── document → DOM 根(HTML 文档) ├── location → 当前 URL ├── navigator → 浏览器/设备信息 ├── history → 会话历史栈 ├── screen → 屏幕信息 └── setTimeout / alert / open …(挂在 window 上的全局 API)
  • 浏览器中window既是BOM 顶层,也是JS 全局对象(非严格模式下,全局变量即window属性)。
  • documentwindow的子对象,代表 DOM;第 16 篇已详述 DOM API。
  • 说「操作 BOM」常指改 URL、读 UA、控制历史记录等与页面内容无关的浏览器能力

二、window

2.1 尺寸与滚动

属性 / 方法含义
innerWidth/innerHeight视口宽高(含滚动条,不含浏览器工具栏)
outerWidth/outerHeight整个浏览器窗口外框
devicePixelRatio物理像素 / CSS 像素(第 21 篇)
scrollX/scrollY页面已滚动距离(别名pageXOffset/pageYOffset
scrollTo(x, y)滚动到指定位置
scrollBy(dx, dy)相对当前再滚一段
// 滚动到底部(内容高度 - 视口高度)consttoBottom=()=>{window.scrollTo({top:document.documentElement.scrollHeight-window.innerHeight,behavior:"smooth",});};

2.2 对话框与开窗

window.alert("提示");constok=window.confirm("确认删除?");constname=window.prompt("请输入姓名","默认值");// 新窗口(常被拦截);noopener 防 tabnabbingconstw=window.open("https://example.com","_blank","noopener,noreferrer");

2.3 定时器(与第 8 篇事件循环衔接)

constid=setTimeout(()=>console.log("一次"),1000);clearTimeout(id);constid2=setInterval(()=>console.log("重复"),1000);clearInterval(id2);

setTimeout回调是宏任务;精度受主线程阻塞影响,不能当精确时钟。

2.4 事件

window.addEventListener("load",()=>{/* 资源(含图片)加载完 */});window.addEventListener("DOMContentLoaded",()=>{/* DOM 树解析完,不必等图片 */});window.addEventListener("resize",onResize);window.addEventListener("scroll",onScroll,{passive:true});

load晚于DOMContentLoaded。滚动监听建议passive: true(第 18 篇),提示浏览器不会preventDefault,利于性能。


三、location

location描述当前文档 URL,既可读也可写(赋值会导航)。

3.1 常用属性

假设 URL:https://example.com:8080/path/page?id=1&tab=2#section

属性
href完整 URL
protocolhttps:
hostexample.com:8080
hostnameexample.com
port8080
pathname/path/page
search?id=1&tab=2
hash#section
originhttps://example.com:8080
constparams=newURLSearchParams(location.search);params.get("id");// "1"params.set("tab","3");constnewUrl=`${location.pathname}?${params.toString()}${location.hash}`;history.replaceState(null,"",newUrl);// 改参不刷新(见 §五)

3.2 导航方法

方法行为
location.assign(url)跳转,可后退
location.replace(url)跳转,替换当前历史,不可后退
location.reload()刷新;reload(true)强制跳过缓存(已废弃写法,了解即可)
location.href="https://example.com/login";// 等价 assign,会导航

易混:改location.hash会触发hashchange(Hash 路由用);改pathname整页刷新,除非配合 History API。


四、navigator

navigator提供浏览器与运行环境信息(只读为主)。

4.1 常用属性

navigator.userAgent;// UA 字符串(勿单独做可靠检测)navigator.language;// 如 "zh-CN"navigator.languages;// 偏好语言列表navigator.onLine;// 是否联网(不一定准)navigator.platform;// 已废弃倾向,少依赖navigator.cookieEnabled;

4.2 能力检测(推荐)

与其解析 UA,不如测 API 是否存在:

constcanShare="share"innavigator;constcanClipboard="clipboard"innavigator;constcanGeolocation="geolocation"innavigator;if(canGeolocation){navigator.geolocation.getCurrentPosition((pos)=>console.log(pos.coords),(err)=>console.error(err.code));}

4.3 其他(了解)

  • navigator.clipboard.writeText():剪贴板,需 HTTPS 或 localhost,常需用户手势。
  • navigator.mediaDevices.getUserMedia():摄像头/麦克风。
  • navigator.serviceWorker:PWA,系列后续篇讲。

五、history

history管理同文档会话内的历史栈(前进/后退)。

5.1 基础 API

history.length;// 栈深度(含当前页,跨域页不可读详情)history.back();// 等价 history.go(-1)history.forward();history.go(-2);// 后退两页

5.2 pushState / replaceState(SPA 核心)

// 入栈:URL 变,不刷新;state 对象供 popstate 读取history.pushState({page:1},"","/users/1");// 替换当前条:不增加历史条数history.replaceState({page:1},"","/users/1");
方法历史栈是否刷新
pushState新增一条
replaceState替换当前条
location.assign新增(整页导航)

三个参数state(任意可结构化克隆对象)、title(多数浏览器忽略)、url同源且一般仅改 path/search/hash)。

5.3 popstate(面试高频)

window.addEventListener("popstate",(e)=>{console.log(e.state);// 对应该历史条目的 state;首屏常为 nullrenderRoute(location.pathname);});

关键

  1. pushState/replaceState不会触发popstate
  2. popstate在用户点击前进/后退,或代码history.back()/go()时触发。
  3. 因此 SPA 里:主动pushState后要自己更新视图;只有回退/前进时才靠popstate同步。
functionnavigate(path,state){history.pushState(state,"",path);renderRoute(path);// 必须手动渲染}window.addEventListener("popstate",()=>{renderRoute(location.pathname);// 浏览器后退时同步});

Hash 路由用hashchange而非popstate;对比见第 23 篇。


六、screen 与 document(简要)

screen.width;// 屏幕宽(设备像素逻辑值,因设备而异)screen.height;screen.availWidth;// 排除任务栏等document.title;// 改标签页标题document.hidden;// Page Visibility,标签是否隐藏document.visibilityState;// "visible" | "hidden" | "prerender"

标签页切到后台时可暂停动画、轮询,节省资源。


七、易混淆点归纳

  1. window= 全局对象var声明的全局变量是其属性;let/const全局不在window上。
  2. innerWidth是视口;screen.width是整个屏幕,二者不同。
  3. location.href = url会跳转;仅改参不刷新用history.replaceState+URLSearchParams
  4. pushState不触发popstate;手动改 URL 后要自己 render
  5. replaceStatevspushState:前者不增加「后退」步数,适合登录后跳首页。
  6. Hash(#变更走hashchangeHistory API改 path 走pushState+ popstate
  7. UA 嗅探不可靠;用特性检测'geolocation' in navigator)。

八、思考与练习

1.BOM 和 DOM 分别管什么?

解析:BOM管浏览器窗口与环境(URL、历史、navigator 等);DOM管文档节点树(document及元素 API)。

2.history.pushState({}, "", "/about")后页面会刷新吗?会触发popstate吗?

解析:不刷新不触发popstate。需自行更新视图;用户点后退时才触发popstate

3.location.replacelocation.assign区别?

解析:replace替换当前历史记录,不能后退回到原页;assign可后退。

4.https://a.com/list?page=2只把 query 改成page=3且不刷新,怎么做?

解析:URLSearchParams改参 +history.pushStatereplaceState更新 URL,再自行拉取第 3 页数据。

5.为什么 scroll 监听建议{ passive: true }

解析:告诉浏览器回调里不会preventDefault,可优化滚动性能(不阻塞合成线程等待 JS)。


总结

  • window:视口尺寸、滚动、定时器、全局事件(load / scroll / resize)。
  • location:URL 解析与跳转;改参不刷新配合History API
  • navigator:环境信息;优先特性检测而非 UA 字符串。
  • historypushState/replaceState改 URL 不刷新;popstate仅前进/后退时触发,SPA 需双向同步视图。

下一篇讲前端路由原理:Hash 与 History 模式、刷新 404 与服务端 fallback(系列第 23 篇)。

http://www.jsqmd.com/news/904894/

相关文章:

  • Arduino生日音乐盒制作:从硬件选型到代码调试全解析
  • 【限时解禁】Sora 2多角色视频生成私有Prompt语法手册(OpenAI内部培训PPT第47–89页原图直出)
  • 手把手教你学Simulink——UPS系统中双向DC-AC逆变器的并联均流控制仿真
  • 推荐1款提升办公效率的神级软件,简真是Windows神器!
  • 【 linux 】认识make和makefile
  • 2026年4月高架库定做厂家有哪些,自动化立体仓库/高架库/立体仓储/智能仓库/智能仓储/立体仓库,高架库优质厂家推荐 - 品牌推荐师
  • 6.1 机器学习概述
  • 效率直接起飞!2026年真正好用的专业AI论文平台
  • FastbootEnhance:告别复杂命令行,Windows上最直观的Android设备管理工具
  • 大数定律:只要时间足够长,离谱的事情一定会发生
  • 2000-2024年 县域年末金融机构贷款余额、金融机构储蓄存款余额数据 xlsx
  • 如何快速完成微信聊天记录备份:面向普通用户的完整指南
  • 别再纠结了!RTL8367系列五款千兆交换机芯片怎么选?一张图帮你搞定(附硬件开发包获取)
  • 2026广州注册公司靠谱财税公司推荐|本地创业者实测5家优质代办机构 - GrowthUME
  • Sora 2生成电影预告片的底层逻辑(帧间物理引擎+叙事张力算法首次公开)
  • 收藏!普通人也能抓住的AI大模型应用开发机遇,高薪就在眼前!
  • AI写代码真能提效30%?程序员小白必看,收藏这篇避坑指南!
  • 豆包视频去水印方法实测:4款工具横评推荐
  • 基于PyTorch的VGG19图像分类——从CPU到DLP的完整实践
  • 手把手教你学Simulink——电动汽车V2G(车网互动)双向DC-AC充电逆变器建模
  • BG3模组管理器终极指南:5步解决模组冲突,轻松管理《博德之门3》模组
  • 基于Arduino的智能植物监测系统DIY:从传感器到低功耗设计
  • 终极指南:如何用SleeperX彻底掌控Mac睡眠行为
  • P1325 雷达安装【洛谷算法习题】
  • 国内优质砖雕厂家实力排行:工艺与服务全维度对比 - 奔跑123
  • 2026年5月徐州黄金回收哪家好?10家实测+选店避坑全攻略 - 生活测评君
  • Ant Design Pro v6.0.2 发布:升级 antd、新增 AI 辅助升级能力,多项功能改进
  • 基于Arduino与FFT的音频频谱可视化:从原理到实现的完整指南
  • Zabbix监控初步搭建
  • 猫抓浏览器扩展完全指南:告别网页资源获取烦恼