当前位置: 首页 > 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.gsyq.cn/news/1416189.html

相关文章:

  • 推荐1款提升办公效率的神级软件,简真是Windows神器!
  • 2026年4月高架库定做厂家有哪些,自动化立体仓库/高架库/立体仓储/智能仓库/智能仓储/立体仓库,高架库优质厂家推荐 - 品牌推荐师
  • 如何快速完成微信聊天记录备份:面向普通用户的完整指南
  • 收藏!普通人也能抓住的AI大模型应用开发机遇,高薪就在眼前!
  • 豆包视频去水印方法实测:4款工具横评推荐
  • 基于Arduino的智能植物监测系统DIY:从传感器到低功耗设计
  • P1325 雷达安装【洛谷算法习题】
  • 基于Arduino与FFT的音频频谱可视化:从原理到实现的完整指南
  • Zabbix监控初步搭建
  • 2026年5月停车场出入口设备厂家选型攻略|智慧停车采购指南 - TOP10品牌推荐榜单
  • 2026广州白云区注册公司攻略|靠谱财税代办机构TOP5科普推荐 - GrowthUME
  • 基于DLP平台的手写数字分类——CPU到深度学习处理器的加速实践
  • 如何使用Legacy iOS Kit实现旧款iOS设备降级与越狱的完整指南
  • Arduino LED乒乓球游戏:从电路设计到状态机编程的嵌入式开发实践
  • crabc - api 开源项目更名 ApiGo,一站式 API 数据服务平台更新多项功能
  • 求职季必备!这7款AI简历工具,让你的简历匹配度飙升,效率翻倍!
  • 国内钢模板企业排行:5家实力厂商核心能力对比 - 奔跑123
  • 从零开始:用Harepacker复活版轻松打造你的MapleStory专属世界
  • 南沙区拿证效率靠前驾培机构盘点 合规性与速度双维度 - 奔跑123
  • 2026年实测推荐:这5款免费投票工具真正靠谱好用 - 速递信息
  • ICE超声软件性能指标详解:从原理到优化实践
  • 2.HTML表格详解:标签、属性与单元格合并实战
  • BilibiliDown终极指南:三分钟掌握B站视频下载与音频提取技巧
  • 保姆级教程:用OpenWrt无线中继搞定家庭打印和文件共享(附固定IP避坑指南)
  • 解密@AutoConfiguration:SpringBoot自动装配的‘组合拳’与proxyBeanMethods=false的妙用
  • 如何彻底解决ThinkPad风扇噪音问题:3步完成终极智能控制配置
  • 2026安宁市本地人必选的公共卫生检测专业机构TOP5推荐!美容院、足疗店、酒店宾馆卫生检测、许可证办理,正规CMA资质检测公司排名推荐 (2026年5月商铺卫生办证最新深度调研方案) - 一休咨询
  • 如何通过约束设计避免代理过度执行:从AI到工程实践
  • leecodecode【双指针题2】【2026.5.26打卡-java版本】
  • LeetCode 3120.统计特殊字母的数量 I:(手写)哈希表