页面 - 刷新、离开相关事件

本文详细解析了beforeunload、unload及pagehide事件的触发条件、处理函数及浏览器兼容性。探讨了事件处理中如何通过返回值控制用户确认对话框的显示,以及不同浏览器的行为差异。

beforeunload

  • 当浏览器窗口关闭或者刷新时,会触发beforeunload事件。当前页面不会直接关闭,可以点击确定按钮关闭或刷新,也可以取消关闭或刷新。
  • 能够触发请求(谷歌)
  • 如果处理函数为Event对象的returnValue属性赋值非空字符串,浏览器会弹出一个对话框,来询问用户是否确定要离开当前页面(如下示例)。没有赋值时,该事件不做任何响应。
    • 有些浏览器会将返回的字符串展示在弹框里,但有些其他浏览器只展示它们自定义的信息。
// 多内核代码
window.addEventListener("beforeunload", function (e) {
  var confirmationMessage = "\o/";

  (e || window.event).returnValue = confirmationMessage;     // Gecko and Trident
  return confirmationMessage;                                // Gecko and WebKit
});
  • 在此事件处理函数中,对于window.alert(), window.confirm(), 和 window.prompt() 的调用会被忽略。
  • 许多手机浏览器会忽略该事件处理的返回值(亦即,它们不会要求用户确认,而是直接执行操作)

unload

  • 当文档或一个子资源正在被卸载时, 触发 unload事件。
  • 在下面两个事件后被触发:
    • beforeunload (可取消默认行为的事件)
    • pagehide
  • 文档会处于一个特定状态:
    • 所有资源仍存在 (图片, iframe 等.)
    • 对于终端用户所有资源均不可见
    • 界面交互无效 (window.open, alert, confirm 等.)
    • 错误不会停止卸载文档的过程
  • 遵循文档树:父iframe会在子iframe卸载前卸载
  • 事件e包含以下属性
    • target:事件目标(DOM树中最顶层的目标),谷歌中是document节点
    • type:"unload"
    • bubbles:false // 是否正常冒泡
    • cancelable:false // 是否可以取消
  • 关闭浏览器时能触发事件。但是请求无法发起,后端无法拦截到(不是很确定),能够console.log(谷歌)
  • 刷新不会触发(谷歌)
  • 同域跳转页面会被触发,跨域不会(谷歌)

pagehide

  • 当浏览器在会话历史记录中的不同页面切换过程中隐藏当前页面时,将向窗口发送pagehide事件。例如,当用户单击浏览器的“后退”按钮时,当前页面在显示上一页之前会收到一个pagehide事件。
  • 谷歌支持该事件

转载于:https://www.cnblogs.com/qq3279338858/p/10694671.html

### Vue.js 监听浏览器刷新事件的实现方式 在 Vue.js 中,监听浏览器刷新事件通常通过 `beforeunload` 事件来实现。以下是几种常见的实现方法: #### 方法一:使用 `beforeunload` 事件 可以在组件生命周期钩子 `mounted` 和 `destroyed` 中分别绑定和移除 `beforeunload` 事件监听器。 ```javascript export default { mounted() { window.addEventListener('beforeunload', this.handleBeforeUnload); }, beforeDestroy() { window.removeEventListener('beforeunload', this.handleBeforeUnload); }, methods: { handleBeforeUnload(event) { event.preventDefault(); event.returnValue = ''; // 兼容某些浏览器 console.log('页面即将刷新或关闭'); } } }; ``` 此方法可以捕获到用户的操作行为并执行相应的逻辑[^2]。 --- #### 方法二:结合 `performance.navigation.type` 判断刷新或关闭 为了进一步区分是页面刷新还是关闭,可以利用 `performance.navigation.type` 属性进行判断。 ```javascript if (performance.navigation && performance.navigation.type === 1) { console.log('这是一个刷新页面的操作'); // 页面刷新 } else { console.log('这是其他类型的导航操作'); // 页面加载或其他情况 } ``` 需要注意的是,在现代浏览器中,`performance.navigation` 已被废弃,建议改用 `PerformanceNavigationTiming` 接口替代[^1]。 --- #### 方法三:全局注册事件监听器 如果希望在整个应用范围内监听刷新事件,可以直接在入口文件(如 `main.js` 或 `App.vue` 的根实例)中设置监听器。 ```javascript // main.js window.addEventListener('beforeunload', function (event) { const confirmationMessage = '您确定要离开吗?'; event.returnValue = confirmationMessage; return confirmationMessage; }); ``` 这种方式适用于不需要动态解绑的情况,但如果需要更灵活的控制,则推荐在具体组件中处理[^4]。 --- #### 方法四:基于路由守卫增强体验 当涉及特定路由下的刷新检测时,可结合 Vue Router 提供的导航守卫功能完成定制化需求。 ```javascript router.beforeEach((to, from, next) => { if (from.name !== to.name) { console.log('切换到了新的路由'); } else { console.log('可能发生了页面刷新'); } next(); }); ``` 这种方法特别适合用于复杂业务场景下对用户交互行为的精细化管理[^5]。 --- ### 注意事项 - 使用 `beforeunload` 事件时需注意兼容性问题以及返回值的要求。 - 如果仅依赖前端手段难以满足实际需求,还可以考虑配合服务端记录状态等方式补充完善逻辑。 - 对于老旧 API 如 `performance.navigation` 应及时迁移到最新标准以保障跨平台稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值