页面不可见时触发事件

应用场景:页面进入后台时暂停背景音乐,再次进入时重新播放

load()方法可以加在body onload事件中,也可以等页面加载完成后执行

var hidden, visibilityChange;

function load()
{
    if (typeof document.hidden !== "undefined") {
        hidden = "hidden";
        visibilityChange = "visibilitychange";
    } else if (typeof document.mozHidden !== "undefined") {
        hidden = "mozHidden";
        visibilityChange = "mozvisibilitychange";
    } else if (typeof document.msHidden !== "undefined") {
        hidden = "msHidden";
        visibilityChange = "msvisibilitychange";
    } else if (typeof document.webkitHidden !== "undefined") {
        hidden = "webkitHidden";
        visibilityChange = "webkitvisibilitychange";
    }
    document.addEventListener(visibilityChange, function () {
        console.log("当前页面是否被隐藏:" + document[hidden]);
        if (document[hidden])
            $("#_wxbgm")[0].pause();
        else
            $("#_wxbgm")[0].play();
    }, false);
}

 

转载于:https://www.cnblogs.com/stubborn-donkey/p/10249411.html

<think> 首先,用户查询是:“我想查找页面刷新触发的 window 事件 请问页面刷新触发的 window 事件有哪些”。意思是他们想知道在页面刷新触发的 window 事件。 从系统级指令,我需要: - 所有行内数学表达式使用 `$...$` 格式(但这个问题涉及数学,所以可能需要)。 - 独立公式使用 `$$...$$`(同样,可能需要)。 - LaTeX 语法正确(适用于任何数学部分)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如 [^1]。 用户提供了几个引用: - 引用 [1]: 讨论了 `window.onbeforeunload` 事件,用于页面关闭触发。它区分了刷新和关闭的同情况。 - 引用 [2]: 提到了 `window.onpopstate`, `window.history.pushState`, `window.history.replaceState`, `window.onpageshow`, `visibilitychange`。 - 引用 [3]: 类似引用 [1],使用 `onbeforeunload` 来检测关闭并刷新原页面。 - 引用 [4]: 也提到了使用 `event.clientX` 等来检测关闭事件。 用户说:“上述引用仅供参考,并是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但我没有看到上一次的问题或回答。这可能是一个新对话的开始。 用户需求是“页面刷新触发的 window 事件有哪些”,所以我需要专注于刷新事件,而是关闭事件。 关键事件: - `beforeunload`: 在页面卸载前触发,包括刷新和关闭。 - `unload`: 在页面卸载触发,但现代浏览器限制其使用。 - `pageshow`: 当页面显示触发,包括初始加载和从缓存中恢复(如后退/前进导航)。 - `load`: 当页面加载完成触发,包括刷新。 - 另外,`DOMContentLoaded` 在初始 HTML 文档被加载和解析完成后触发包括样式表、图像等。 对于刷新: - 当用户刷新页面,`beforeunload` 会触发,因为它发生在页面卸载前。 - `unload` 也会触发,但通常推荐使用。 - 当页面重新加载后,`load` 事件会再次触发。 - `pageshow` 事件也会触发,特别是如果页面是从缓存中恢复。 从引用 [2] 中提到了 `window.onpageshow` 和 `visibilitychange`,但 `visibilitychange` 是当页面可见性改变触发,比如当标签页切换是专门针对刷新的。 用户指定的“刷新触发”,所以我应该列出在刷新过程中触发事件。 主要事件: 1. **beforeunload**: 在页面卸载前触发,包括刷新和关闭。可以用于提示用户保存数据。 2. **unload**: 在页面卸载触发。但现代浏览器中,操作有限。 3. **DOMContentLoaded**: 在页面解析完成后触发,包括刷新。 4. **load**: 在页面所有资源加载完成后触发,包括刷新。 5. **pageshow**: 当页面加载或从缓存中恢复触发。它有一个 `persisted` 属性,如果从缓存加载则为 true。 在刷新: - 用户点击刷新或按 F5/Ctrl+R : - `beforeunload` 触发(卸载前)。 - 然后页面卸载。 - 然后页面重新加载。 - `DOMContentLoaded` 触发(解析完成)。 - `load` 触发(所有资源加载)。 - 如果使用了后退/前进缓存 (bfcache),`pageshow` 和 `pagehide` 可能触发,但对于硬刷新(如 Ctrl+F5),缓存可能被绕过。 用户引用的内容主要关注 `onbeforeunload` 并使用事件属性来区分刷新和关闭。例如: - 在引用 [1] 中,它检查 `event.clientX > document.body.clientWidth && event.clientY < 0` 或 `event.altKey` 来检测关闭。 - 类似地,在引用 [4]。 但用户说那些是真正需求;他们想知道刷新事件。 所以,我应该直接回答核心问题。 列出刷新触发的 window 事件: - `beforeunload` - `unload` (谨慎使用) - `DOMContentLoaded` (刷新后) - `load` (刷新后) - `pageshow` (如果从缓存加载) 另外,`visibilitychange` 是直接针对刷新;它在标签页隐藏或显示触发。 在回答中,我需要使用中文。 结构回答: 1. 简要介绍页面刷新事件。 2. 列出主要事件,并解释每个事件在刷新过程中的角色。 3. 参考提供的引用,自然地添加引用标识。 4. 生成相关问题。 参考引用: - 引用 [1] 提到了 `onbeforeunload`,区分刷新和关闭 [^1]。 - 引用 [2] 提到了 `onpageshow` [^2]。 - 引用 [3] 也用了 `onbeforeunload` [^3]。 - 引用 [4] 类似 [^4]。 在回答中,当提到这些事件,添加引用。 例如: - 当页面刷新,`beforeunload` 事件会在页面卸载前触发 [^1][^3][^4]。 - `pageshow` 事件页面显示触发,包括刷新后 [^2]。 生成相关问题: - 例如: 1. 如何区分页面刷新和关闭? 2. 页面加载还有哪些事件? 3. 如何阻止用户在刷新丢失数据? 确保回答真实可靠。 最终回答大纲: - 开头:总结刷新事件。 - 详细列出事件: - beforeunload - unload - DOMContentLoaded - load - pageshow - 解释每个事件。 - 添加引用。 - 结束。 - 相关问题。 </think> 根据您的查询,页面刷新(如按 F5 或 Ctrl+R 键)触发的 window 事件主要包括几个关键事件。这些事件发生在页面卸载前(刷新启动)和页面重新加载后(刷新完成)。以下我将以清晰结构逐步解释每个事件的作用、触发机和注意事项。参考了您提供的站内引用内容,我会自然地添加引用标识。 ### 页面刷新触发的 window 事件列表 当用户刷新页面,浏览器会触发一系列事件,部分事件在卸载前(刷新启动阶段)触发,部分在重新加载后(刷新完成阶段)触发。以下是主要事件: 1. **`beforeunload`**: - **触发机**: 在页面卸载前触发,包括刷新、关闭或导航到其他页面。可用于提示用户保存数据或执行清理操作。 - **特点**: 可以通过事件属性(如 `event.clientX` 或 `event.altKey`)区分刷新和关闭行为(例如,刷新 `event.clientX` 通常满足关闭条件)[^1][^3][^4]。 - **示例代码**: ```javascript window.addEventListener('beforeunload', function(event) { // 区分刷新和关闭的逻辑(仅供参考) if (event.clientX > document.body.clientWidth && event.clientY < 0 || event.altKey) { // 关闭触发(如点击[X]按钮或Alt+F4) } else { // 刷新触发(如F5键) console.log('页面刷新中,数据可能丢失'); } event.preventDefault(); // 阻止默认关闭提示 }); ``` 2. **`unload`**: - **触发机**: 在页面卸载触发,紧随 `beforeunload` 之后。适用于资源释放,但现代浏览器(如Chrome)限制其使用,因为它可能阻塞刷新过程。 - **特点**: 推荐用于关键操作,因为浏览器可能忽略其回调中的异步代码。刷新它会触发,但效果有限[^1][^2]。 - **示例代码**: ```javascript window.addEventListener('unload', function() { // 简单清理操作(如发送日志) }); ``` 3. **`DOMContentLoaded`**: - **触发机**: 在页面HTML文档解析完成后触发(重新加载后),等待样式或图像加载。刷新每次都会触发。 - **特点**: 适用于初始化DOM操作(如绑定事件),速度快于 `load` 事件[^2]。 - **示例代码**: ```javascript document.addEventListener('DOMContentLoaded', function() { console.log('DOM解析完成,页面已刷新'); }); ``` 4. **`load`**: - **触发机**: 在页面所有资源(图像、脚本等)加载完成后触发(重新加载后)。初始化刷新触发,但刷新完成后会触发。 - **特点**: 用于执行依赖完整资源的代码(如渲染图表),但可能受缓存影响[^2]。 - **示例代码**: ```javascript window.addEventListener('load', function() { console.log('页面完全加载,刷新完成'); }); ``` 5. **`pageshow`**: - **触发机**: 在页面显示触发,包括刷新后或从浏览器缓存(如后退/前进导航)恢复。 - **特点**: 通过 `event.persisted` 属性检查是否从缓存加载(刷新通常为 `false`)。更适合处理缓存相关场景[^2]。 - **示例代码**: ```javascript window.addEventListener('pageshow', function(event) { if (event.persisted) { console.log('从缓存恢复'); } else { console.log('普通刷新完成'); } }); ``` ### 重要注意事项 - **刷新 vs. 关闭的区分**: 如引用所述,`beforeunload` 事件中可使用 `event.clientX` 或 `event.altKey` 来尝试区分刷新和关闭行为(刷新 `event.clientX` 通常超边界)[^1][^4]。但这在同浏览器中可能一致,建议测试兼容性。 - **事件顺序**: 刷新的典型事件顺序为 `beforeunload` → `unload` → (页面重载) → `DOMContentLoaded` → `load` → `pageshow`。 - **性能影响**: 避免在 `beforeunload` 或 `unload` 中执行耗操作,否则会延迟刷新过程。 - **参考局限性**: 您提供的引用主要关注关闭事件(如 `onbeforeunload` 的区分逻辑)。但对于刷新,核心事件是 `beforeunload`(启动)和 `load`/`pageshow`(完成后)。`visibilitychange`(页面可见性变化)事件直接针对刷新,仅在标签切换触发[^2]。 - **最佳实践**: 对于数据保存,优先使用 `beforeunload`;对于刷新后初始化,优先使用 `DOMContentLoaded` 或 `pageshow`。 ### 相关问题 基于您的查询,我生成了以下相关问题,帮助深入理解: 1. 如何准确区分页面刷新和页面关闭事件? 2. 页面加载(首次访问或刷新),`DOMContentLoaded` 和 `load` 事件有什么区别? 3. 浏览器缓存(如 bfcache)如何影响刷新事件的处理? 如果您需要代码示例优化或更多事件细节,请随补充说明!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值