javascript中通过window对象的focus和blur事件监听浏览器窗口焦点变化,推荐使用addeventlistener绑定以支持多监听器和便于解绑,事件仅响应窗口级焦点切换而非元素级操作。

JavaScript 中通过 BOM 的 window 对象监听浏览器窗口的获得与失去焦点,主要使用 onfocus 和 onblur 事件。这两个事件触发时机明确、兼容性好,无需额外依赖,直接在全局作用域操作即可。
窗口焦点事件的基本用法
窗口级焦点事件绑定在 window 对象上,不是某个具体元素:
- onfocus:当浏览器标签页被用户切换回来、或窗口从后台激活时触发(即页面“获得焦点”)
- onblur:当用户切换到其他标签页、最小化窗口、或点击地址栏等导致当前页面“失去焦点”时触发
示例代码:
window.onfocus = function() {
console.log('页面已获得焦点');
};
window.onblur = function() {
console.log('页面已失去焦点');
};
推荐使用 addEventListener 绑定
相比直接赋值 onfocus/onblur,更推荐用 addEventListener,原因包括:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 支持为同一事件添加多个监听器,不会相互覆盖
- 便于后期用
removeEventListener移除,避免内存泄漏 - 符合现代事件处理规范,结构更清晰
写法示例:
const handleFocus = () => console.log('窗口获得焦点');
const handleBlur = () => console.log('窗口失去焦点');
window.addEventListener('focus', handleFocus);
window.addEventListener('blur', handleBlur);
// 如需解绑(例如组件卸载时)
// window.removeEventListener('focus', handleFocus);
// window.removeEventListener('blur', handleBlur);
注意 focus/blur 的触发边界
这些事件只响应**整个窗口级焦点状态变化**,不是鼠标移入/移出:
- 用户点击页面内某个 input 并聚焦,不会触发 window.onfocus(因为窗口本来就有焦点)
- 只有切换标签页、Alt+Tab 切换应用、点击浏览器地址栏等导致窗口整体失焦时,才会触发
blur - 从其他程序切回浏览器,且目标是当前页面标签,才触发
focus
如果需要监听某个输入框的聚焦/失焦,应使用该元素自身的 focus 和 blur 事件,而非 window 上的。
常见实际用途
利用窗口焦点状态可实现一些轻量但实用的功能:
- 暂停/恢复轮播图或定时动画(失焦时暂停,获焦时继续)
- 检测用户是否离开页面,用于提醒未保存表单(配合
beforeunload更稳妥) - 优化资源消耗:失焦时暂停非关键请求或日志上报
- 播放音频前检查是否在前台(部分浏览器限制后台自动播放)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










